Changed klappt nicht? [ERLEDIGT]

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

Changed klappt nicht? [ERLEDIGT]

Beitrag 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!?
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: Changed klappt nicht?

Beitrag 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.
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: Changed klappt nicht?

Beitrag 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.
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
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: Changed klappt nicht?

Beitrag 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)
Gruß
Hubert
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: Changed klappt nicht?

Beitrag 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.
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
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: Changed klappt nicht?

Beitrag 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
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
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: Changed klappt nicht?

Beitrag 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.
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
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: Changed klappt nicht?

Beitrag 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.
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