![]() |
Inhalte zweier Memos synchron halten
Hallo,
wenn ich zwei Memo's sychron halten möchte, d.h. egal in welchem ich was eingebe - der Inhalt ändert sich sofort in beiden - so sollte dies doch für mein Verständis mit nem Zeiger funzen - nur leider macht er dies nur direkt bei der Ausführung des Codes, automatisch passiert dann nix mehr ;( Hat jemand Rat? Mit OnChange zu arbeiten ist schwierig, da jedes mal zur TopLine gescrollt wird - da wäre lauter Geflicker angesagt...
Delphi-Quellcode:
Weiß jemand Rat? Oder geht das gar nicht mit Delphi?
var p: ^tstrings;
//----------------------- p:=@memo1.lines; memo2.Lines:=p^; |
Re: Inhalte zweier Memos synchron halten
Wenn überhaupt dann mit
Delphi-Quellcode:
Du kannst doch Memo1.Lines nicht eine andere Instanz eines Memos zuweisen
p^.Lines
edit: Achso. Ich dachte p wäre ein Pointer auf ein Memo, versuchs mal damit! |
Re: Inhalte zweier Memos synchron halten
Zitat:
Delphi-Quellcode:
da passiert leider genau das gleiche... nur bei auslösen des codes wird gesynct... ;( haben die da irgendwie gepennt bei borland mit den zeigern? weil für mein verständnis müsste das doch laufen!?
p: ^tmemo;
-- p:=@memo1; memo2.Lines:=p^.lines; |
Re: Inhalte zweier Memos synchron halten
Zitat:
leider irrst Du Dich etwas (wie Du ja schon gemerkt hast). Da ein Zeiger immer eine Adresse speichert hast Du nicht unrecht, dass Deine Zuweisung dafür sorgt, dass sowohl die Eigenschaft Lines von memo1 als auch memo2 auf das gleiche TStrings Objekt zeigen. An dieser Stelle sei aber auch gleich gesagt, dass Du dafür keinen Zeiger benötigst. Bei TStrings handelt es sich um eine Klasse. Alle Instanzen solcher Klassen (Objekte), werden automatisch als Referenz abgespeichert, dass heißt, Du verwendest automatisch (und für Dich transparent) einen typisierten Zeiger.
Delphi-Quellcode:
Insbesondere wird dieses Verhalten deutlich, wenn Du nun eine solche Referenz an eine Methode als Argument übergibst. Alle Änderungen (z.B. an einem TStrings-Objekt oder einer TBitmap), wirken sich direkt auf das übergebene Objekt und nicht auf eine Kopie aus!
var x: TStrings;
begin x := memo1.Lines; // in x steht nun eine Referenz auf die Lines // von memo1, x hat also die Größe von 4 Byte // egal wie das Objekt, dass Referenziert wird // gefüllt ist end; Du führst hier also eigentlich nur eine weitere Indirektion ein, hast also einen expliziten Zeiger, der auf einen impliziten Zeiger zeigt. An sich ist aber die Zuweisung aus einem anderen Grund problematisch. Hinter der Eigenschaft Lines steckt ein spezielles Objekt, dass an das jeweilige Memo gebunden ist. Die Änderungen an diesem TStrings-Objekt führen zu einer Benachrichtigung des Memos. Die Zuordnung welches Memo hier übergeordnet ist, ist aber eindeutig. Wann genau diese Zuordnung statt findet kann ich nicht sagen, denke aber, dass dies schon beim Erstellen des Memos geschieht. Setzt Du jetzt also die Eigenschaft Lines von Memo2 auf den Wert Memo1.Lines, dann änderst Du zwar wirklich die Lines-Eigenschaft, aber es wird somit nur noch Memo1 über Änderungen informiert. Die Zeilen
Delphi-Quellcode:
dürfte zu einem etwas überraschendem Verhalten führen, der String 'TEST' wird wohl im memo1 angzzeigt. Das liegt einfach daran, dass wirklich beide Memos das gleiche Objekt verwenden. Dieses ist aber (durch einen internen Zustand) fest an Memo1 gebunden. Änderungen an diesem Lines-Objekt führen zu einer Benachrichtigung von Memo1, dass daraufhin sich selbst neu zeichnet. Dadurch, dass Du hier die TStrings-Eigenschaft von memo2 überschrieben hast, ist eine direkt Manipulation vom memo2 nicht mehr möglich.
memo2.Lines := memo1.Lines;
memo2.Lines.Add('TEST'); Möchtest Du alle Werte von einem Memo in das andere übertragen, so solltest Du statt dessen auf die Methode Assign zurück greifen. Diese erledigt für Dich genau diese Übertragung:
Delphi-Quellcode:
Das beginUpdate und endUpdate ist eventuell unnötig, ich bin mir hier nicht sicher, ob Assign diese Methoden automatisch aufruft. Mit BeginUpdate kündigt man mehrere Änderungen an, dass führt dazu, dass die Komponente Änderungen ohne Benachrichtigung durchführt. Erst wenn das endUpdate aufgerufen wird, wird die Komponente wieder aktualisiert und kann alle Änderungen in einem Schritt berücksichtigen.
memo2.Lines.beginUpdate;
memo2.Lines.Assign(memo.Lines); memo2.Lines.endUpdate; Gruß Der Unwissende |
Re: Inhalte zweier Memos synchron halten
Zitat:
Mir ist dein Problem jetzt erst richtig klar geworden :wink: |
Re: Inhalte zweier Memos synchron halten
@mr47: das sync sollte klappen, da beide memo's auf den selben tstrings-speicher zeigen! damit ist für beide der inhalt gleich...
@der_unwissende: thx. leider funktioniert das auch nicht so recht, z.b. passiert bei
Delphi-Quellcode:
eben nicht das von dir profezeite, dass in memo1 die zeile auch erscheint ;( mit dem assign passiert auch nix ;(
memo2.Lines := memo1.Lines;
memo2.Lines.Add('TEST'); wie machen das denn die tausend anderen editoren, die eine datei in zwei memo's anzeigen. man kann ja dann in dem einen part rumscrollen und markieren, im anderen schreiben und dennoch werden alle änderung hin- und herübertragen, ohne dass man davon was groß mitbekommt. d.h. markierungen und auch position im text wird beibehalten... das kann doch da kein hexenwerk sein? gruß |
Re: Inhalte zweier Memos synchron halten
Wenn ich dich jetzt richtig verstanden habe, lädst du die Strings aber in die Memos. Also hast du einen Stringspeicher und beim anzeigen werden die Strings in den Memo-internen Speicher geladen.
D.h. du brauchst noch immer eine aktive Aktualisierung und zwar durch zwei Zeilen code :wink: , da das Memo es nicht mitbekommt, wenn du den Speicher veränderst. Somit haben wir jeden String insgesamt 3 mal gespeichert. (Nur) Speichertechnisch ist es besser wenn du mit OnChange arbeitest.... |
Re: Inhalte zweier Memos synchron halten
Code:
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin Memo2.Lines:=Memo1.Lines; end; procedure TForm1.Memo2KeyPress(Sender: TObject; var Key: Char); begin Memo1.Lines:=Memo2.Lines; end; |
Re: Inhalte zweier Memos synchron halten
@mr47/n00ki3: das klappt aber eben nicht so, wie ich das will, da ja wie bereits erwähnt, da der user vom reload nichts mitbekommen soll! wenn ich es so manuell rüberschiebe, dann verliert das zweite memo (egal welches jetzt als zweites bezeichnet wird) die position und eventuelle markierungen. das soll aber genau nicht passieren! irgendwie muss es ja gehen, da es ja zig editoren machen *mhhhh*
|
Re: Inhalte zweier Memos synchron halten
Ich will nicht ausweichen, aber welchen Sinn hat es, genau den selben Text zweifach zu schreiben? :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz