AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Fehler beim freigeben dynamisch erzeugter TLabels
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim freigeben dynamisch erzeugter TLabels

Ein Thema von hugo1990 · begonnen am 20. Jun 2007 · letzter Beitrag vom 22. Jun 2007
Antwort Antwort
Seite 3 von 3     123   
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#21

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 16:19
Hallo,

Poste noch mal die Erzeugung und Freigabe


Heiko
Heiko
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 16:28
@ helmi
jop, das einzige was anders ist, ist das Parent

@ hoika
Erzeugung:
Delphi-Quellcode:
SetLength(Bilderup,Files.Count-2);
SetLength(Bilderupname,Files.Count-2);
for i:=low(Bilderup) to high(Bilderup) do
  begin
  {x,y festlegen}
  Bilderup[i]:=TImage.Create(Form1);
  Bilderup[i].Picture.LoadFromFile(...);
  Bilderup[i].Left:=x;
  Bilderup[i].Top:=y;
  Bilderup[i].Width:=133;
  Bilderup[i].Height:=100;
  Bilderup[i].Parent:=PicsAtServer;
  Bilderup[i].Center:=True;
  Bilderupname[i]:=TLabel.Create(Form1);
  Bilderupname[i].Caption:=IntToStr(i+1)+'.jpg';
  Bilderupname[i].AutoSize:=True;
  Bilderupname[i].Left:=x+(133-Bilderupname[i].Width) div 2;
  Bilderupname[i].Top:=y+103;
  Bilderupname[i].Parent:=PicsAtServer;
  end;
PicsAtServer ist eine TScrollBox;

Freigabe:
Delphi-Quellcode:
for i:=high(Bilderup) downto low(Bilderup) do
  begin
  FreeAndNil(Bilderup[i]);
  end;
for i:=high(Bilderupname) downto low(Bilderupname) do
  begin
  FreeAndNil(Bilderupname[i]);
  end;
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 17:09
Ok ich habe jetzt rausgefunden, wie das mit der TComponentList geht, aber der Fehler kommt immer noch.

Delphi-Quellcode:
for i:=0 to Anzahl-1 do
  begin
  {x,y festlegen}
  Bilderup.Add(TImage.Create(Form1));
  with (Bilderup.Items[i] as TImage) do
    begin
    Picture.LoadFromFile(...);
    Left:=x;
    Top:=y;
    Width:=133;
    Height:=100;
    Parent:=PicsAtServer;
    Center:=True;
    end;
  Bilderupname.Add(TLabel.Create(Form1));
  with (Bilderupname.Items[i] as TLabel) do
    begin
    Caption:=IntToStr(i+1)+'.jpg';
    AutoSize:=True;
    Left:=x+(133-Width) div 2;
    Top:=y+103;
    Parent:=PicsAtServer;
    end;
  end;
So erzeuge ich jetzt die Images und Labels und dann zum freigeben
Delphi-Quellcode:
Bilderup.Clear;
Bilderupname.Clear;
Oder mache ich da was falsch?

Edit: Ich glaube ich werde mein Programm noch einmal von vorn anfangen, den wenn ich den Code zum erzeugen und freigeben in ein anderes Programm packe geht es, also werde ich irgendwo einen anderen Fehler haben.
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#24

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 17:14
Zitat:
TWinControls zerstören im Destruktor auch ihre Child-Controls.
Na das ist mal wieder ein klassischer Fall von fundiertem Halbwissen. Components zerstören ihre 'child' Components (also alle, deren Owner-Property auf das zerstörte Component weist). Die Control-Hierarchie hat nur was mit Parents zu tun, nicht mit Besitzrechten.

Da die Labels und Images mit der Form als Owner erstellt wurden müssen sie überhaupt nicht manuell freigegeben werden (ausser die Freigabe findet ausserhalb des Formulardestruktors statt). Allerhöchstens muss das Array mit Nilen gefüllt werden.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#25

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 17:39
Hallo,

mit TLabel.Create(NIL) wird das Label nicht in die
Komponents-Liste des Forms eingetragen.


Heiko
Heiko
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 18:18
komisch ich habe jetzt das ganze nochmal neu gemacht also neue Anwendung und dann jede Procedure erstellt und rüber kopiert und jetzt geht es, der Fehler tritt nicht mehr auf.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#27

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 21. Jun 2007, 18:55
Hallo Sidorion,

Zitat:
Na das ist mal wieder ein klassischer Fall von fundiertem Halbwissen.
...oder einer falsche Einschätzung deinerseits aufgrund meiner unglücklichen Formulierung. Hätte ich von "untergeordneten Controls" statt "Child-Controls" gesprochen, wäre hoffentlich klar gewesen, worauf ich hinaus wollte:

Zitat von TWinControl.Destroy:
Delphi-Quellcode:
[...]
I := ControlCount;
while I <> 0 do
begin
  Instance := Controls[I - 1];
  Remove(Instance);
  Instance.Destroy; // <---
  I := ControlCount;
end;
Ich hegte den Verdacht, daß der Parent (nicht Owner!) der Labels vorzeitig freigegeben wird und damit seine untergeordneten(!) Controls ebenfalls vernichtet. Dies hätte im dynamischen Array ungültige Referenzen hinterlassen. Der Versuch, über diese Referenzen eine erneute Freigabe mittels Free durchzuführen, hätte dann zu einer Schutzverletzung geführt.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#28

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 22. Jun 2007, 10:03
Nach Deinem ersten Post hätte ich die Fehlinterpretation meinerseits durchaus eingestanden, aber Dein zweiter Post beweist meine Annahme als richtig.
Wird ein COMPONENT zerstört, trägt es sich selbsttätig aus der Components-Liste seines Owners aus und zerstört seine eigenen Components mit(vor seiner eigenen Vernichtung).
Ist Ein Component obendrein noch ein CONTROL, so trägt es sich aus der Controls-Liste seines PARENTS aus und schreibt in die Parent-Eigenschaft aller seiner Controls ein Nil. Da wird nix vernichtet.

Die Component-Hierarchie ist eine Besitzanzeigende, die Control-Hierarchie eine Lagebeschreibende. Das einzige was da passieren kann, ist dass die Untergeordneten unsichtbar werden, da der Parent flöten geht. Zudem können sich diese beiden Hierarchien stark unterscheiden. In einem über Designer generierten Formular, ist immer die Form der Owner von allen Components, die Parents können sich aber stark unterscheiden (z.B. PageControl).

Nichtsdestotrotz hast Du mit dem Verdacht der ungültigen Referenzen im Array völlig recht.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#29

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 22. Jun 2007, 10:50
Zitat von Sidorion:
Ist Ein Component obendrein noch ein CONTROL, so trägt es sich aus der Controls-Liste seines PARENTS aus und schreibt in die Parent-Eigenschaft aller seiner Controls ein Nil.
Soweit richtig, das passiert in Remove (Instance).

Zitat:
Da wird nix vernichtet.
Nun wird's meiner Meinung nach falsch. Der Befehl zur Vernichtung (Instance.Destroy) folgt direkt auf den zum Austragen, siehe Beitrag #27.

Hier ein kleiner Codeauszug zum Testen:

Delphi-Quellcode:
interface

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    btnKillPanel: TButton;
    btnKillEdit: TButton;
    procedure btnKillEditClick(Sender: TObject);
    procedure btnKillPanelClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    EditReference : TEdit;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnKillPanelClick(Sender: TObject);
begin
  Panel1.Free;
end;

procedure TForm1.btnKillEditClick(Sender: TObject);
begin
  EditReference.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  EditReference := Edit1;
end;
Wir haben ein Panel, auf diesem Panel liegt ein Edit-Control (Edit1.Owner = Form1, Edit1.Parent = Panel1). Mit btnKillPanel wird nun das Panel zerstört. Kurz vor seinem Tod zerstört es das auf ihm liegende Edit-Control. Dies geschieht im Destruktor von TWinControl, wie du leicht durch Einbindung der Debug-DCUs nachvollziehen kannst. Die private Referenz EditReference ist nun ungültig, ein anschließender Druck auf btnKillEdit führt zur Access Violation.

Diese kleine Simulation zeigt eine Möglichkeit auf, wie der Fehler im Programm von hugo1990 entstehen kann. EditReference entspricht dem dynamischen Array, btnKillEditClick steht für die manuelle Freigabe. Nun wäre nur noch das Gegenstück zu btnKillPanelClick in seinem Code aufzuspüren. Aber scheinbar ist Hugos Problem ja keines mehr...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#30

Re: Fehler beim freigeben dynamisch erzeugter TLabels

  Alt 22. Jun 2007, 12:32
Bei Gott Du hast Recht Wie kommen Die denn auf DAS schmale Brett????
Was passiert denn dann bei sowas:
Delphi-Quellcode:
  [..]
   TestEdit:=TEdit.Create(Form1);
   TestPanel:=TPanel.Create(TestEdit);
   TestPanel.Parent:=Self;
   TestEdit.Parent:=TestPanel;
   TestPanel.Free;
  [..]
Das Edit ist control vom Panel und das Panel component vom Edit. Beide geben sich gegenseitig frei, da musses doch Krachen!
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 17:50 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