DCBROWSE Edit von zellen prüfen

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

DCBROWSE Edit von zellen prüfen

Beitrag von Manfred »

Wenn man über EDIT erlaubt in einem Browse direkt zu editieren und in der Zelle Doppelklickt oder RETURN drückt um den Vorgang zu starten, stellt sich mir jetzt folgende Frage:
hat man die Möglichkeit zu prüfen, ob der Inhalt geändert wurde?
Der Grund meiner Frage ist der. Ich habe ein Array, das gebrowsed wird und in dem was geändert werden kann. Wenn nun eine Zelle geändert wurde, dann möchte ich einen Button für Speichern enablen um den Satz wegschreiben zu können. Oder aber zumindest einen merker setzen, der bei Abbruch etc. abfragt, ob gespeichert werden soll. Oder gibt es dafür eine andere, bessere Lösung?
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: DCBROWSE Edit von zellen prüfen

Beitrag von Tom »

Wenn Du das Cell-Editing über ein gesondertes DCGET bewerkstelligst, was ja der normale Weg ist, kannst Du darin mit GOTFOCUS und LOSTFOCUS zuerst den Zellenwert wegspeichern und dann den neuen Wert mit dem gespeicherten vergleichen. Und nur wenn Ungleichheit vorliegt, wird irgendeine Flag-Variable ("lChanged := .T.") gesetzt, die im WHEN-Block des Buttons evaluiert wird.

Da Du Arrays browsen willst, geht es aber noch viel einfacher. Vor dem Eintritt ins Browse legst Du mit AClone() eine Kopie des Arrays an, und mit ACompare (der Quellcode hierfür ist m.E. irgendwo in der Xbase++-Hilfe zu finden, ansonsten sicher im Forum) vergleichst Du, ob das Original und die Kopie noch übereinstimmen. Wenn das nicht der Fall ist, geht der Button an. Bei nicht zu großen Arrays geht das sehr schnell. Zu große Arrays browst man ja auch nicht. :wink:
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: DCBROWSE Edit von zellen prüfen

Beitrag von Manfred »

Hi Tom,
verflixt, das mit dem Array clone und vergleichen, das hört sich ja nicht schlecht an. da habe ich noch gar nicht dran gedacht. (War sicher mal wieder zu einfach.) MUß ich sofort probieren
Aber der andere Hinweis, was wäre denn eine Angabe, das ein Array zum Browsen zu groß wäre?
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: DCBROWSE Edit von zellen prüfen

Beitrag von Tom »

ACompare vergleicht zwei Arrays rekursiv auf Zellenebene, bis entweder ein Unterschied gefunden wird oder das Array durchgelaufen ist. Wenn Du ein 100 x 100 großes Array hast, läuft die Funktion schlimmstenfalls 10.000 mal durch. Und das jedes Mal, wenn die WHEN-Klausel des Buttons geprüft wird. Das passiert in der krassesten Konstellation bei jeder Bewegung im Browse (Du kannst ja über irgendeine DC_Get-Set-Funktion festlegen, ob Navigationen im Browse prüfen sollen, ob sich WHEN- oder EDIT-Bedingungen ändern). Da ist die Variante mit der Flag möglicherweise sinnvoller. Oder eine Kombination - das DCGET setzt eine Flag, dass editiert wurde, und nur wenn die aktiv ist, wird ACompare ausgeführt. Und dann gibt es noch eine zusätzliche Flag, denn eine Änderung reicht ja - sobald eine erfolgt ist, muss nicht mehr verglichen werden. Oder so.

Ich würd's einfach ausprobieren, sind ja nur ein paar Zeilen Code.
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: DCBROWSE Edit von zellen prüfen

Beitrag von Manfred »

ich habe acompare ausprobiert. In dem Array sind Dataobjetcs. Wie ich schon in einem anderen thread festgestellt habe, klappt es nicht wenn ich das Array Clone, weil dann eine Referenz auf das geklonte Array besteht und alles Änderungen darin auch in dem clone erfolgen. Also habe ich mit Var2Bin() und Bin2Var() versucht das Problem zu lösen. Das klappt in der Hinsicht, das die Referenz nicht mehr da ist, aber ACompare() oder dc_acompare() finden trotzdem einen Unterschied zu den beiden Arrays direkt nach dem Clonen. Wo denke ich denn jetzt wieder falsch?
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: DCBROWSE Edit von zellen prüfen

Beitrag von Tom »

Mach doch einfach Var2Char, das geht schneller. Aber es wird keine Referenz auf das Array kopiert - das ganze Array wird tatsächlich geklont. Wenn das Array aber wiederum Referenzen auf komplexe Datentypen enthielt, werden die Referenzen beim Klonen kopiert. Die im Array referenzierten Objekte werden nicht geklont! Das ließe sich auch kaum bewerkstelligen.

Ich fürchte, die andere Lösung ist einfacher. Du merkst Dir beim Betreten des DCGET den Wert und vergleichst nach dem Verlassen mit dem Original - und wenn ein Unterschied besteht, wird ein Flag gesetzt. 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: DCBROWSE Edit von zellen prüfen

Beitrag von Manfred »

Hi Tom,
das dachte ich ja wäre mit GOTFOCUS und LOSTFOCUS erledigt. Aber wie schon im anderen Thread erwähnt, klappt das 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
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: DCBROWSE Edit von zellen prüfen

Beitrag von Tom »

Du musst die GOT-/LOSTFOCUS-Klauseln an das Edit hängen, nicht an die Spalte.
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: DCBROWSE Edit von zellen prüfen

Beitrag von Tom »

Es ist übrigens möglich, dass DCBROWSE eine iVar für den Fall hat, dass per Cell-Editing was geändert wurde - ich meine, dass ich mich da an irgendwas erinnere. Mach mal den Object-Inspector auf und schau die die iVars an. Oder ich mache das nachher.
Herzlich,
Tom
Antworten