was mein project grob macht:
ich habe einen Text, in dem ich gewisse Strukturen markieren, speichern und letztlich statistisch auswerten will. Hauptsächlich geht es da um Grammatik. Ich erstelle also u.a. Objekte bzw. dynamische arrays, die bespielsweise speichern: in Zeile 4532 leitet Komma 3 einen Nebensatz vom Typ 6 ein, der bei Komma 5 endet - so ungefähr, nur eben als Code und für alle möglichen Strukturen, nicht nur Nebensätze ...
wo ich Probleme sehe:
ich arbeite teilweise mit pointern, insbesondere dann, wenn es darum geht Strukturen, die gerade auf dem Bildschirm sind, mit denen meiner 'Datenbank' zu linken (etwa nach der Idee: Wort 3 in Zeile 6 auf dem Bildschirm entspricht Wort 23 im Satz xyz). Für das Speichern löse ich aber immer sämtliche pointer in absolute Werte auf, damit ich ein record in eine typisierte Datei speichern kann. Das ist natürlich super umständlich und fällt mir insbesondere auf die Füße, wenn ich Objekte lösche. zur Erklärung: wenn ich bespielsweise Satz 2000 lösche, aber sämtliche Einträge wie oben beschrieben gespeichert sind, muss ich nun alle 'Datenbanken' durchlaufen, und alle Verweise die auf Satz 2001 aufwärts zeigen, neu buchen, indem ich dort einen integerwert decrease etc. etc.
wo ich Hilfe brauche:
ich bin nun auf die Möglichkeit gestoßen, TObjectlist zu nutzen. Das würde, wenn ich es richtig sehe, beim Löschen, Verschieben etc. einiges vereinfachen. Das ist ein erster Anstoß, was mich aber wirklich umtreibt und mich vermutlich auch dazu bewegen würde, meine knapp 4000 Zeilen Programmcode umszustülpen, ist die Idee pointer zu speichern. Ich habe nur keine Anhung, ob das überhaupt geht. Nach meinem Verständnis ist im Pointer ja nur die speicheradresse hinterlegt. Leider kann ich auch garnicht konkreter Fragen, weil mir das Wissen fehlt, das Problem genauer zu fassen. Also das wäre ein erster Schritt: kann ich pointer so speichern, dass nach dem Laden wieder auf das richtige Object verwiesen wird (das seinerseits aus einer anderen Liste geladen wird)?
zur Veranschaulichung etwas Democode:
Code: Alles auswählen
PTDBWort = ^TDBWort;
(...)
TDBWort = class
Text: string;
Orig: TOrig; // TOrig ist ein record, das diverse integer-Werte beinhaltet
Verweis: PTWort;
ZuMarker: PTDBMarker;
procedure GetMarker;
function GetPos: integer;
end;
(...)
TPartizip = class
private
procedure Assign(Quelle: TPartizip);
public
Wort: array of PTDBWort;
[...]
end;
TSyntax = class
Part: array of TPartizip;
[...]
procedure Laden;
procedure Speichern;
Constructor Create;
Destructor Destroy; override;
end;
Wenn ich nun Partizipien speicher, löse ich den Pointer 'Wort: array of PTDBWort' in seine integerWerte auf und lege sie in einer typisierten file ab. beim laden lese ich diese Werte ein und schaue dann via CompareMem, welche Objekte aus TDBWort die gleichen integers für Zeile und Element aufweisen - bei einem match setze ich dann einen neuen pointer.
kann ich diese ganzen Zwischenschritte sparen, wenn ich irgendwie pointer speichern kann? Ist es dafür notwenig, alle Daten in einer einzelnen Datei zu speichern und ist evtl. TObjectList ein Teil der Lösung?
Liebe Grüße!