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/)
-   -   Delphi 10.2 Firemonkey OS X Frame zerstören (https://www.delphipraxis.net/195663-delphi-10-2-firemonkey-os-x-frame-zerstoeren.html)

Loko789 16. Mär 2018 07:28

Delphi 10.2 Firemonkey OS X Frame zerstören
 
Hallo,
In meiner Anwendung habe ich die einzelnen Bereiche in Frames aufgeteilt. Dieser werden zur Laufzeit (je nachdem welchen Programmpunkt man gewählt hat)erstellt und wieder zerstört. Dies sieht wie folgt aus:
Delphi-Quellcode:
//code...
var
famContent:TFrame; {<-- ist global deklariert}
//code...
procedure TfrmMain.LoadFrame(TagID: Integer);
begin

  if famContent <> nil then
    famContent.free; {<-- Error}
   
  tthread.CreateAnonymousThread(
    procedure
    begin
      try
        case TagID of
          1: // Benutzer
            begin
              famContent := TfamProfil.Create(lyContent);
              (famContent as TfamProfil).StartUp;
            end;
          3: // projekt
            begin
              famContent := TfamProjekt.Create(lyContent);
              (famContent as TfamProjekt).StartUp;
            end;
        end;
      except
        on E: Exception do
          tthread.Synchronize(nil,
            procedure
            begin
              LostConnection;
            end);
      end;

      famContent.Parent := lyContent;
      famContent.Align := TAlignLayout.client;

      tthread.Synchronize(nil,
        procedure
        begin
          mdlClient.initLang(famContent);
          mvMenue.HideMaster;
        end);
    end).Start;
end;
Nun bekomme ich immer beim famContent.free eine access violation. Unter Windows Funktioniert das ohne Probleme aber unter OS X bekomme ich immer eine access violation. Gibt es eine andere Möglichkeit das Frame freizugeben?

Danke
Gruß
Loko

Darlo 16. Mär 2018 19:44

AW: Delphi 10.2 Firemonkey OS X Frame zerstören
 
Probier mal:

Delphi-Quellcode:
{$IFDEF MACOS}
xyz.disposeof;
{$ELSE}
xyz.free;
{$ENDIF}

himitsu 17. Mär 2018 00:00

AW: Delphi 10.2 Firemonkey OS X Frame zerstören
 
Delphi-Quellcode:
if Assigned(famContent) then
  famContent.Free;
Free prüft intern schon auf nil, aber wenn zusätzlich sowieso irgendwo auf nil geprüft wird, dann sollte/muß man die Variable auch immer leeren!
Delphi-Quellcode:
FreeAndNil(famContent);


Ansonsten hat Darlo leider schon gezeigt, dass man IMHO hier bissl Mist gebaut hat, als jemand auf die schwachsinnige Idee kam, dass unter ARC das Free rein garnichts mehr macht und man totalinkompatibel stattdessen was Neues verwenden muß.
Delphi-Quellcode:
famContent.DisposeOf;
, aber da die Objektvariablen bei ARC wie Interfaces arbeiten, reicht an vielen Stellen auch
Delphi-Quellcode:
famContent := nil;
.

Delphi-Quellcode:
procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;
Aber zum Glück macht DisposeOf ohne ARC das Selbe wie Free ... nur blöd, dass diese Methode in alten Delphis nicht existiert und man so keine schönen ach so super abwärtskompatible Codes schreiben kann, wie es immer beworben wurde. :evil::?

Loko789 19. Mär 2018 07:45

AW: Delphi 10.2 Firemonkey OS X Frame zerstören
 
Super! Vielen Dank.
Funktioniert jetzt ohne Probleme. Bekomme keine Fehlermeldung mehr.

Jetzt muss ich kurz was zitieren:
Delphi…
Zitat:

Was kannst du eigentlich!?
Der Schuh des Manitu


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