![]() |
Delphi-Version: 5
Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Hallo,
ich hab mal wieder eine Frage an euch Delphi-Freunde: Ich habe mir eine neue Komponente geschaffen: Abgeleitet aus TPanel mit mehreren Edit-Feldern, Labels, TrackBar, CheckBox und einem Button drauf (Alles wird während der Laufzeit bzw. im Form1.OnCreate, erzeugt). Dem Button habe ich eine OnClick-Methode verpasst, die auf eine Prozedur in der gleichen Unit. Durch den Button-Klick soll das Panel verschwinden und die Ansicht auf der MainForm soll aktualisiert werden. Im Moment sieht mein Code so aus:
Delphi-Quellcode:
procedure TNeuesPanel.Loeschen(Sender:TObject);
begin if sender is TButton then begin ignoreAtSaving:=true; //Eigenschaft, die vor dem Speichern überprüft wird CBactive.checked:=false; //Panel wird deaktiviert Hide; //Provisorische Lösung // Form1.Refreschen; end; end; procedure TForm1.Refreschen; var i:integer; begin speichern; //Speichert Eigenschaften der Panels in Datei (ohne das weggeklickte Panel) for i:=1 to anzahlpanels do NeuesPanel[i].Destroy;; //Alle Panels sollen verschwinden... LadeVonDatei('costum',Form1,ScrollBox1); //...um danach wieder neu geladen zu werden (natürlich ohne das gelöschte) //procedure LadeVonDatei(datei:string; Owner: TComponent; ParentObjekt: TWinControl); end; Das Problem, wenn man Form1.Refreschen; verwendet, ist schon einleuchtend: Es gibt eine Zugriffsverletzung, weil man ein Objekt freigeben möchte, was noch eine Prozedur ausführt... Wie kann ich das Problem lösen, wenn das Objekt (NeuesPanel) freigegeben werden soll, um Platz für das Neuladen zu schaffen? Kann man dem Button (OnClick) eine Prozedur zuweisen, die in der Main-Unit liegt? Und gibt es dann auch noch Zugriffsverletzungen? Wäre über Antworten sehr dankbar ;) |
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Dann entferne den Callback
Statt .Destroy() .Free() aufrufen |
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Dankeschön :)
Hätte nie gedacht, dass das so einfach ist ;) Was macht denn das Free; anders als das Destroy; ? |
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Es werden diverse Überprüfungen durchgeführt.
|
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Diverse ist vlt. übertrieben. Auszug aus der Unit System.pas:
Delphi-Quellcode:
Nichtsdestotrotz ist wie schon erwähnt, trotzdem Free aufzurufen und nichts anderes :-D
procedure TObject.Free;
begin if Self <> nil then Destroy; end; |
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Neues Problem :(
In der Prozedur 'LadeVonDatei' wird jedes (eins weniger als vorher) NeuesPanel[xy] neu erstellt, und somit der alte Speicherplatz überschrieben, der vorher mit Free; geleert wurde. Jetzt bekomm ich aber immer einen Zugriffsfehler (wenn ich eins Lösche, Sourcecode s.o.), außer wenn ich das erste Panel in der Reihe (NeuesPanel[1]) lösche und sich noch mindestens 2 weitere dort befinden :shock: Der Debugger gibt mir den Fehler aus, nach dem er in der letzten Zeile von der Loeschen-Prozedur fertig ist, also erst nach dem "end;" Ich weiß nicht, in welcher Weise die beiden beschriebenen Sachen zusammenhängen, aber kann man das Problem auch noch lösen?? Meine sehr primitive Idee wäre, in der Löschen-procedure einen Timer auf der MainForm zu starten und die Schleife und das LoadFromFile dort reinzuhauen... Gibt es da vielleicht eine bessere Lösung :wink: Wie immer dankbar für Antworten :D |
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Deine Objekte nennt man übrigens Controls (=visuelle Komponenten).
siehe Code-Library: ![]() |
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Danke, shmia, es funktioniert super. Es kommen keine Fehlermeldungen mehr. Aber bei mir sieht es nicht so aus, als würden die Panels verschwinden O.o Muss mich wohl noch ein bisschen damit beschäftigen :-D
|
AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Zitat:
Delphi-Quellcode:
for i := anzahlpanels downto 1 do
Wenn das in Fleisch und Blut übergeht, dann klappts auch mit Listen etc. ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 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