![]() |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Hallo,
Poste noch mal die Erzeugung und Freigabe Heiko |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
@ helmi
jop, das einzige was anders ist, ist das Parent @ hoika Erzeugung:
Delphi-Quellcode:
PicsAtServer ist eine TScrollBox;
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; 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; |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Ok ich habe jetzt rausgefunden, wie das mit der TComponentList geht, aber der Fehler kommt immer noch.
Delphi-Quellcode:
So erzeuge ich jetzt die Images und Labels und dann zum freigeben
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;
Delphi-Quellcode:
Oder mache ich da was falsch?
Bilderup.Clear;
Bilderupname.Clear; 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. |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Zitat:
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. |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Hallo,
mit TLabel.Create(NIL) wird das Label nicht in die Komponents-Liste des Forms eingetragen. Heiko |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
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.
|
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Hallo Sidorion,
Zitat:
Zitat:
Gruß Hawkeye |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
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. |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Zitat:
Zitat:
Hier ein kleiner Codeauszug zum Testen:
Delphi-Quellcode:
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.
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; 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 |
Re: Fehler beim freigeben dynamisch erzeugter TLabels
Bei Gott Du hast Recht :shock: Wie kommen Die denn auf DAS schmale Brett????
Was passiert denn dann bei sowas:
Delphi-Quellcode:
Das Edit ist control vom Panel und das Panel component vom Edit. Beide geben sich gegenseitig frei, da musses doch Krachen!
[..]
TestEdit:=TEdit.Create(Form1); TestPanel:=TPanel.Create(TestEdit); TestPanel.Parent:=Self; TestEdit.Parent:=TestPanel; TestPanel.Free; [..] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 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