AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim freigeben von Komponenten

Ein Thema von BBoy · begonnen am 22. Mär 2010 · letzter Beitrag vom 22. Mär 2010
Antwort Antwort
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 12:28
Ich erzeuge zur Laufzeit komponenten

Delphi-Quellcode:
   RzStatusPane[i] := TRzStatusPane.Create(self);
   RzStatusPane[i].Parent := rzpanel73;
   RzStatusPane[i].Left := LeftPos;
   RzStatusPane[i].Top := TopPos;
   RzStatusPane[i].Width := 125;
   Rzstatuspane[i].ParentFont := True;
   Rzstatuspane[1].Name := 'rzstatuspane'+inttostr(i);
   RzStatusPane[i].Caption:= Produkt+': '+produktanz;
   Inc(TopPos,22);
Darauf stehen statusinformationen. Wenn diese Informationen sich ändern muss ich diese prozedur erneut aufrufen. Dabei werden aber neue RzStatuspanes erzeugt. um das zu verhindern mache ich folgendes:

Delphi-Quellcode:
  for i := 1 to 40 do
    if rzpanel73.FindComponent('rzstatuspane'+IntToStr(i)) as Trzstatuspane <> nil
    then begin
      rzstatuspane[i].Free;
      rzstatuspane[i] := nil;
    end;

  rzpanel73.Update;
aber das funktioniert nicht. die statuspanes werden nicht gelöscht vom panel weil die schleife nicht ausgeführt wird. also wird die kommponente nicht gefunden.

Weis jemand woran das liegt ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 12:33
Zitat:
Delphi-Quellcode:
Rzstatuspane[i].ParentFont := True;
   Rzstatuspane[1].Name := 'rzstatuspane'+inttostr(i);
Da steht einmal i und einmal 1. Überhaupt kommt mir das Vorgehen etwas merkwürdig vor. Wieso änderst Du nicht einfach die bestehenden Komponenten anstatt sie ständig freizugeben und neu zu erzeugen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#3

Re: Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 12:44
auch wenn ich die 1 in i ändere funktioniert das nicht.

Warum ich das so mache? Die anzahl der rzstatuspanes ändert sich bei jeder aktualisierung. mal sind es 10 mal 15 oder so. Daher dachte ich diese vorgehweise wäre angebracht.

Habe es mal testhalber so probiert:
Delphi-Quellcode:
for i := 1 to 40 do begin
try
rzstatuspane[i].Free;
rzstatuspane[i] := nil;
except
showmessage('test');
end;
end;

rzpanel73.Refresh;
form1.Refresh;
aber wenn ich dann versuche ein neues rzstatuspane zu erzeiugen wird gesagt das es schon vorhanden ist. also wurden die nicht gelöscht.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 13:17
Evtl. musst Du noch rzpanel73.RemoveComponent aufrufen, da die Komponenten wohl nicht automatisch aus dem Components-Array entfernt wreden.

[edit] Oder RemoveComponent des Owners, ich bin da gerade nicht ganz sicher. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

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

Re: Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 13:25
Hallo,

irgendwie schmeißt du hier mehrere Sachen zusammen.

RzStatusPane[i] := TRzStatusPane.Create(self); Self wird hier der Owner des neuen Panes.
Damit steht das in desses Components-Liste und wird
beim beenden des Self mit gelöscht.

Delphi-Quellcode:
for i := 1 to 40 do
begin
  if rzpanel73.FindComponent('rzstatuspane'+IntToStr(i)) as Trzstatuspane <> nil then
  begin
    rzstatuspane[i].Free;
    rzstatuspane[i] := nil;
  end;

end;
Und wieder ein Fall für as
Wozu soll das an dieser Stelle gut sein ?
Warum nimmst du keine lokale Variable ?

Delphi-Quellcode:
    rzstatuspane[i].Free;
    rzstatuspane[i] := nil;
OK, dein Statuspane ist gelöscht, aber es steht immer noch in der Components-Liste von Self drin.


Ich würde hier das Löschen gleich ganz übernehmen (also auch im FormDestroy).

Also mit NIL erzeugen

RzStatusPane[i] := TRzStatusPane.Create(NIL);
Update: Merde, zu langsam


Heiko
Heiko
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#6

Re: Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 13:58
Zitat von hoika:
Merde, zu langsam
On ne dit pas « merde ».
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Hawkeye219

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

Re: Probleme beim freigeben von Komponenten

  Alt 22. Mär 2010, 14:20
Hallo,
Zitat von hoika:
OK, dein Statuspane ist gelöscht, aber es steht immer noch in der Components-Liste von Self drin.
Nein, auch diese Referenzen wären entfernt worden, dafür sorgt die VCL. Da aber - wie du richtig angemerkt hast - das Panel nicht der Owner der Panes ist, liefert die Suchschleife kein Ergebnis, und die Free-Methode der Panes wird nicht aufgerufen.

Eine mögliche Lösung wäre die Verwendung der Klasse Delphi-Referenz durchsuchenTComponentList aus der Unit Contnrs. Wenn sie statt des Arrays verwendet wird, um die Referenzen zu speichern, genügt ein einziger Aufruf der Clear-Methode, um alle Panes zu entfernen.

Gruß Hawkeye
  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 09:42 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