Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Inhalte zweier Memos synchron halten (https://www.delphipraxis.net/88637-inhalte-zweier-memos-synchron-halten.html)

mike3k 18. Mär 2007 16:38


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:
var    p: ^tstrings;
//-----------------------
  p:=@memo1.lines;
  memo2.Lines:=p^;
Weiß jemand Rat? Oder geht das gar nicht mit Delphi?

mr47 18. Mär 2007 16:56

Re: Inhalte zweier Memos synchron halten
 
Wenn überhaupt dann mit
Delphi-Quellcode:
 p^.Lines
Du kannst doch Memo1.Lines nicht eine andere Instanz eines Memos zuweisen

edit: Achso. Ich dachte p wäre ein Pointer auf ein Memo, versuchs mal damit!

mike3k 18. Mär 2007 17:00

Re: Inhalte zweier Memos synchron halten
 
Zitat:

Zitat von mr47
Wenn überhaupt dann mit
Delphi-Quellcode:
 p^.Lines
Du kannst doch Memo1.Lines nicht eine andere Instanz eines Memos zuweisen

edit: Achso. Ich dachte p wäre ein Pointer auf ein Memo, versuchs mal damit!

du meinst also:
Delphi-Quellcode:
p: ^tmemo;
--
p:=@memo1;
memo2.Lines:=p^.lines;
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!?

Der_Unwissende 18. Mär 2007 17:11

Re: Inhalte zweier Memos synchron halten
 
Zitat:

Zitat von msgroup
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

Hi,
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:
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;
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!

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:
  memo2.Lines := memo1.Lines;
  memo2.Lines.Add('TEST');
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.

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:
  memo2.Lines.beginUpdate;
  memo2.Lines.Assign(memo.Lines);
  memo2.Lines.endUpdate;
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.

Gruß Der Unwissende

mr47 18. Mär 2007 17:20

Re: Inhalte zweier Memos synchron halten
 
Zitat:

Zitat von msgroup
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!?

Du hast erwartet das es ohne ausführen eines Codes synchronisiert wird? Das ist irgendwie ein Widerspruch in sich, dass ohne ausführen eines Codes etwas ausgeführt wird.
Mir ist dein Problem jetzt erst richtig klar geworden :wink:

mike3k 18. Mär 2007 17:36

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:
memo2.Lines := memo1.Lines;
  memo2.Lines.Add('TEST');
eben nicht das von dir profezeite, dass in memo1 die zeile auch erscheint ;( mit dem assign passiert auch nix ;(

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ß

mr47 18. Mär 2007 17:54

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....

n00ki3 18. Mär 2007 18:04

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;

mike3k 18. Mär 2007 18:30

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*

mr47 18. Mär 2007 18:38

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 06:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz