Einzelnen Beitrag anzeigen

Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Dynamische Packages - Forms anzeigen - Leak

  Alt 12. Jan 2016, 15:59
Das mit dem ausgelagerten Anzeigen ist eine gute Idee.
Danke.
Hilft allerdings noch nicht gegen das problem, dass non-modale Forms nicht korrekt angezeigt werden.

Und das eigentliche Problem, dass durch die Klassenregistration Speicher geleakt zu werden scheint.

Delphi-Quellcode:
Initialization

  Registerclass(TTestform); // hier

Finalization

  Unregisterclass(TTestform);
Ich versuchs mal naiv:

Du hast da Deine FormClass.

Wie wäre es, wenn Du die Funktion von diesem Typ machst?

Sowas in der Art:
Delphi-Quellcode:
Function Tplgfrm.Loadform(Parent: Tcomponent; Form: String; Modal: Boolean) : Tformclass;
  Begin
    Try
      Form := 'T' + Form;
      Result := TFormClass(GetClass(Form));
      If not Assigned(Result) Then
        Begin
          Raise Exception.Create('The form "' + Form + '" is not available.');
        End
      Else
        Begin
          With TComponentClass(Result).Create(Parent) As TCustomForm Do
            Try
              If Modal Then
                Showmodal
              Else
                Show;
            Finally
              // Free;
            End;
        End;
    Except
      Raise Exception.Create('Form could not be loaded.');
    End;
  End;
Im Programm wäre dann eventuell sowas möglich:
Delphi-Quellcode:
Procedure irgendwas;
Var
  FormClass : TFormClass;
begin
  FormClass := plgfrm.Loadform(Self,'FromWieAuchImmer', True);

  if Assigned(FormClass) then begin
    ...
    FormClass.Close;
    FormClass.Free;
  end;
end;
Wobei, das Anzeigen des Formulares würd' ich aus der Funktion rausnehmen und im aufrufenden Programm machen, dann kannst Du besser entscheiden, ob das Formular direkt nach dem ShowModal freigegeben wird oder nicht.

Bei 'nem Show kannst Du die Freigabe dann auch beim Beenden des Programmes machen (oder an anderer, sinnvoller Stelle), die variabel FormClass muss dann nur an entsprechender Stelle deklariert werden und nicht innerhalb der Prozedur, die das Formular "anfordert".

Geändert von Sequitar (12. Jan 2016 um 16:06 Uhr)
  Mit Zitat antworten Zitat