Seite 1 von 1

AClone() mit Membervar Array

Verfasst: Mo, 10. Feb 2020 18:11
von Manfred
ich bin jetzt ein wenig verwirrt.
ich habe 2 Membervars. Eins davon ist ein Array, in das ich DataObject einbette. dann wird das Array geclont. Jetzt darf ich doch davon aussgehen, das der Inhalt des geclonten Arrays sich nicht verändert, wenn ich den Inhalt des Ursprungsarrays ändere!?
Tja, irgendwas läuft da wohl schief.

Code: Alles auswählen

DO WHILE ! (::oUnterricht:nArea)->(Eof())
             ::doBrowseUnterricht:datum      := (::oUnterricht:nArea)->datum
             AAdd(::aBrowseUnterricht, ::doBrowseUnterricht:copy())
             (::oUnterricht:nArea)->(DbSkip())
          ENDDO
          ::aBrowseUnterrichtClone := AClone(::aBrowseUnterricht)
          
wenn ich mir ::aBrowseUnterricht[1]:datum anzeigen lasse, dann erscheint 08.02.2020 das gleiche steht auch im geclonten Array drin.
jetzt schreibe ich
::aBrowseUnterricht[1]:datum := CToD("09.02.2020")
und es steht dann auch im geclonten Array so drin.
Ist das so korrekt?

Re: AClone() mit Membervar Array

Verfasst: Mo, 10. Feb 2020 19:34
von georg
Hallo, Manfred -


wir reden von einfachen und komplexen Datentypen.

Einfache Datentypen lassen sich mittels AClone() so kopieren, dass sie unabhängigen Dateneinheiten darstellen (String, Integer, etc.).

Wenn Du jedoch ein Objekt in einem Array-Element hast, dann wird Du auch in dem geclonten Array auf das gleiche/identische Objekt verwiesen. Änderungen an dem Objekt spiegeln sich dann in beiden Arrays wieder, da auf das gleiche Objekt verwiesen wird.

In diesem speziellen Fall müsstest Du nach dem AClone() das Array durchlaufen und alle vorgefundenen Objekte ebenfalls clonen, dann würde das funktionieren.

Re: AClone() mit Membervar Array

Verfasst: Mo, 10. Feb 2020 20:09
von Manfred
das ist Mist. Ich mache das Aclone nur um später die beiden Arrays auf Differenzen zu untersuchen. Eins davon ist in einem browser und dort kann es geändert werden. Ich muß aber wissen ob was geändert wurde, damit ich auf Speichern hinweisen kann, wenn es so weit ist.

Re: AClone() mit Membervar Array

Verfasst: Mo, 10. Feb 2020 20:31
von Martin Altmann
Warum so kompliziert?
Wenn das Zellelement zur Bearbeitung aktiviert wird, merkst Du Dir den Inhalt. Wenn das Editieren der Zelle beendet wird (sie also den Fokus verliert), vergleichst Du den gemerkten mit dem aktuellen Inhalt. Ist das unterschiedlich, inkrementierst Du den Zähler mit den Änderungen.
Das gibt jedoch einen Fehlalarm, wenn der Wert in was anderes geändert und dann erneut in das ursprüngliche geändert wird. Wenn Du diesen Fehlalarm verhindern willst, musst Du Dir in dem ursprünglichen Array nur die Inhalte (!) der Zellen merken!

Viele Grüße,
Martin

Re: AClone() mit Membervar Array

Verfasst: Di, 11. Feb 2020 9:21
von Manfred
klappt nicht. Muß ich mal prüfen, warum getfocus und lostfocus nicht richtig greifen.