WHEN Klausel wie übergeben?

Moderator: Moderatoren

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

WHEN Klausel wie übergeben?

Beitrag von Manfred »

Ich möchte mir gerne Methoden bauen, die mir etliche Aufbauarbeiten für die Bildschirmmaske abnehmen. Jetzt habe ich mir eine Pushbuttonmethode gebaut, bei der ich aber nicht so richtig weiß, wie ich die When und Action Bedingungen als Parameter übergeben müß.

Code: Alles auswählen

METHOD mk_dialog:erzeugeAbZuButton(getlist,wennZuBedingung,wennAbBedingung,Action1,Action2)
       ::nOben := 200
       @ ::nOben,2 DCPUSHBUTTON;
                        ACTION Action1;
                        CAPTION "<";
                          CARGO "AN";
                         OBJECT ::oPbZu;
                         PARENT ::oRahmenAbZu;
                           SIZE 30,::nPbHoehe;
                           WHEN wennZuBedingung
       ::nOben += ::nPbHoehe + 5
       @ ::nOben,2 DCPUSHBUTTON;
                        ACTION action2;
                        CAPTION ">";
                          CARGO "AN";
                         OBJECT ::oPbAb;
                         PARENT ::oRahmenAbZu;
                           SIZE 30,::nPbHoehe;
                           WHEN wennAbBedingung
RETURN self
die methode wird aufgerufen aus einer Klasse, die von mk_dialog erbt. Also dürfte ich ja nur self übergeben, weil innerhalb der aufgerufenen methode die Klasse nicht bekannt ist. Das will die Methode aber nicht Aber generell erstmal würde mir schon helfen, was ich für ACTION und WHEN wie übergeben muß. Einen Codeblock?, Einen String, der dann in einen Codeblock gepackt wird in der Methode? Irgendwie klappt das alles nicht so einfach, wie ich es mir vorgestellt hatte.
Aufgerufen werden soll die Methode so:

Code: Alles auswählen

oDialogZusatz:erzeugeAbZuButton(getlist,Len(oDialogZusatz:aZertifikateAuswahl) > 0,! (oDialogZusatz:oZertifikate2Monteur:nArea)->(Eof()),keineAhnung,keineahnung)
Wie gesagt, der oDialogZusatz erbt von mk_dialog und müßte ja eigentlich nicht davorstehen. Aber weder so noch anders klappt es.
Eigentlich müßte das ja unter DataDriven fallen!?
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
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Koverhage »

Das Klassengdönse
aber hier ACTION und WHEN müssen TRUE oder FALSE zurückgeben
also Beispiel:

ACTION {|| tueetwas() } WHEN {|| lShowit}

Code: Alles auswählen

function Tueetwas()
lShowit := .F:
IF ...
   lShowit := .T.
ENDIF
Return lShowit
Nach dem ACTION solltest Du einen GETREFRESH machen.
Gruß
Klaus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

Hi Klaus,
das klingt aber sehr herablassend "Klassengedönse" :lol:
Ich weiß, was erwartet wird. Aber nur .T. oder .F. bringen es nicht. Ich muß es ja abhängig machen vom allgemeinen Ablauf. Und normalerweise stehen da bei mir Bedingungen oder Funktionen drin. Die will/muß ich an die Methode (könnte auch eine Fun ktion sein. Ist es aber hier jetzt nicht) übergeben. Hatte ich aber auch erwähnt. :wink:
Action und When erwarten ja einen Codeblock. Den zu übergeben habe ich versucht. KLappte aber nicht so, wie ich es gemacht habe. Iregdwas muß da wohl beachtet werden, was ich nicht richtig mache. In Deinem beispiel müßte ich halt die Funktion tueetwas() als para übergeben. Aber das will dann Action nicht verarbeiten.
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
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Wolfgang Ciriack »

Deine Parameter wennZuBedingung,wennAbBedingung sollten genauso Codeblöcke sein, wie deine Action Parameter.
Dann sollte es auch klappen. Wichtig ist nur, dass deine "wenn..." Codeblöcke einen logischen Wert zurückgeben.
Viele Grüße
Wolfgang
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Jan »

