AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören
Thema durchsuchen
Ansicht
Themen-Optionen

Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

Ein Thema von erik-17 · begonnen am 18. Apr 2011 · letzter Beitrag vom 18. Apr 2011
Antwort Antwort
erik-17

Registriert seit: 8. Apr 2010
51 Beiträge
 
Delphi 3 Professional
 
#1

Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 11:39
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 11:43
Dann entferne den Callback
Statt .Destroy() .Free() aufrufen
Markus Kinzler
  Mit Zitat antworten Zitat
erik-17

Registriert seit: 8. Apr 2010
51 Beiträge
 
Delphi 3 Professional
 
#3

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 11:48
Dankeschön
Hätte nie gedacht, dass das so einfach ist

Was macht denn das Free; anders als das Destroy; ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 11:52
Es werden diverse Überprüfungen durchgeführt.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 12:04
Diverse ist vlt. übertrieben. Auszug aus der Unit System.pas:
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Nichtsdestotrotz ist wie schon erwähnt, trotzdem Free aufzurufen und nichts anderes
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
erik-17

Registriert seit: 8. Apr 2010
51 Beiträge
 
Delphi 3 Professional
 
#6

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 13:53
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
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

Wie immer dankbar für Antworten
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 14:05
Deine Objekte nennt man übrigens Controls (=visuelle Komponenten).
siehe Code-Library: Controls die sich selbst zerstören
Andreas
  Mit Zitat antworten Zitat
erik-17

Registriert seit: 8. Apr 2010
51 Beiträge
 
Delphi 3 Professional
 
#8

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 14:24
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
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Suche Lösung: Objekt soll sich in eigener Prozedur selbst zerstören

  Alt 18. Apr 2011, 14:44
Delphi-Quellcode:
  for i:=1 to anzahlpanels do
    NeuesPanel[i].Destroy;; //Alle Panels sollen verschwinden...
Gewöhn Dir beim Zerstören von Dingen an, die Reihenfolge umzukehren, also:
  for i := anzahlpanels downto 1 do
Wenn das in Fleisch und Blut übergeht, dann klappts auch mit Listen etc.
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:20 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