Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

Frames auf PageControl oder Form ! Ich werd verrückt

  Alt 19. Jul 2004, 16:14
Hi Leute,

ich habe eine Frame-Klasse, die ich je nach Einstellungen dynamisch auf eine Form oder auf eien Tab-Sheet eines PageControls setze.
Das ganze funktioniert eigentlich auch wunderbar, aber :

Zu Verwaltung der einzelnen Frames, habe ich diese in einem TList Objekt gespeichert mit diversen Zusatz-Information, so sieht meine KLasse aus die ich in der TLIst speichere :

Code:
  TChatWindowData = class
    private                        
      // Optische Darstellungselemente
      fFreeInProgress : Boolean; // SChalter, ob dieses Element sich gerade schon in der Freigabe befindet
      fFrame         : TfraChatWindow; // Der Frame selber
      fForm          : TfrmChatWindow; // Falls der Frame auf einer Form sitzt, dann ist es diese
      fTabSheet      : TTabsheetes;   // Falls der Frame auf einem Tab sitzt, dann dieser
      fMultiChat     : TfrmMultiChat; // Form auf dem sich die Tabshetts befinden
      // Daten von Chat-Partner
      fID            : Longint;
    protected
      {}
    public
      Constructor Create;
      Destructor Destroy; override;

      property FreeInProgress : Boolean  read fFreeInProgress write fFreeInProgress;
      property Frame : TfraChatWindow    read fFrame         write fFrame;
      property Form : TfrmChatWindow    read fForm          write fForm;
      property Tab  : TTabSheetes       read fTabSheet      write fTabSheet;
      property MultiChat : TfrmMultiChat read fMultiCHat write fMultiCHat;
      property ID   : Longint           read fID            write fID;

      function FrameIsOnTab : Boolean;
      function FrameIsinForm : Boolean;
   
  end;

constructor TChatWindowData.Create;
begin
  inherited;
  fFreeInProgress := false;
  fFrame   := Nil;
  fForm    := Nil;
  fTabSheet := Nil;
  fMultiChat:= Nil;
  fID      := 0;
  //fLastMsg := 0;
end;

destructor TChatWindowData.Destroy;
begin
  fForm := nil;
  fTabSheet := nil;
  fFrame := nil;
  fMultiChat := nil;
  inherited;
end;
An dieser Klasse ist ja nicht besonders dran, ich brauche sie nur zur Verwaltung der einzelnen Frames !
Jetzt habe ich das Problem, das meine TChatWindowData-Objekte in meiner T-List ja auch wieder sauber entfernt werden müssen. Jetzt ist aber die Frage wann und wo meine Einträge aus der Liste entfernen ?

Den Destructor meines Frames habe ich überschrieben, und versuche dann im Destroy des Frames in meinem T-List Objekt den entsprechenden Frame zu finden und den Eintrag zu entfernen.

Da aber das schliessen bzw. die Freigabe der Form von verschiedenen Stellen aufgerufen werden kann, beißt die Katze sich immer wieder selber in den Schwanz, damit meine ich :

Sitzt der Frame auf einer Form können folgende Varianten auftreten :
1. Main-Form wird geschlossen, d.h. in Close der Main-Form rufe ich Clear meiner Liste auf, dieses geht hin und gibt alle geöffneten Form und Ihre Frames frei, dabei wird dann aber auch wieder der Destructor des Frames aufgerufen. Der widerum auch versucht die Forms freizugeben und seinen Frame-Eintrag aus der Liste zu entfernen.

2. Eine bestimmte Form wird geschlossen, im OnClose setzte ich die OnCloseACtion auf caFree, so das der FRame auch wieder mit freigegeben wird, und dann destructor von frame ....

3. Das Close kommt aus dem Frame(Button) selber, jetzt kann ich nicht einfach meinen Frame-Eintrag mit aus der Liste entfernen, sondern muss die Form auf der der Frame sitzt ja auch mit schliessen/Freigeben, wodurch sich wieder alles überschneidet.

Ich weiß nicht, on aus meiner ERklärung mein Problem ersichtlich wird, aber das ganze ist wie ein Teufelskreis, behabe ich einen Fehler, tritt dieser Fehler wird an anderer Stelle auf und so bekomme ich immer Zugriffsverletzungen oder "Abstrakte Fehler".
Jetzt bitte nicht sagen, "debug das ganze doch mal", denn das tue ich schon seit einem Tag

Der Fehler ist mit Debuggen leider nicht zu finden, ich habe z.B. meine Procedure meines Close Buttons auf meinem Frame, es werden alle Anweisungen und DEstructoren sauber aufgerufen, gehe ich dann mit F8 ans Ende der Procedure gibt halt die oben genannten Fehlermeldungen.
Benutze ich F7 dann lade ich sporadisch in diversen überschriebenen WncProc von diversen Komponenten.
Bei plazieren der Frames auf Forms habe ich mittlerweile ne total buggy Lösung gefunden, aber nur durch Try and Error, aber bei den Tabsheets komme ich echt nicht weiter.
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat