Entwickler-Ecke

Sonstiges (Delphi) - Kniffelig: Automatische Aktualisierung von Bezügen


Kralle - So 17.07.11 11:24
Titel: Kniffelig: Automatische Aktualisierung von Bezügen
Hallo,

mir qualmt der Kopf aber ich komme auf keine Lösung.
Folgendes Problem (das mit den Worten ist nur als Beipiel - der wahre Inhalt ist komplexer):

In einer DialogChecklist befinde sich folgende Einträge

Zitat:

Wort,1,"Hallo"
Wort,2,"Du"
Wort,3,"schöne"
Wort,4,"grosse"
Wort,5,"Welt"
Satz,6,(1,3,5)


Mittels Dialog kann ich die Wert in der Klammer bei "Satz" verändern. - Gelöst.
Mittels weiterem Dialog kann ich eine "Wort" Zeile einfügen oder löschen und alle anderen "Zeilennummern" werden angepasst. - gelöst
Aber, die "Satz"-Teil-Nummern müssen mit angepasst werden.
Wenn ich die Zeile Wort,2,"Du" lösche, dann sieht der Inhalt der Checklistbox so aus:

Zitat:

Wort,1,"Hallo"
Wort,2,"schöne"
Wort,3,"grosse"
Wort,4,"Welt"
Satz,5,(1,2,4)


Wie man jetzt sehen kann, haben sich die Werte in Klammern verändert (ist so nötig, damit der Satz erhalten bleibt).
Es sei denn , eine Zeile deren Nummer in der KLammer steht wird gelöscht, dann muss die Nummer aus der Zeile entfernt werden.

Ich zerbreche mir den Kopf wie ich die Werte in Klammern aktuell halten kann?
Ich habe es schon mit zwei Arrays probiert. Eines enthielt die Werte vor dem ergänzen/löschen das andere danach.
Aber da beide nicht gleich groß sind, kann ich auch nicht "einfach" den Wert von "Alt" in den Klammern suchen und gegen den Wert in "Neu" ersetzen.

Wie kann man das Problem lösen?

MfG
Heiko


Tryer - So 17.07.11 11:46

Mach aus den "Zeilennummern" eine "UniqueID",sprich lass sie unverändert und hänge neue Wort hinten an. Führe zwei Listen/Suchbäume: Nach ID bzw. alphabetisch sortiert. Beide referenzieren das "Wort-Item" welches aus Nummer und Wort besteht (darüber wird dann auch der wechselseitige Zugriff auf die Listen möglich)

Grüsse, Dirk


AXMD - So 17.07.11 11:47

Hallo Kralle!

Wenn sich Einträge nur einzeln löschen lassen, kannst du es einfach so machen: alle Verweise, deren Index kleiner ist als der gelöschte, bleiben gleich, alle anderen werden um 1 kleiner.

AXMD


Kralle - So 17.07.11 11:55

Hallo Dirk,
user profile iconTryer hat folgendes geschrieben Zum zitierten Posting springen:
Mach aus den "Zeilennummern" eine "UniqueID",sprich lass sie unverändert


Genau das geht leider nicht. Die Anwendung die die Daten der CheckListBox nachher vorgesetzt bekommt,
MUSS durchgehende Zeilennummern haben und die "Satz"-Zeile MUSS die letzte Zeile sein (hatte ich vergessen beizuschreiben).

Gruß Heiko

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Moin,

user profile iconAXMD hat folgendes geschrieben Zum zitierten Posting springen:

Wenn sich Einträge nur einzeln löschen lassen, kannst du es einfach so machen: alle Verweise, deren Index kleiner ist als der gelöschte, bleiben gleich, alle anderen werden um 1 kleiner.
AXMD


Es können durchaus mit einem mal x-Zeilen eingefügt oder gelöscht werden.

Und nun ...

Gruß Heiko


AXMD - So 17.07.11 12:02

Wenn n zusammenhängende Zeilen gelöscht werden, gilt das Gleiche wie oben, nur dass du n statt 1 subtrahieren musst. Wenn nicht-zusammenhängende Zeilen gelöscht werden, wird das Ganze kniffliger.

AXMD


Tryer - So 17.07.11 12:06

user profile iconKralle hat folgendes geschrieben Zum zitierten Posting springen:
Genau das geht leider nicht. Die Anwendung die die Daten der CheckListBox nachher vorgesetzt bekommt

Das wäre doch unabhängig von dem Format in dem Du die Daten bearbeitest - zum Zweck der Ausgabe ist sowas schnell erstellt. Während der Verarbeitungsphase ist der Satz dann kein "zu zerpflückender String" sondern ein "Array of TWortItem".

Grüsse, Dirk


Kralle - So 17.07.11 17:52

Moin,

danke das Ihr mir versucht zu Helfen.

Anbei eine PDF in der ich mehrere Mögliche Zustandsvarianten dargestellt habe,
aktuell gehalten werden müssen, die Zahlen in den Zeilen "Dialog,1019" und "Dialog,1000".

Gruß HEiko


Kralle - Do 28.07.11 10:45

Hallo,

das Problem ist gelöst.
Ich habe vor dem Ändern der Zeilennummern die Zeilennummern in einem Array gespeichert und nach dem Ändern auch nochmal.
Dann zerlege ich die Zeilen mit den Bezügen in einzelne Werte und suche mit in dem AltArray die entsprechende Zeilennummer un ersetze sie gegen die aus dem NeuArray.

Gruß Heiko