Koverhage hat geschrieben: Do, 09. Nov 2017 7:44Das Klassengdönse
Bruder im Geiste ... :lol: :lol: :lol: :lol: :lol: :lol:

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: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

Hallo Wolfgang,
das ist mir schon klar, aber was übergebe ich und wie übernehme ich das dann ? Ich habe einen Codeblock übergeben und den hinter When geschrieben, ich habe einen String übergeben und den in einen Codeblock geschrieben. Ich habe es mit dem makrooperator probiert, mit Eval() usw. Es wird immer self als unbekannt angemeckert bei der Erzeugung in DCGUI READ. Naja, ich warte mal Samstag ab, dann treffe ich ja den "schlauen Martin" :badgrin: und der wird sicherlich was dazu sagen können. Ist bestimmt wieder nur was ganz blödes. Wie immer.
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Tom »

Einfach als Codeblock übergeben, ohne Stringkonvertierungen oder ähnlichen Murks. Codeblöcke werden erst während der Ausführung evaluiert. Das ganze Gedöns mit Stringumwandlungen usw. macht man deshalb vor allem, wenn man in Iterationen operiert, um Codeblöcke zu erzeugen, und in den Codeblöcken auf die eigentlich iterierenden Variablen (Zähler) zugreifen will. Das willst Du ja vermutlich nicht, sondern mit statischen Blöcken dynamisch Objekte erzeugen. Da übergibt man die einfach:

Code: Alles auswählen

ErzeugeButton(cCaption,bAction,bWhen)
- oder direkt

Code: Alles auswählen

ErzeugeButton('Test',{||MsgBox('test')},{||.T.})
. Feddisch.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

OK, machen wir es mal andersherum.
So würde es aussehen wenn ich es "fest verdrahten" würde. So klappt es auch.

Code: Alles auswählen

METHOD mk_dialog:erzeugeAbZuButton(getlist)
        ::nOben := 200
       @ ::nOben,2 DCPUSHBUTTON;  
     		 ACTION {|| ::zuAb("ZU",getlist)};
                        CAPTION "<";
                          CARGO "AN";
                         OBJECT ::oPbZu;
                         PARENT ::oRahmenAbZu;
                           SIZE 30,::nPbHoehe;
                           WHEN {||Len(::aZertifikateAuswahl) > 0}
       ::nOben += ::nPbHoehe + 5
       @ ::nOben,2 DCPUSHBUTTON; 
                         ACTION {|| ::ZuAb("AB",getlist)};
                        CAPTION ">";
                          CARGO "AN";
                         OBJECT ::oPbAb;
                         PARENT ::oRahmenAbZu;
                           SIZE 30,::nPbHoehe;
                           WHEN {||! (::oZertifikate2Monteur:nArea)->(Eof())} 
RETURN self
wenn ich jetzt aber WHEN und ACTION als Parameter neben getlist angeben wollte, was müßte ich dann tun. Wenn ich mit Parametern arbeite, dann meckert das programm es kennt self nicht.
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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Martin Altmann »

Aus Toms Beispiel würdest Du dann &bAction bei :Action und &bWhen bei :When stehen haben.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

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

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

hm, ich meine das habe ich so schon mal gehabt. Muß ich nochmal prüfen.....
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Tom »

Mit welchen Parametern?

Wenn ich einen Codeblock erzeuge, passiert mit dem erst einmal überhaupt nichts:

Code: Alles auswählen

bBlock := {|o|o:GurkenDings()}
Wenn ich den an eine Funktion übergeben, auch nicht:

Code: Alles auswählen

MeinZeug(bBlock) // geht
Und wenn ich ihn darin anfasse, ohne ihn auszuwerten, auch nicht:

Code: Alles auswählen

FUNCTION MeinZeug(bB)
MsgBox(Var2Char(bB)) // Messagebox mit "{|o|o:GurkenDings()}"
RETURN NIL
Dasselbe gilt für die self-Referenzen. Erst wenn ein Codeblock ausgewertet/evaluiert wird, wird auch geprüft, ob die Referenzen darin gültig sind.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Tom »

