TMemo mit TStringList synchronisieren

Für Fragen von Einsteigern und Programmieranfängern...
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

TMemo mit TStringList synchronisieren

Beitrag von Eclipticon »

Hi,

ich moechte TMemo.Lines mit einer StringList aus einer anderen Unit synchronisieren. Eigentlich haette ich erwartet, dass

Code: Alles auswählen

MyMemo.Lines :-= MyStringList;
funktioniert und nur die Referenz auf MyStringList uebergeben wird ... ist aber offenbar nicht so (weil Lines eine property ist?), die Zuweisung funktioniert, aber Aenderungen in MyStringList wirken sich nicht aus.

Wie wuerdet ihr vorschlagen, diese zwei Datenmengen synchronisieren, ohne ewig oft alles zu kopieren?

Danke :-)

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: TMemo mit TStringList synchronisieren

Beitrag von Maik81ftl »

Weiß nicht, ob das hilft!

Quelle1.Lines.AddStrings(Quelle2);

FUnctioniert so. Quelle2 wird in quelle1 kopiert, wenn in beiden das selbe stehen soll. müstest du eine Quelle clean; die andere wieder zurückkopieren.
geht bestimmt auch einfacher, aber da muß ich grad passen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: TMemo mit TStringList synchronisieren

Beitrag von DiBo33 »

Assign()

Code: Alles auswählen

MyMemo.Lines.Assign(MyStringList);

BeniBela
Beiträge: 321
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: TMemo mit TStringList synchronisieren

Beitrag von BeniBela »

Eclipticon hat geschrieben:
Wie wuerdet ihr vorschlagen, diese zwei Datenmengen synchronisieren, ohne ewig oft alles zu kopieren?
Geht vermutlich nicht, da der memo-Inhalt vom widgetset verwaltet wird

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: TMemo mit TStringList synchronisieren

Beitrag von Eclipticon »

DiBo33 hat geschrieben:Assign()
Assign scheint auch nur zu kopieren ... http://www.freepascal.org/docs-html/rtl ... ssign.html" onclick="window.open(this.href);return false;

Mir faellt aber auf dieser Seite auf, dass die Zuweisung, wie ich sie mir eigentlich vorgestellt hatte, eigentlich funktionieren sollte ... warum ist das hier nicht der Fall?

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: TMemo mit TStringList synchronisieren

Beitrag von DiBo33 »

Assign scheint auch nur zu kopieren
Scheint nicht nur, ist so.
Ich hatte die Frage eigentlich erst seit @BeniBelas Antwort richtig interpretiert.
Mir faellt aber auf dieser Seite auf, dass die Zuweisung, wie ich sie mir eigentlich vorgestellt hatte, eigentlich funktionieren sollte ... warum ist das hier nicht der Fall?
Siehe Antwort von @BeniBela, dafür ist das jeweilige Widgetset zuständig, du müsstest also ein Weg finden beide Adressen (Memo.Lines und Stringlist) auf die gleiche zu mappen.

Edit: Wobei sich mir hier der Sinn nicht ganz erschließst.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TMemo mit TStringList synchronisieren

Beitrag von m.fuchs »

DiBo33 hat geschrieben:Edit: Wobei sich mir hier der Sinn nicht ganz erschließst.
Also ich habe hier auch gerade eine Szenario, in dem ich so eine Zuweisung brauchen könnte: ein Multi-File-Editor. Der besteht aus einem TMemo und einer Ladung Tabs die nach Aktivierung den jeweiligen Dokumenttext in das Memo laden. Wenn man hier nur einfach die TSTrings austauschen könnte...

Naja, so kopiere ich halt den Inhalt der .Text-Property hin und her.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: TMemo mit TStringList synchronisieren

Beitrag von DiBo33 »

Bei einem FileEditor hast du doch verdammt viel mehr Attribute als nur den reinen Textinhalt.
Hier könnte ich mir eher den Einsatz eines Memos innerhalb einer PageControl vorstellen.

Auch könntest du mehrere Memos statt Stringlists nehmen und lediglich dessen Parent entsprechend ändern, wenn du keine PageControl willst.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TMemo mit TStringList synchronisieren

Beitrag von m.fuchs »

Nein, außer den Metadaten (Dateiname, Nummer des Tabs, etc.) muss ich nix dazu behalten. Die eigentlichen Daten sind reiner Text. Was soll da noch dazukommen?
Tja, und mehrere Memos? Halte ich für keine gute Idee. Visuelle Komponenten verbrauchen ja AFAIK ein paar mehr Ressourcen als eine einfache TStringList im Speicher. Oder gibt es da andere Informationen zu?

