XbpSle ohne setdata() aktualisieren [ERLEDIGT]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

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

XbpSle ohne setdata() aktualisieren [ERLEDIGT]

Beitrag von Manfred »

Hi,

ich habe in meinem Programm immer eine Abfrage, ob sich ein XbpSle geändert hat. Ist das der Fall, wird vor dem Beenden gefragt ob gesichert werden soll.

Jetzt habe ich eine Druckerauswahl, aus der das Ergebnis des gewählten Druckers in ein SLE geschrieben und direkt am Bildschirm im SLE angezeigt wird. Das klappt auch, aber leider scheint das nur über Setdata() zu gehen und dann gilt es nicht mehr als Änderung und somit greift die Abfrage nicht mehr.

Welche Möglichkeiten habe ich denn noch einen Wert in ein SLE zu übernehmen, was dann ein changed angibt, welches ich dann wieder in meiner Routine abfragen kann?

In den Editbuffer kann man ja nicht schreiben!?
Zuletzt geändert von Manfred am Do, 30. Jul 2009 13:06, insgesamt 1-mal geändert.
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: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpSle ohne setdata() aktualisieren

Beitrag von AUGE_OHR »

Manfred hat geschrieben:Hi,
Welche Möglichkeiten habe ich denn noch einen Wert in ein SLE zu übernehmen, was dann ein changed angibt, welches ich dann wieder in meiner Routine abfragen kann?
nun ja ... laut Hilfe passiert es ja "automatisch"
Die Instanzvariable:changed wird automatisch auf .F. (falsch) gesetzt, wenn die Methode :setData() oder :undo() ausgeführt wird.
Wenn du also aus deinem Browse einen "Wert" auswählst solltest du
erst feststellen ob es sich um den selben "Wert" wie im :Editbuffer
handelt bevor du ihn zurück schreibst und ggf. einen "Flag" setzten wie
lWertVomBrowse := .T. und das bei deinem :changed berücksichtigen.

... Anmerkung :datalink :
Ich persönlich mag es gar nicht wenn "irgendwas" auf meine Daten
zugreifen will. In einem "normalen" :datalink geht man aber gewöhnlich
gleich auf die FELDer ...
Man kann aber auch Variabeln im :datalink verwenden und somit seine
(von Cl*pper) gewohnten STORE / REPLACE Funktionen benutzen. Dies
kann auch sehr hilfreich sein wenn man z.b. ein GET Maske nach GUI
"übersetzt".
Um jetz nun nicht "hunderte" von Vriabeln zu verwenden werden diese
als Elemente eines STATIC Array angelgt und mit #xtranslate "übersetzt".

Code: Alles auswählen

#xtranslate mKDBEZEICH  => Stack\[SP,1]
#xtranslate mKDNAME     => Stack\[SP,2]
...
#xtranslate mLFHANDY    => Stack\[SP,47]

STATIC Stack := {}
STATIC SP    := 0

PROCEDURE KDINITPUB
   AADD( Stack, ARRAY( 47 ) )
   SP ++
   KLEER()
RETURN

PROCEDURE KDEXITPUB
   // hier nur 1-Dim !!!
   Stack := ASIZE( Stack, -- SP )
RETURN

STATIC PROCEDURE KIN
LOCAL getList := {}
...
@ 04, 20 GET mKDBEZEICH PICTURE '!XXXXXXXXXXXXXXX'               VALID (
@ 05, 20 GET mKDNAME    PICTURE '!XXXXXXXXXXXXXXXXXXXXXXXX'      VALID (
und dann das selbe in GUI

Code: Alles auswählen

oXbp1 := SLEPic():new( oDlg:drawingArea, , ... )
oXbp1:editable     := F_ONOFF
oXbp1:bufferLength := 16
oXbp1:Picture      := "!XXXXXXXXXXXXXXX"
oXbp1:tabStop      := .T.
oXbp1:dataLink     := VARBLOCK(@mKDBEZEICHN)
oXbp1:preBlock     := {|| .T. }
oXbp1:postBlock    := {|o| isValid(o,mKDBEZEICHN) }
oXbp1:create():setData()
AAdd ( aEditControls, oXbp1 )

oXbp2 := SLEPic:new( oDlg:drawingArea, , ... )
oXbp2:editable     := F_ONOFF
oXbp2:bufferLength := 25
oXbp2:Picture      := "!XXXXXXXXXXXXXXXXXXXXXXXX"
oXbp2:tabStop      := .T.
oXbp2:dataLink     := VARBLOCK(@mKDNAME    )
oXbp2:preBlock     := {|| .T. }
oXbp2:postBlock    := {|o| isValid( o,mKDNAME ) }
oXbp2:create():setData()
AAdd ( aEditControls, oXbp2 )
Dabei sind die Functionen VALID / isValid() praktisch gleich nur das bei
isValid(oObj,Value) noch geprüft werden muss von welchem SLE Object
ich nun komme während bei einem GET das VALID ja immer auf die
betreffende Zeile "wirkt".

Zu beachten ist das ich hier PROCEDURE für die *PUB benutze und der
Code "so" nur "SDI" fähig ist. Wenn man nun daraus FUNCTION macht
kann man bei der INITPUB die "Dimension" per SP "ausgeben".
Man muss dann aber auch in EXITPUB wiederrum die SP "Dimension"
per ASCAN() suchen und per ADEL() auf NIL setzten und darf den Stack
nur dann ASIZE()n wenn das letzte Element = NIL ist um das ganze MDI
fähig zu machen.

... man muss also unter GUI nicht immer deren Methoden wie :editbuffer
oder :changed benutzen wenn man unter Cl*pper schon eine Lösung hat.
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

das Problem hat sich geklärt. :changed(.T.) hat nicht geklappt, obwohl es bei SpinButtons klappt. Und :changed := .T: klappte unter SlePic nicht. Also muß ich ein wenig umdenken..
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!!
Antworten