Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TLabel entfernen (https://www.delphipraxis.net/114255-tlabel-entfernen.html)

khh 22. Mai 2008 10:51


TLabel entfernen
 
hallo zusammen,
ich entferne im mousedown ereignis meines TLabel mit :
Application.ReleaseComponent(TComponent(self));
das entsprechende label wieder.
das funktioniert solange ich die Labels in der Reihenfolge in der sie erstellt wurden wieder entferne. Sobald ich die Reihenfolge ändere bekomme ich beim letzten Label das entfernt wird eine exception.

Was mach ich falsch?

Gruss KH

taaktaak 22. Mai 2008 11:01

Re: TLabel entfernen
 
Moin, Moin,
nehme an, dass dadurch das Array "Components" durcheinandergewürfelt wird. Vermutlich musst du das selbst nach jedem Löschvorgang reorganisieren, wenn die Reihenfolge willkürlich ist.

DP-Maintenance 22. Mai 2008 11:07

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Object-Pascal / Delphi-Language" nach "VCL / WinForms / Controls" verschoben.
Ist ne VCL Frage

khh 22. Mai 2008 11:34

Re: TLabel entfernen
 
@ralph
ich danke dir, werd ich prüfen

Gruss Kh

Nuclear-Ping 22. Mai 2008 12:05

Re: TLabel entfernen
 
Delphi-Quellcode:
Application.ReleaseComponent(TComponent(self));
... ist aber auch nicht ganz sauber ... ? :gruebel:

khh 22. Mai 2008 12:27

Re: TLabel entfernen
 
@mario

ich weiss dass das nicht "ganz sauber" ist :-(


nochmal konkret, wie es gerade ist:
ich erstelle per mausklick auf einer TCustomControl eine Tlabel.
im mousedown des TLabels will ich diese Labels jeweils wieder entfernen können.

Wie würdest _du_ das denn lösen ?

Gruss KH

mkinzler 22. Mai 2008 12:28

Re: TLabel entfernen
 
Ich kenne mich in Lazarus nicht so aus aber vielleicht
Delphi-Quellcode:
Self.Free;

Nuclear-Ping 22. Mai 2008 12:31

Re: TLabel entfernen
 
Ja, aber Self verweist doch auf die Form?
Delphi-Quellcode:
procedure TForm1.LabelMouseDown(Sender: TObject);
begin
  if (Sender is TLabel) then
    FreeAndNil (Sender);
end;
So vielleicht?

khh 22. Mai 2008 17:17

Re: TLabel entfernen
 
hallo zusammen
self verweist nicht auf die Form sondern auf TLabel.
Ist ja auch in der procedure TMyLabel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Das bewirkt aber wohl dass ich mir auf beide Arten, sowohl mit
freeandNil(self) oder self.free oder eben Application.ReleaseComponent(TComponent(self));
den Boden unter den füssen wegziehe. Das Ergebnis ist immer eine exception :-(

mh, wie also krieg ich das letzte label weg ?


Gruss KH

Fussball-Robby 22. Mai 2008 17:21

Re: TLabel entfernen
 
Zitat:

Zitat von khh
hallo zusammen
self verweist nicht auf die Form sondern auf TLabel.
Ist ja auch in der procedure TMyLabel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Nein. Die Procedure lautet TForm1.MyLabel.MouseDown. Self verweist immer auf die Instanz der Klasse, in der die Methode ausgeführt wird, und da das Label auf der Form liegt, zeigt Self auf die Form.

khh 22. Mai 2008 17:27

Re: TLabel entfernen
 
Hallo Robby,
Zitat:

Nein. Die Procedure lautet TForm1.MyLabel.MouseDown.
wer sagt das ?

Die Procedure lautet
TMyLabel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
und es ist eine Procedure in der Klasse MyLabel.
Und mein Debugger sagt mir unmissvertändlich, dass self mein Label ist ;-)


Gruss KH

sx2008 22. Mai 2008 19:51

Re: TLabel entfernen
 
Wenn dein Control sich selber zerstören soll, dann wird das gefährlich denn es können
immer noch interne Messages der VCL oder Windows-Messages an das Control gehen.
Aber das Control ist ja schon im IT-Himmel => Zugriffsverletzung
Code-Library: http://www.delphipraxis.net/internal...ct.php?t=29732

Nuclear-Ping 22. Mai 2008 19:58

Re: TLabel entfernen
 
Zitat:

Zitat von khh
Hallo Robby,
Zitat:

Nein. Die Procedure lautet TForm1.MyLabel.MouseDown.
wer sagt das ?

Die Procedure lautet
TMyLabel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
und es ist eine Procedure in der Klasse MyLabel.
Und mein Debugger sagt mir unmissvertändlich, dass self mein Label ist ;-)


Gruss KH

Dann sag dazu, dass du eine eigene Klasse von TLabel abgeleitet hast.

Schonmal Self.Release versucht?

khh 23. Mai 2008 18:43

Re: TLabel entfernen
 
Zitat:

Dann sag dazu, dass du eine eigene Klasse von TLabel abgeleitet hast
sorry, ich dachte das war schon klar :-(

Zitat:

Schonmal Self.Release versucht?
nee, noch nicht, werd ich mal versuchen

Gruss KH

khh 23. Mai 2008 18:45

Re: TLabel entfernen
 
Zitat:

Wenn dein Control sich selber zerstören soll, dann wird das gefährlich denn es können
na das muss doch aber trotzdem irgendwie gehen,oder ??
ok werds mal so probieren


Gruss KH

himitsu 23. Mai 2008 18:48

Re: TLabel entfernen
 
indem man etwas anderem sagt, es solle mich(TLabel) löschen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 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