Momentan ist halt meine beste Lösung hin und her kopieren. Aber ich bin auch gerne offen für anderes.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: TMemo mit TStringList synchronisieren

Beitrag von Eclipticon »

Bloed halt, das TCustomMemo.FLines private ist, sonst liesse sich da sicherlich einiges machen ...

Was anderes: Gibt es irgendeine Komponente, die Text aehnlich wie TMemo darstellen kann, bei der aber eine direkte Zuordnung einer StringList moeglich ist?

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: TMemo mit TStringList synchronisieren

Beitrag von Maik81ftl »

Eclipticon hat geschrieben:Bloed halt, das TCustomMemo.FLines private ist, sonst liesse sich da sicherlich einiges machen ...

Was anderes: Gibt es irgendeine Komponente, die Text aehnlich wie TMemo darstellen kann, bei der aber eine direkte Zuordnung einer StringList moeglich ist?
Aber

Code: Alles auswählen

property Lines: TStrings read FLines write SetLines;
ist

Code: Alles auswählen

public
Na ähnliche Komponente hab i net gefunden. :(
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TMemo mit TStringList synchronisieren

Beitrag von m.fuchs »

Maik81ftl hat geschrieben:Aber

Code: Alles auswählen

property Lines: TStrings read FLines write SetLines;
ist

Code: Alles auswählen

public
Wenn du dir jetzt auch noch die Prozedur SetLines angesehen hättest, wäre dir vielleicht etwas aufgefallen:

Code: Alles auswählen

procedure TCustomMemo.SetLines(const Value : TStrings);
begin
  if (Value <> nil) then
    FLines.Assign(Value);
end;
Man hat also beim Schreiben über die Property keinen direkten Zugriff auf die TStrings-Instanz, es werden nur die Daten kopiert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: TMemo mit TStringList synchronisieren

Beitrag von MAC »

muss man eigentlich die Memo mit der Stringlist synchronisieren ?
Oder reicht es auch die StringList mit der Memo zu synchronisieren. :idea:
Man einmal am anfang des Programms

Stringlist1 := Memo1.Lines.

gelesen wird nähmlich direkt über die instanz von FLines (TStrings).

Danach sollten diese doch auf immer und ewig synchronisiert sein...

Code: Alles auswählen

Signatur := nil;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: TMemo mit TStringList synchronisieren

Beitrag von Eclipticon »

MAC, das koennt funktionieren, ist aber in meinem speziellen Fall nicht praktikabel: Die StringList existiert naemlich auf jeden Fall, das Memo, das sie anzeigen soll, aber in den wenigsten Faellen ...

Hmmm ... ich koennt aber vielleicht diese Zuweisung durchfuehren, sobald das Memo existiert ... aber was passiert dann mit der urspruenglichen Instanz der StringList? Und was, wenn ich das Memo wieder zerstoere?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TMemo mit TStringList synchronisieren

Beitrag von m.fuchs »

MAC hat geschrieben:muss man eigentlich die Memo mit der Stringlist synchronisieren ?
Oder reicht es auch die StringList mit der Memo zu synchronisieren. :idea:
Man einmal am anfang des Programms

Stringlist1 := Memo1.Lines.
Nützt mir leider auch nichts, ich habe ja mehrere StringList mit unterschiedlichem Inhalt die je nach Auswahl angezeigt werden sollen.

Ich mache mir da jetzt auch nicht so eine Platte, die Kopiererei hat bisher noch keinen sichtbaren Geschwindigkeitsverlust zufolge gehabt. Bei einer Anwendung die hauptsächlich auf die Eingaben des menschlichen Benutzers wartet ist das auch nicht kritisch.
Eclipticon hat geschrieben:Hmmm ... ich koennt aber vielleicht diese Zuweisung durchfuehren, sobald das Memo existiert ... aber was passiert dann mit der urspruenglichen Instanz der StringList? Und was, wenn ich das Memo wieder zerstoere?
Wenn du die StringList vorher schon erzeugt hast, geht diese Instanz nach der Zuweisung ins Nirvana und bleibt dann unerreichbar liegen.
Nach Zerstörung des Memos zeigt StringList1 auf den nicht mehr existierenden Speicherbereich von Memo1.FLines. Alles nicht so schön.

Ist denn das Kopieren bei dir so schlimm?

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten