XbpSLE übergibt Variable nicht

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

XbpSLE übergibt Variable nicht

Beitrag von vorti »

Hallo,
ich hab mal wieder ein Brett vorm Kopf.
Woran liegt es, dass das oXbp die Variable nicht übergibt?

Code: Alles auswählen

oXbp := XbpSLE():new( drawingArea, , { 40, 45 }, { 120, 30 }, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
oXbp textbaustein:tabStop      := .t.
oXbp :bufferLength := 20
oXbp :dataLink      := {|x| variable1}
oXbp :create():setData()


oXtab1 := XbpPushButton():new( drawingArea, , {30, 10}, {70, 20}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
oXtab1:caption := "~OK"
oXtab1:tabStop := .T.
oXtab1:create()
oXtab1:activate := {|| nEvent := xbeP_Close }

oXtab2 := XbpPushButton():new( drawingArea, , {200, 10}, {70, 20}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
oXtab2:caption := "~Abbrechen"
oXtab2:tabStop := .T.
oXtab2:create()
oXtab2:activate := {|| lAbbrechen := .t., nEvent := xbeP_Close }

oDlg:show()
SetAppFocus( oXbp  )

if .not. lAbbruch
variable2 :=  oXbp:getData()
variable2 ist nachdem oXtab1 ausgeführt wurde immer noch der deklarierte Wert von variable1 und nicht der, der im SLE Feld eingetragen wird.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpSLE übergibt Variable nicht

Beitrag von brandelh »

Code: Alles auswählen

oXbp :dataLink      := {|x| variable1}
dein Codeblock LIEST die Variable1 in das SLE ein !
Diese wird so aber nie geändert.
Für Änderungen muss man den Inhalt vom Parameter (hier) x abfragen.

Code: Alles auswählen

oXbp :dataLink      := {|x| iif(x=NIL, variable1, variable1 := x ) }
Den tatsächlichen Inhalt des SLE kann man aber auch immer mit :editBuffer() abfragen, dabei wird der datalink nicht ausgeführt, z.B. um eben nicht zu speichern !
Gruß
Hubert
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: XbpSLE übergibt Variable nicht

Beitrag von vorti »

Mein Fehler war das ich die nEvent-Definition an der falschen Stelle hatte.
brandelh hat geschrieben: Fr, 13. Okt 2017 10:51

Code: Alles auswählen

oXbp :dataLink      := {|x| variable1}
dein Codeblock LIEST die Variable1 in das SLE ein !
Diese wird so aber nie geändert.
Für Änderungen muss man den Inhalt vom Parameter (hier) x abfragen.
Doch, Sie wird trotzdem geändert. Da getData() ja trotzdem den Editierbuffer abfragt und den dataLink einfach noch zusätzlich macht.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpSLE übergibt Variable nicht

Beitrag von brandelh »

getData() fragt den Inhalt des Feldes ab und führt danach den codeblock bei datalink aus (wenn vorhanden) ... dein Codeblock enthält keine Zuweisung des neuen Wertes
In dem Codeblock wird der Variablen nichts zugewiesen, und das SLE selbst kennt die Variable nicht. Dieser Code ändert die Variable nicht !
(oder ich bin mittlerweile so verkalkt, dass ich die Rente einreiche ;-) )

UND GENAU DAS BESCHREIBT DEINE FEHLERMELDUNG !
variable2 ist nachdem oXtab1 ausgeführt wurde immer noch der deklarierte Wert von variable1 und nicht der, der im SLE Feld eingetragen wird.
Was passiert hier:

variable2 := oXbp:getData()

oXbp:getData() ...
1. Editier Buffer auslesen (intern)
2. datalink codeblock ausführen, diesem in X den neuen Wert übergeben ...
3. {|x| variable1 } gibt den aktuellen (nicht veränderten) Wert von der Variablen variable1 zurück !!!
4. diesen Wert an variable2 zuweisen ...

genau das habe ich oben beschrieben und genau das ist deine Frage :-)

oXbp :dataLink := {|x| field->ReadOnlyInfo} // nimmt man immer dann wenn ein Feld oder Variable NICHT geschrieben werden soll
oXbp :dataLink := {|x| iif( x=nil, field->Name, field->Name := x ) } // nimmt man wenn das Feld geändert werden soll

Möglicherweise wird aber an einer anderen Codestelle der Inhalt auch übergeben (Speichernbutton z.B.)
Gruß
Hubert
Antworten