Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen (https://www.delphipraxis.net/192714-android-arc-disposeof-dynamisch-erstellte-komponente-entfernen.html)

pmros 12. Mai 2017 20:00

Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen
 
Hallo erst mal,

ich habe mich jetzt schon tot gesucht zu dem Thema und alle Lösungen die es gibt funktionieren nicht.

Ich generiere zwei TRectangle und einen TButton bei Berührung eines Buttons. Das "InvisiblePanel" ist nicht sichtbar und soll dafür da sein, herauszufinden wann außerhalb des zweiten Rectangles (dem MenuPanel) gedrückt wird.

Delphi-Quellcode:
procedure TForm1.MenuPanel;
var
MP:TRectangle;
IP:TRectangle;
BtnConfig:TButton;
begin
      if FindComponent('InvisiblePanel') = nil then
      begin
      //-------------------------------------------> Inivisble Panel
      IP:=TRectangle.Create(self);
      IP.Parent:=Form1;
      IP.Name:='InvisiblePanel';
      IP.Width:=Form1.Width;
      IP.Height:=Form1.Height;
      IP.Position.X:=0;
      IP.Position.Y:=0;
      IP.OnClick:=InvisibleClick;
      IP.Fill.Color:=StringToAlphaCOlor('null');


      //-------------------------------------------> Menu Panel
      MP:=TRectangle.Create(self);
      MP.Parent:=Form1;
      MP.Name:='MenuPanel';
      MP.Width:=300;
      MP.Height:=300;
      MP.Position.X:=Form1.Width-300;
      MP.Position.Y:=73;


      //------------------------------------------> Buttons
      BtnConfig:=TButton.Create(self);
      BtnConfig.Parent:=Form1;
      BtnConfig.Name:='ButtonConfig';
      BtnConfig.Width:=300;
      BtnConfig.Height:=50;
      BtnConfig.Position.X:=Form1.Width-300;
      BtnConfig.Position.Y:=73;
      //BtnConfig.OnClick:=ConfigClick;
      BtnConfig.ComponentIndex:=2;
      BtnConfig.Text:='Einstellungen';

      end
In der InvisibleClick Prozedur sollen dann eigentlich nur ButtonConfig, InvisiblePanel und MenuPanel entfernt werden.

Versuch 1:

Delphi-Quellcode:
procedure TForm1.InvisibleClick(Sender: TObject);
var
MP,IP:TRectangle;
BtnConfig:TButton;
begin

IP:=FindComponent('InvisiblePanel') as TRectangle;
MP:=FindComponent('MenuPanel') as TRectangle;
BtnConfig:=FindComponent('ButtonConfig') as TButton;

IP.DisposeOf;
MP.DisposeOf;
BtnConfig.DisposeOf;
end;
Die App crasht unter Android.

Versuch 2 (Ich lass den ersten Teil der Prozedur mal weg):

Delphi-Quellcode:
IP.Parent:=nil;
IP:=nil;
IP.DisposeOf;

MP.Parent:=nil;
MP:=nil;
MP.DisposeOf;

BtnConfig.Parent:=nil;
BtnConfig:=nil;
BtnCOnfig.DisposeOf;
Die App crasht unter Android.

Versuch 3:

Delphi-Quellcode:
IP:=nil;
IP.Owner.RemoveComponent(IP);
IP.free;

MP:=nil;
MP.Owner.RemoveComponent(MP);
MP.free;

BtnConfig:=nil;
BtnConfig.Owner.RemoveComponent(BtnConfig);
BtnConfig.free;
Natürlich Crash.

Solange ich nicht versuche
Delphi-Quellcode:
IP.DisposeOf;
auszuführen, geht alles gut.

Delphi-Quellcode:
MP.DisposeOf;
BtnConfig.DisposeOf;
funktionieren.

Hat jemand eine Idee? :?

Darlo 12. Mai 2017 22:58

AW: Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen
 
Naja, Du gibts während des Events das ausführende Control frei. Starte einen Timer im OnClick der nach 1 Sekunde das Panel frei gibt.

pmros 13. Mai 2017 10:29

AW: Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen
 
Mir war gar nicht beswusst, dass das zu Poblemen führen kann. Unter Windows hat das immer funktioniert, auch wenn ich verstehe warum das eigentlich nicht wirklich der richige Weg ist.

Aber gibt es denn keine - sagen wir mal - elegantere Lösung dafür? Ich könnte im OnClick Ereignis sagen, dass das Panel außerhalb des sichtbaren Bereiches verschoben wird, damit die Elemente darunter wieder erreichbar werden, aber das würde unnötig Resourcen verschwenden wenn ich das Panel nicht frei gebe.

Das mag jetzt vielleicht für das Projekt nicht so wichtig sein und mein Code eh noch nicht sehr sauber, aber ich würde trotzdem gerne eine saubere Lösung haben.

Aber danke schon mal für den Hinweis!

Bernhard Geyer 13. Mai 2017 12:29

AW: Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen
 
Zitat:

Zitat von pmros (Beitrag 1371237)
Mir war gar nicht beswusst, dass das zu Poblemen führen kann. Unter Windows hat das immer funktioniert,

Das war dann pures Glück.

Zitat:

Zitat von pmros (Beitrag 1371237)
Aber gibt es denn keine - sagen wir mal - elegantere Lösung dafür?

In solchen Fälle verlager ich die Löschfunktion in einen Eventhandler den ich per PostMessage(self.handle, UM_MyDefinedIDToDelete, 0, 0) von Windows aufrufen lassen.

pmros 13. Mai 2017 12:38

AW: Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1371246)
den ich per (...) von Windows aufrufen lassen.

Ob das unter Android läuft...?

sko1 15. Mai 2017 09:57

AW: Android ARC / DisposeOf - dynamisch erstellte Komponente entfernen
 
Zitat:

Ich könnte im OnClick Ereignis sagen, dass das Panel außerhalb des sichtbaren Bereiches verschoben wird, damit die Elemente darunter wieder erreichbar werden, aber das würde unnötig Resourcen verschwenden wenn ich das Panel nicht frei gebe.
Was für Ressourcen verschwendest Du denn da?
Die paar Byte würden mich überhaupt nicht stören, Panel bei Nichtnutzung zur Seite schieben, bei Programmende aufräumen...

Ciao
Stefan


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