Hä, Martin? Ich übergebe einen Codeblock in einer Variablen oder direkt. Wozu darauf den Makroexpander anwenden? :shock:
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Martin Altmann »

Suppenkoma - waren gerade lecker Essen...
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

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

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

Tom, das habe ich auch so gedacht. Mit Parametern meine ich natürlich, wenn ich die methode aufrufe und dann die PARAMETER übergebe, die ich in Action und When schreibe. Aber in dem Moment, wenn die DCGUI READ Section durchlaufen wird, meckert das Programm es kennt self nicht. Ich muß das gleich nochmal in Ruhe teesten. Oder Samstag....
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Tom »

Das Problem scheint mir auch ein anderes zu sein. Manfred will da ein Kommando aus eXpress++ verwenden, um den Pushbutton zu erzeugen. Aus diesem Code wird ja ein ganz anderer Code, nachdem der PP da drübergelaufen ist und DCDIALOG.CH angewendet hat. Es werden Referenzen zur GetList hinzugefügt, die beim Auswerten der GetList später nicht mehr bekannt sind - und dort kracht es dann auch. Das wird so nicht gehen.

Einfach gesagt:

Code: Alles auswählen

oDings:MeinButton(GetList,bReferenz)
DCPUSHBUTTON ... ACTION bReferenz
...

wird übersetzt zu:

Code: Alles auswählen

oDings:MeinButton(GetList,bReferenz)
aAdd(GetList,Riesenschnullbulli Blabla bReferenz)
Die Getlist wird später im DCREAD ausgewertet, aber da ist "bReferenz" nicht mehr bekannt - und ihr Inhalt auch nicht.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

Echt? So ein Mist.... Und es sah so schon umweltfreundlich aus. Jede menge Code weniger....
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: WHEN Klausel wie übergeben?

Beitrag von Tom »

Es ginge mit detached locals oder dann tatsächlich in Strings konvertierten Codeblöcken, die dann aber keine LOCAL-Referenzen enthalten dürften.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: WHEN Klausel wie übergeben?

Beitrag von Manfred »

wobei mir gerade etwas einfällt. Kann man da nicht mit Trick 17 dran gehen? Den Action BLOCK kann ich doch über den :activate Slot "nachrüsten", oder nicht? Würde das auch über den WHEN Block gehen?
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
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: WHEN Klausel wie übergeben?

Beitrag von AUGE_OHR »

hi

bin ja kein aktiver Express++ User ... aber wenn ich das richtig verstehe soll WHEN ein logischen Wert "zurückgeben".
es wird also nicht wie bei o:activate eine "Aktion ausgeführt" obwohl ja beide Codeblock mit EVAL() arbeiten.

"self" als Parameter in einem Codeblock zu übergeben kann zu "Missverständnissen" führen weil "self" auch immer als 3th Parameter zwischen den |x1,x2,self| steht und es bei Express++ evtl. im Source stehen "könnte".

wie Tom schon erwähnte wären detached Local, also eine FUNCTION() zu benutzen um ein Codeblock zusammen zu stellen, die normale Lösung. (was mit Express++ wohl "so" hier nicht geht)

---
angenommen man würde eine PRIVATE nehmen ... (was wir natürlich nicht wollen)
---

wir waren ja bei einer FUNCTION angekommen und ich habe ja schon öfter von "Summer93" erzählt was aus den PRIVATE eine FUNCTION macht. nun kann man durchaus "self" mit einer solchen Function "speichern" und wieder "aufrufen" (solange das Object "lebt"). auch eine "Kopie" der GetList ist kein Problem.

Code: Alles auswählen

   SP_GET( getlist )
   SP_Zert( Len(::aZertifikateAuswah l)


   ACTION {|| ::zuAb("ZU", SP_GET() )};
   ..
   WHEN {|| SP_Zert() > 0}


FUNCTION SP_GET(xValue)
STATIC oGet := {}
   IF PCOUNT() > 0
      oGet := ACLONE(xValue)
   ENDIF
RETURN oGet
durch das ACLONE() wäre das Array auch "später" noch vorhanden.
gruss by OHR
Jimmy
Antworten