Seite 1 von 1

Changed klappt nicht? [ERLEDIGT]

Verfasst: Mi, 29. Dez 2010 21:02
von Manfred
Hi,

Roger macht ja aus den DCGET keine SLE, sondern Gets. Diese haben aber auch ein :changed. Ich verstehe aber immer noch nicht, warum das nicht klappt. Ich schreibe alle Objekte in ein Array und schicke das dann zwischendurch in eine Prüfung, ob eines davon :changed wurde. Egal was passiert, es steht immer ein .F. dort drin. Ich kann es nicht fassen, wo denke ich hier falsch. Das muß doch klappen!?

Re: Changed klappt nicht?

Verfasst: Mi, 29. Dez 2010 21:18
von Tom
Hallo, Manfred.
Roger macht ja aus den DCGET keine SLE, sondern Gets.
Wie kommst Du denn auf die Idee? :oops: Aus einem DCGET wird ein DC_XbpGet, das von XbpSle abgeleitet ist. Die iVar Changed kennt auch ein normales XbpGet. Einfach mal in die Doku gucken. :wink:

Changed wirkt nur in dem Moment, in dem der EditBuffer vom Inhalt der referenzierten Variablen abweicht. Das ist nur zwischen einem GetData, der Bearbeitung und einem anschließenden SetData der Fall. Sobald also der Inhalt in die referenzierte Variable durchgeschrieben wurde, ist Changed wieder auf ".F.". Wenn Du also wissen willst, ob eine Variable in Bezug auf ihren Ursprungswert geändert wurde, solltest Du Dich mit DC_GetOrigUpdated() befassen. Oder die Klasse DC_XbpGet (z.B. über die "subclass"-Klausel) dahingehend ergänzen, dass in einer zusätzlichen iVar der Wert der Variablen in dem Moment gespeichert wird, in dem das erste SetData() ausgeführt wird. Genau das macht Roger übrigens auch.

Re: Changed klappt nicht?

Verfasst: Mi, 29. Dez 2010 21:38
von Manfred
Sorry,

ich meinte DC_XbpGet. So verwirrt bin ich schon bei der Sache. Das steht zumindest in dem Array, wenn ich ein Element aufrufe und dann die Partsart angezeigt wird. Dann habe ich mich vertan. Das war zumindest eine grobe Erklärung für mich, warum das Problem besteht. War es dann wohl nicht. :roll:

Aber trotzdem verstehe ich das nicht. Ich dachte, sobald ich ein "SLE" ändere, wird changed gesetzt, ohne das was weiteres passiert. Das ist doch Kappes.

Ich mache das so.

Code: Alles auswählen

@ DCGUI_ROW,DCGUI_COL DCGET oParaAk:bez;
                                 EVAL {|o| o:usevisualstyle := oSysPara:oWsPara:VisualStyl,oParaAk:addEditControl(o) };
                              MESSAGE "Bezeichnung für den Parameter" INTO oSysPara:oMessageBox;
                               OBJECT oParaAk:oBez;
                               PARENT oRahmenAkBez;
                              PICTURE "@K !" + Repl("X",29);
                                 SIZE 250,nSayHoehe;
                              TABSTOP;
                              TOOLTIP "Bezeichnung für den Parameter eingeben"

*******************************************
METHOD datenbank:addEditControl( oXbp )
       IF AScan( ::aEditControls, oXbp ) == 0
          AAdd(  ::aEditControls, oXbp )
       ENDIF
RETURN self
Ich dachte das wäre so zu machen. Und dann, bei Abbruch, oder was weiß ich kurz abfragen, ob sich was geändert hat und dann entsprechend reagieren. Das geht doch im MDIDemo Beispiel genauso. Dadurch bin ich doch erstmal darauf gekommen.

Re: Changed klappt nicht?

Verfasst: Mi, 29. Dez 2010 23:14
von brandelh
Hallo Manfred,

mit dem DC... habe ich ja nichts am Hut, aber bei dem zu Grunde liegenden XbpSLE und
den anderen Controls die ich kenne verhält es sich so, dass :changed := .f.
gesetzt wird, sobald dem SLE ein neuer Wert zugewiesen wird (:SetData()).
Ich denke auch beim Speichern (GetData() - über Datalink, bin mir hier aber nicht sicher).

Eine EINGABE durch z.B. das KEYBOARD setzt :changed := .t. ... soweit so gut, aber ...

Wenn du z.B. einem leeren XbpSLE einen "Vorgabewert" zuweist ...

Code: Alles auswählen

if emty(oName:editBuffer())
   oName:setData("Vorgabe")
...
änderst du zwar den Inhalt des SLE im Vergleich zur DBF, aber das XbpSLE steht auf :changed == .f. !
Seit der 1.90 kann man diese Variable aber per Hand setzen sobald es nötig ist:

Code: Alles auswählen

if emty(oName:editBuffer())
   oName:setData("Vorgabe")
   oName:changed := .t.
...
Solange man immer den kompletten Satz speichert, spielt changed ja auch keine Rolle (früher habe
ich es deshalb erst gar nicht abgefragt, da ich ja oft Vorgabewerte gesetzt habe), aber wenn man
nur die changed Variablen speichert ist es sehr wichtig auch alle manuellen Änderungen des Controls
auf changed zu setzen.

Ob das dein Problem betrifft weiß ich nicht 8)

Re: Changed klappt nicht?

Verfasst: Do, 30. Dez 2010 10:10
von Manfred
Hi Hubert,

ich muß das mal wieder alles Schritt für Schritt durchgehen. Vielleicht bin ich auch auf dem falschen Dampfer. Die Funktion, die Tom weiter oben angeführt hat, hatte ich irgendwie nicht registriert und erst nach dem Abschalten der EDV gestern Abend verinnerlicht.

Re: Changed klappt nicht?

Verfasst: Do, 30. Dez 2010 16:22
von Markus Walter
Hallo Manfred,

ich habe festgestellt, dass die changed-Verwaltung von Roger bei Fensterwechseln (umschalten in andere Anwendung und zurück) nicht so reagiert, wie man das erwarten würde, wenn man das changed von alten "get" kennt und habe mir deshalb in einer Ableitung (subclass) ein eigenes changed programmiert. Da vergleiche ich ::OrginalBuffer mit ::get:buffer

Re: Changed klappt nicht?

Verfasst: Do, 30. Dez 2010 16:27
von Manfred
Hi Markus,

mit dem GETbuffer, oder wieso steht das get vor? Das war nämlich auch meine Idee, Buffer mit UndoBuffer zu vergleichen, aber da stand beidesmal das gleiche drin. Deshalb habe ich es gleich wieder gelassen. Ich werde es aber mit der DC-Funktion probieren. bin nur noch nicht dazu gekommen.

Re: Changed klappt nicht?

Verfasst: Do, 30. Dez 2010 17:54
von Manfred
Hi Tom,

im Moment scheint dieses Funktion genau das Mittel der Wahl zu sein. Sie macht das, was ich haben wollte. Danke für den Hinweis. Wobei es mich immer wieder ein wenig nervt, dass solche Funktionen nirgends beschrieben sind, man also gar nicht weiß, das es sowas gibt, bzw. erkennen könnte, das man sie gebrauchen kann. das ist mir jetzt schon ein paar Mal passiert mit express++. Naja, irgend woher muß Du es ja gewußt haben.