Warum wird Memo1.Lines gefüllt ?
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
@theo dein Beispiel erklärt glaube ich ganz gut den Effekt, den ich beobachtet habe. Ich dachte das würde so gehen, aber leider doch nicht.
Dann muss ich das wohl doch über ein Event lösen oder ?
Das z.b. nach dem Laden und Speichern ausgelöst wird. und wo der User dann manuell entscheiden kann was er mit den Daten machen möchte.
Das fand ich irgendwie blöd weil das mehr arbeitet bedeuten würde:
Es muss eine zusät liche Procedure defniert werden.
und zugewiesen werden.
Was ich eigentlich vermeiden wollte.
Hat denn einer von euch eine Altnative anzubieten ?
@af0815
Ja es sind zwei Klassen die haben Eigenschaften.
Ich habe oft genug gelesen, das es sich herbei um eine Pointer Verbiegung handelt. und das es so geht(müsste..).
Dann muss ich das wohl doch über ein Event lösen oder ?
Das z.b. nach dem Laden und Speichern ausgelöst wird. und wo der User dann manuell entscheiden kann was er mit den Daten machen möchte.
Das fand ich irgendwie blöd weil das mehr arbeitet bedeuten würde:
Es muss eine zusät liche Procedure defniert werden.
und zugewiesen werden.
Was ich eigentlich vermeiden wollte.
Hat denn einer von euch eine Altnative anzubieten ?
@af0815
Ja es sind zwei Klassen die haben Eigenschaften.
Ich habe oft genug gelesen, das es sich herbei um eine Pointer Verbiegung handelt. und das es so geht(müsste..).
MFG
Michael Springwald
Michael Springwald
- af0815
- Lazarusforum e. V.
- Beiträge: 6765
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Du willst also einige Listen synchron halten, damit du nicht sooovieeel arbeit damit hast ?!
Ist das richtig ?
Ist das richtig ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Plutos Überlegung ist schon richtig, nur hat er nicht beachtet dass er sich damit in die Welt der Pointer begibt. Und um das zu tun, muss man GENAU wissen, was die Komponente von der man den Pointer holt tut. Sonst lässt man's lieber.Christian hat geschrieben:Wurde dafür nicht Assign erfunden ?
Generell ist das vorgehen von Pluto nicht zu empfehlen, obwohl man nicht sagen kann, dass es bei Kenntnis aller Faktoren völlig falsch ist. Aber es kann die Quelle von "unerklärlichen" Ergebnissen sein.
- af0815
- Lazarusforum e. V.
- Beiträge: 6765
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Es sind keine Pointer, sondern Klassen mit Schnittstellen (Eigenschaften) und indirekt darunter liegend Pointer.
Zu dem was Theo richtig sagt, ist das zusätzlich es noch an der Implementierung in der Klasse hängt, ob es funktioniert. Wenn dort ab Verhalten was geändert wird, sprich bei zb. bei einer Zuweisung ein Assign() durchgeführt wird oder nicht wir es noch mehr Problematisch.
Ich würde einen Nachfolger machen und dann die gewünschten Eigenschaften so sauber wie möglich einfügen. Sprich auch die Methoden überladen , die die interen Abläufe auch die Listen verwalten.
Zu dem was Theo richtig sagt, ist das zusätzlich es noch an der Implementierung in der Klasse hängt, ob es funktioniert. Wenn dort ab Verhalten was geändert wird, sprich bei zb. bei einer Zuweisung ein Assign() durchgeführt wird oder nicht wir es noch mehr Problematisch.
Ich würde einen Nachfolger machen und dann die gewünschten Eigenschaften so sauber wie möglich einfügen. Sprich auch die Methoden überladen , die die interen Abläufe auch die Listen verwalten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Wie schon gesagt, dafür wurde Assign erfunden falls seine Klasse das nicht unterstützt kann er es implementieren. Und seine Vorgehensweise ist in jedem Fall falsch weil der normale Programmierer die Klassenbibliothek nicht so tief kennt um das Ergebnis vorherzusehen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Das Verstehe ich jetzt nicht....dass es bei Kenntnis aller Faktoren völlig falsch ist. Aber es kann die Quelle von "unerklärlichen" Ergebnissen sein.
Unter Delphi habe ich das schon mal gemacht und es hat Prima geklappt.
Einmal um intern auf die TSTringlist zuzugreifen. z.b. über die Methode GetInfoaber wieso brauchst du zwei Variablen...die du sowieso synchron hältst?
und einmal damit der User was in der Listbox sieht.
Ich dachte damit könnte ich zwei Fliegen mit einer Klappe schlagen.
Überall lese ich immer wieder wenn man Klasse1:=Klasse2 macht das es sich hierbei um ein Pointer handelt und das beide Variablen jetzt gleich sein müssten, also Klasse1 ist genauso gleich wie Klasse2.
Kennt ihr mir das noch etwas genauer erklären ?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Obj1 : TObject;
Obj2 : TObject;
^Obj1,2 sind nur Zeiger die im Moment auf irgendwas zeigen wenn man drauf zugreifen will gibts ne access violation
Obj1 := TObject.Create;
Obj2 := TObject.Create;
jetzt zeigen unsere zeiger auf die objekte die erstell wurden.
Obj1 := Obj2;
jetzt zeigen beide zeiger auf Obj2
Obj kann nie wieder benutzt werden da man nicht mehr weiss wo das ist und verursacht ein speicherleak weil es ja auch nicht freigegeben werden kann.
Obj1.Free; < da wird jetzt obj2 Freigegeben
Obj2.Free; < Access Violation weil Obj2 ja scon freigegeben wurde
Obj2 : TObject;
^Obj1,2 sind nur Zeiger die im Moment auf irgendwas zeigen wenn man drauf zugreifen will gibts ne access violation
Obj1 := TObject.Create;
Obj2 := TObject.Create;
jetzt zeigen unsere zeiger auf die objekte die erstell wurden.
Obj1 := Obj2;
jetzt zeigen beide zeiger auf Obj2
Obj kann nie wieder benutzt werden da man nicht mehr weiss wo das ist und verursacht ein speicherleak weil es ja auch nicht freigegeben werden kann.
Obj1.Free; < da wird jetzt obj2 Freigegeben
Obj2.Free; < Access Violation weil Obj2 ja scon freigegeben wurde
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
Sag ich doch. Es KANN gut gehen, es kann aber auch in die Hose gehen.pluto hat geschrieben:
Das Verstehe ich jetzt nicht....
Unter Delphi habe ich das schon mal gemacht und es hat Prima geklappt.
Hast du denn mein Beispiel nicht begriffen?
Dort wird die Stringlist neu created durch die Komponente, der sie gehört.
Das darf die machen.
Danach zeigt dein gespeicherter Pointer aber nicht mehr auf die Speicherstelle der neuen Liste, sondern auf die Stelle wo die alte war. Und die gibt's nicht mehr.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Ihr gibt euch zwar mühe mir das zu erklären aber nach vollziehen kann nicht es immer noch nicht !
Ich weiß jetzt nur drei dinge:
01: Man Weg geht so nicht
02: Es ist wohl doch ein BUG in Lazarus
03: Ich muss mir einen anderen Weg überlegen, aber das müsste ich so oder so. Weil die Daten ja später wohl nicht in einer TStringlist verwaltet werden sollten sondern (hoffe ich) in einer VST Komponente.
http://www.delphipraxis.net/post801319.html#801319" onclick="window.open(this.href);return false;
da mache ich mit, und für dieses Projekt schreibe ich diese Playlist Klasse.
Könnte mir jemand von euch eine Sichere Altnative anbieten ?
Eine hätte ich und die würde über ein Event laufen, was ich eigentlich vermeiden wollte. Aber das ist wohl der beste und sicherste Weg, oder ?
ps: Warum sollte eine listbox auf einmal die TStringlist neu Installisieren ? Das würde doch keinen sinn ergeben. Weil dann die Daten Weg währen. Wobei beim Clear Aufruf könnte ich es mir vorstellen. Aber sonst nirgends.
Ich weiß jetzt nur drei dinge:
01: Man Weg geht so nicht
02: Es ist wohl doch ein BUG in Lazarus
03: Ich muss mir einen anderen Weg überlegen, aber das müsste ich so oder so. Weil die Daten ja später wohl nicht in einer TStringlist verwaltet werden sollten sondern (hoffe ich) in einer VST Komponente.
http://www.delphipraxis.net/post801319.html#801319" onclick="window.open(this.href);return false;
da mache ich mit, und für dieses Projekt schreibe ich diese Playlist Klasse.
Könnte mir jemand von euch eine Sichere Altnative anbieten ?
Eine hätte ich und die würde über ein Event laufen, was ich eigentlich vermeiden wollte. Aber das ist wohl der beste und sicherste Weg, oder ?
ps: Warum sollte eine listbox auf einmal die TStringlist neu Installisieren ? Das würde doch keinen sinn ergeben. Weil dann die Daten Weg währen. Wobei beim Clear Aufruf könnte ich es mir vorstellen. Aber sonst nirgends.
MFG
Michael Springwald
Michael Springwald
Ding 02 stimmt nicht, das ist kein Bug in Lazarus.
Das ist nur ein Beispiel. Solange du nicht mit absoluter Sicherheit ausschliessen kannst, dass so etwas in der Komponente geschieht, solltest du den Pointer besser nicht verwenden.pluto hat geschrieben: ps: Warum sollte eine listbox auf einmal die TStringlist neu Installisieren ? Das würde doch keinen sinn ergeben. Weil dann die Daten Weg währen. Wobei beim Clear Aufruf könnte ich es mir vorstellen. Aber sonst nirgends.