AGB  ·  Datenschutz  ·  Impressum  







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

Dynamische Packages - Forms anzeigen - Leak

Offene Frage von "Bernhard Geyer"
Ein Thema von Sequitar · begonnen am 12. Jan 2016 · letzter Beitrag vom 13. Jan 2016
Antwort Antwort
Seite 2 von 2     12   
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
bepe

Registriert seit: 17. Okt 2006
119 Beiträge
 
#12

AW: Dynamische Packages - Forms anzeigen - Leak

  Alt 12. Jan 2016, 20:59
Das mit dem RegisterClass ist seltsam. Wie hast du deine Methode denn getestet wenn das Formular gar nicht registriert ist?

Aber mach mal im OnClose von deiner BPL Form Action := caFree; rein. Dann wird das Form beim Schließen freigegeben und das mit dem Leak sollte sich erledigt haben.

mfg,
bp
  Mit Zitat antworten Zitat
Sequitar

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

AW: Dynamische Packages - Forms anzeigen - Leak

  Alt 12. Jan 2016, 21:36
Das mit dem RegisterClass ist seltsam. Wie hast du deine Methode denn getestet wenn das Formular gar nicht registriert ist?

Aber mach mal im OnClose von deiner BPL Form Action := caFree; rein. Dann wird das Form beim Schließen freigegeben und das mit dem Leak sollte sich erledigt haben.
Naja, ich kann natürlich die Form nur anzeigen lassen, wenn sie auch registriert ist. Ansonsten
wird ja hier
Delphi-Quellcode:
    Form := Loadform(Application, 'Testform', True);
                  If Form <> Nil Then
                    With Form Do
                      Begin
                        Showmodal; // Leaks 176 bytes
                        Free;
                      End;
auch an entsprechender Stelle abgebrochen.


Da es sich bei einer Testform um ein komplett leeres (neu erstelltes) Formular ohne jeglichen code handelt, das nichts ausführt und keine komponenten hat, außer der Form selbst, dachte ich dass es nur an der Registierung hängen kann...Denkfehler?

Anmerkungen:

- Auch wenn ich bei bestehender Registrierung den gesamten Teil (..Loadform...) auslasse (i.e check ob loadform NIL ergibt) und die Form nicht lade, gibts ein Leck.

- Wenn die Form mehrmals nacheinander aufgerufen und wieder geschlossen wird, bleibt die Leckgröße konstant


Die Action:=cafree festzulegen, hat leider keinen Effekt gezeigt.

Geändert von Sequitar (12. Jan 2016 um 21:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Dynamische Packages - Forms anzeigen - Leak

  Alt 12. Jan 2016, 22:48
Und wieviel "Leak" wird es, wenn du die Form 100 Mal anzeigen lässt?
$2B or not $2B
  Mit Zitat antworten Zitat
Sequitar

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

AW: Dynamische Packages - Forms anzeigen - Leak

  Alt 13. Jan 2016, 09:00
Und wieviel "Leak" wird es, wenn du die Form 100 Mal anzeigen lässt?
Gerade getested: Kein unterschied, ob 1x 10x oder 1000x anzeigen lassen. Leak bleibt konstant.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Dynamische Packages - Forms anzeigen - Leak

  Alt 13. Jan 2016, 09:14
Gibts nicht ein bekanntes (noch nicht behobener) Leak beim Dynamischen Laden und Endladen von Packages?
ist also (wenn man nicht selbst Quellcode anpassen kann als "As Designed" anzusehen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:44 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