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.