MenuBar addItem mit parameterabhängigem FunktionsAufruf

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Hallo Xbase-Gurus!


Ich versuch mit verschiedenen Funktionen eine MenuBar aufzubauen. Eine Funktion übernimmt 0 (Null) bis 3 (drei) Parameter.
Mit Clipper wurden dann in einer CASE-Struktur abhängig von der Anzahl der übernommenen Parameter PCOUNT() die betreffenden
Unterfunktionen aufgerufen und die entsprechenden Parameter weitergegeben:

Code: Alles auswählen

FUNCTION Funktion(Par1,Par2,Par3)

DO CASE

    CASE PCOUNT()=0
        SubFunktion()

    CASE PCOUNT()=1
        SubFunktion(Par1)

    CASE PCOUNT()=2
        SubFunktion(Par1,Par2)

    CASE PCOUNT()=3
        SubFunktion(Par1,Par2,Par3)

ENDCASE

RETURN
In Xbase++ ist mir noch kein anderer Ansatz in den Sinn gekommen, als ineinander verschachtelte IIF-Strukturen im CodeBlock von addItem.

oMenu:ADDITEM({"Tu dies",{¦¦IIF(PCOUNT()<1,SubFunktion(),IIF(PCOUNT()<2,SubFunktion(Par1),IIF(PCOUNT()<3,SubFunktion(Par1,Par2),SubFunktion(Par1,Par2,Par3))))}})

Ganz bestimmt hab ich jetzt im Beispiel hinten zu wenig oder zuviel Klammern gesetzt - jedenfalls - das kanns ja nicht sein - ich bin überzeugt, dass jemand
einen eleganteren Ansatz hat, oder muss ich tatsächlich umschulen und Landschaftsgärtner werden, wie es mir meine Eltern immer angedroht haben...?

Herzliche Grüsse
Euer GrillenHirni
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Tom »

Code: Alles auswählen

FUNCTION Funktion(Par1,Par2,Par3)
DEFAULT cPar1 := <defaultwert1>, cPar2 := <defaultwert2>, cPar3 := <defaultwert3>
SubFunktion(Par1,Par2,Par3)
RETURN nil
Damit wird "SubFunktion" immer mit drei Parametern aufgerufen, die Du in "Funktion" mit Defaultwerten bestücken kannst. "SubFunktion" sollte darauf dann natürlich entsprechend reagieren; vermutlich gibt es dort auch diverse PCount()-Abfragen, die dann natürlich nicht mehr funktionieren. Also solltest Du dort auch so verfahren.
Herzlich,
Tom
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Ui - vielen Dank Tom für die fixe Antwort...!!

Das würde bestimmt funktionieren.

Da müsste ich aber in hunderten oder möglicherweise über tausend AuswahlMenüs und den darin aufgerufenen
Funktionen die initialisierten ParameterVariabeln abfangen - die betreffenden Menüs wurden in Clipper mit einem
selbstentwickelten CASE-Tool generiert...

Falls es eine Möglichkeit gäbe, würde ich es darum schon vorziehen, wenn ich die SubFunktionen von der Anzahl der übernommenen
Parameter abhängig und in entsprechenden CodeBlöcken mit oMenu:addItem aufrufen könnte...

Trotzdem bin ich ermutigt und habe das Praktikum in der LandschaftsGärtnerei grad abgesagt...

Herzlich...!
GrillenHirni
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Manfred »

Hi,

und wenn Du jetzt noch so freundlich wärst Deinen Vornamen zu nehmen und nicht den, der an einen Landschaftsgärtner erinnert, würden wir hier sicherlich alle strahlen wie die Dreckeimer :wink:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Halo Manfred...!

Ich bitte um Entschuldigung - ich bin ganz neu hier und kenne die Sitten hier auch nicht.

Vorname ist aber kein Problem - meine Freunde würden mich Pit nennen, wenn ich
Freunde hätte...

Meine Eltern haben mich aber GrillenHirni getauft... Das ZiviliStandsAmt wollte den
Eintrag verweigern, aber wo sie mich gesehen haben, haben sie gesagt, es sei voll ok...

Herzlich...
GrillenHirni
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Manfred »

Hi,

keine Bange, wir nehmen das nicht so genau. Nur, da wir hier recht "familiär" sind und sich auch etliche persönlich kennen, ist es immer schön, wenn man zumindest einen Vornamen hat, mit dem man sich ansprechen kann.

Ich schrieb ja auch, das wir uns freuen würden.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Jan »

GH: Bist Du nicht für eine Umschulung etwas zu alt? OK, für zurück zur Natur ist es ja nie zu spät :-D

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Lieber Manfred...

Ich wollte eben nicht in ein FettNepfchen treten mit dem Vornamen... Du kannst mich also auch Pit nennen, wenn Du möchtest...

Und es freut mich total wenn Ihr Euch freut...!!

Das Einzige, was meine Freude jetzt noch trübt, ist der Umstand, dass ich zu blöde bin, in einem CodeBlock eine SubFunktion aufzurufen,
welche die gleiche Anzahl Parameter weitergibt, welche die aktuelle Funktion variabel übernommen hat.

Grüsse von hier aus...!
GrillenHirni
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Hallo Jan...!

Du hast recht - das mit der Umschulung hätte wahrscheinlich nicht mehr geklappt...

Wenn ich also keine Hilfe krieg mit diesem CodeBlock-Problem und ich mich nicht
ab dem ersten des nächsten Monats vom programmieren ernähren kann, dann
kann ich mir nur noch überlegen, wie ich in den Knast komm - alternativ zu meinem
ParameterProblem bin ich in dem Fall für entsprechende Tipps dankbar...

Herzlich...
GrillenHirni
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Jan »

Pit,

das ist absolut ungetestet und ins Blaue. Aber was ist, wenn Du die vier Funktionsaufrufe in ein Array packst, und dann den Aufruf machst aFunktionen[PCount() + 1]? Garantiert wird das nicht so einfach gehen, aber es wäre eventuell ein Ansatz.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Manfred »

Hi,

ich kann Deine Probleme gut nachvollziehen, was Codeblöcke angeht.

Aber mach doch mal folgendes:

1) benutze entweder die Suchfunktion mit Codeblock als Kriterium (1017 Treffer), oder
2) eröffne eine neuen Thread im passenden Thema und stelle einfach eine Frage.

Ich denke, dass wird Dich verdammt schnell ans Ziel bringen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Hallo Jan -

danke für den Tipp... Genau so in die Richtung hab ich auch schon versucht, Visionen zu entwickeln...

Da ich noch unsicher bin mit diesen Xbase-Objekten im allgemeinen und den Parametern in CodeBlöcken
im speziellen, ist Dein Tipp für mich ein wertvoller Hinweis - ich werd gerne mal versuchen, einen entsprechende
Prototypen zu basteln - also vielen Dank!

Grilli
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Tom »

Jan -

Du meinst so etwas?

Code: Alles auswählen

FUNCTION Funktion(Par1,Par2,Par3)
LOCAL aCalls := {}
aAdd(aCalls,{||SubFunktion()})
aAdd(aCalls,{||SubFunktion(cPar1)})
aAdd(aCalls,{||SubFunktion(cPar1,cPar2)})
aAdd(aCalls,{||SubFunktion(cPar1,cPar2,cPar3)})

Eval(aCalls[PCount()+1])
RETURN nil
Ansonsten sehe ich keinen Ausweg, wenn in den aufgerufenen Funktionen nichts geändert werden soll. Vielleicht solltest Du Dich mal mit der Funktion PValue() auseinandersetzen, Grillenhirni. Damit kann man Funktionen, die überhaupt keine eigene Parameterliste haben, mit beliebig vielen Parametern verwenden.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Tom »

Das hier funktioniert jedenfalls:

Code: Alles auswählen

function main()
test()
test('a')
test('a','b')
return nil

function test(cP1,cP2)
LOCAL aCalls := {}
aAdd(aCalls,{||SubTest()})
aAdd(aCalls,{||SubTest(cP1)})
aAdd(aCalls,{||SubTest(cP1,cP2)})
Eval(aCalls[PCount()+1])
return nil

function SubTest(cP1,cP2)
do case
  case PCount()=0
	? 'null'
  case PCount()=1
	? 'eins'
  case PCount()=2
	? 'zwei'
endcase
return nil
Herzlich,
Tom
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Hallo Tom...

Das sind ja super Tipps - ist für mich völliges Neuland und werde ich
gerne versuchen...!!

Wenn das funktioniert, dann ist es aus GrillenHirni-Sicht genial...

Ich hab noch Bedenken, weil ich ja den CodeBlock der MenuBar
nicht selber mit EVal aufrufe...

Aber versuchen muss ich das unbedingt...

Also danke, danke, danke...!
GrillenHirni
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von Tom »

Man kann auch noch mit Detached Locals arbeiten, oder die Parameter in PRIVATEs umwandeln und sich einen Codeblock bauen, der dann evaluiert wird.

Code: Alles auswählen

function main()
test()
test('a')
test('a','b')
return nil

function test(cP1,cP2)
cP1asPrivate := cP1
cP2asPrivate := cP2
bBlock := &("{||SubTest("+IF(PCount()>=1,"cP1asPrivate","")+IF(PCount()=2,",cP2asPrivate","")+")}")
Eval(bBlock)
return nil

function SubTest(cP1,cP2)
do case
  case PCount()=0
	? 'null'
  case PCount()=1
	? 'eins'
  case PCount()=2
	? 'zwei'
endcase
return nil
"SubTest" darf dann keine STATIC FUNCTION sein. Die Parameter müssen in PRIVATEs umgeschaufelt werden, weil sie sonst innerhalb der Makroevaluierung nicht gefunden werden.
Herzlich,
Tom
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Re: MenuBar addItem mit parameterabhängigem FunktionsAufruf

Beitrag von GrillenHirni »

Hallo Tom...

Du scheinst mein Problem voll erkannt zu haben -
in welche von Deinen Vorschlägen soll ich zuerst
investieren...?

Bei der letzten seh ich so spontan, dass dort
der Block ganz normal evaluiert wird und somit
wahrscheinlich auch von dem Menu-Objekt ganz
normal verarbeitet wird, ohne dass ich mit irgendeinem
Zusatzkrampf noch die Evaluation des Blocks beeinflussen
muss, oder sehe ich das falsch...?

Grilli
Antworten