AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inhalte zweier Memos synchron halten

Ein Thema von mike3k · begonnen am 18. Mär 2007 · letzter Beitrag vom 19. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
mike3k

Registriert seit: 29. Mai 2004
12 Beiträge
 
Delphi 7 Professional
 
#1

Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 16:38
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?
--
D7 Pro / Win32
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 16:56
Wenn überhaupt dann mit
 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!
  Mit Zitat antworten Zitat
mike3k

Registriert seit: 29. Mai 2004
12 Beiträge
 
Delphi 7 Professional
 
#3

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 17:00
Zitat von mr47:
Wenn überhaupt dann mit
 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!?
--
D7 Pro / Win32
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 17:11
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
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 17:20
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
  Mit Zitat antworten Zitat
mike3k

Registriert seit: 29. Mai 2004
12 Beiträge
 
Delphi 7 Professional
 
#6

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 17:36
@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ß
--
D7 Pro / Win32
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 17:54
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 , 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....
  Mit Zitat antworten Zitat
n00ki3

Registriert seit: 18. Mär 2007
2 Beiträge
 
#8

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 18:04
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;
  Mit Zitat antworten Zitat
mike3k

Registriert seit: 29. Mai 2004
12 Beiträge
 
Delphi 7 Professional
 
#9

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 18:30
@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*
--
D7 Pro / Win32
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Inhalte zweier Memos synchron halten

  Alt 18. Mär 2007, 18:38
Ich will nicht ausweichen, aber welchen Sinn hat es, genau den selben Text zweifach zu schreiben?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 Uhr.
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