![]() |
Objektablage zum Teil instabil?
Hallo,
ich nutze jetzt das erste mal die Objektablage. Ich habe nämlich folgenden Form-Vererbungsstammbaum:
Delphi-Quellcode:
Soweit so gut - ich kann ohne Probleme solche Formen erstellen. Nun fällt es mir aber teilweise auf, dass ich noch einen Fehler in einem übergeordneten Formular habe. Ändere ich dort etwas, erhalte ich Fehlermeldungen, wie "Vorfahr für Formular XY nicht gefunden" bzw. Schutzverletzungen. Starte ich Delphi dann neu, scheint es zu gehen. Nur bin ich mir nicht sicher, ob die Fehler immer mit Änderungen zusammenhängen.
.
AMSForm // hat nur ein paar neue Eigenschaften/Methoden für den OI (in Package ausgelagert/registriert) | AMSBaseForm // Stellt das Basisformular für Fenster meiner Anwendungen dar / \ DialogForm MDIForm // Formen für Dialoge (Modal, Header, etc.) bzw. MDI-Fenster (Routinen zum Update von Toolbars) | PaneledMDIForm // Hat schon den Aufbau mit links Panel für Datensatzauswahl, Mitte Panel für Details Daher meine Frage, ob ein solcher Aufbau bei euch problemfrei funktioniert. Ich werde wohl nicht der einzige sein, der so seine Anwendung konzipiert, oder? ;-) Viele Grüße, |
Re: Objektablage zum Teil instabil?
Hallo,
selbst Objekte erstellen und die dann noch weiter vererben ist zwar ansich nicht schwer, aber man kann ne Menge Fehler machen. Ich hatte selbst schon mal ne noch größere Objekthierarchie am Wickel. Also: ran ans Bugfixing. //ich weis, das is bäh Gruß Roedel |
Re: Objektablage zum Teil instabil?
Zitat:
Zitat:
|
Re: Objektablage zum Teil instabil?
Ohne Source wird Dir kaum einer was sagen können. Zeige mal die Klassendefinition der Form und der aus der Objektablage kommenden. Letztere sollte nur noch die Eigenschaften und Methoden enthalten, die nicht schon im Vorgänger definiert oder im OI festgelegt sind. Aber ich sags Dir gleich : helfen wird kaum jemand, weil die Objektablage entweder gar nicht oder falsch verwendet wird (z.B. falsche Fummeleien an der DFM bis nichts mehr geht) und dann letztenendes in der Versenkung verschwindet. 8)
Edit (überlesen) : Zitat:
|
Re: Objektablage zum Teil instabil?
Okay, ich versorge euch dann mal mit Code:
Zunächst das Formular aus dem Package (pkgForms.bpl):
Delphi-Quellcode:
Registrieren tue ich es so (pkgFormsD.bpl):
unit uAMSForm;
interface uses Forms, Windows, SysUtils, Classes; type EDialogExecuteAbort = Exception; TDialogExecuteEvent = procedure(Sender: TObject; var stop : boolean) of Object; TAMSForm = class(TForm) private { Private-Deklarationen } FOnPrepare : TDialogExecuteEvent; FOnReActivate : TNotifyEvent; public { Public-Deklarationen } function ExecuteModal : Integer; dynamic; procedure ShowPrepared; dynamic; procedure ReActivate; dynamic; constructor Create(AOwner : TComponent); override; published property OnPrepare : TDialogExecuteEvent read FOnPrepare write FOnPrepare; property OnReActivate : TNotifyEvent read FOnReActivate write FOnReActivate; end; implementation { TAMSForm } constructor TAMSForm.Create(AOwner: TComponent); begin inherited; // Activate Hints for all descended forms ShowHint := true; end; function TAMSForm.ExecuteModal: Integer; var Stop : Boolean; begin Stop := false; if Assigned(onPrepare) then onPrepare(self, Stop); if Stop then raise EDialogExecuteAbort.Create(Format('Starten des Formulares "%s" abgebrochen',[ClassName])); Result := ShowModal; end; procedure TAMSForm.ReActivate; begin if Assigned(OnReActivate) then OnReActivate(self); BringToFront; end; procedure TAMSForm.ShowPrepared; var Stop : Boolean; begin Stop := false; if Assigned(onPrepare) then onPrepare(self, Stop); if Stop then raise EDialogExecuteAbort.Create(Format('Starten des Formulares "%s" abgebrochen',[ClassName])); Show; end; end.
Delphi-Quellcode:
Dann noch z.B. die AMSBaseForm, die in der Objektablage liegt: (Da ist noch nicht wirklich viel drin. Habe diese Klasse angelegt, um spätere Erweiterungen an einer Basisklasse, die im Hauptprojekt liegt durchführen zu können.
unit uAMSFormReg;
interface uses uAMSForm, Classes, DesignIntf, DesignEditors; procedure Register; implementation procedure Register; begin RegisterCustomModule(TAMSForm, TCustomModule); end; end.
Delphi-Quellcode:
Dann noch evtl. die MDI-Klasse (Diese soll dafür selbst sorgen, dass ihre Actions in eine Toolbar eingetragen werden. Den Mechanismus werde ich aber wahrscheinlich noch so austauschen, dass ich nicht direkt auf die Mainform zugreife, sondern eine Toolbar übergebe):
unit uAMSBaseForm;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, fMainForm, uAMSForm; type TAMSBaseForm = class(TAMSForm) protected { Private-Deklarationen } MainForm : TAMSMainForm; public { Public-Deklarationen } constructor Create(AOwner : TComponent); override; end; implementation {$R *.dfm} { TAMSBaseForm } constructor TAMSBaseForm.Create(AOwner: TComponent); begin inherited; if AOwner IS TAMSMainForm then MainForm := AOwner AS TAMSMainForm; end; end.
Delphi-Quellcode:
Ich höre an dieser Stelle mal auf - die beiden letzten Formen sind auf jeden Fall in der Objektablage eingetragen. In den dfm-Dateien habe ich gar nichts geändert, da mir das die Objektablage eigentlich völlig richtig automatisch macht.
unit uMDIForm;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uAMSBaseForm, ActnList, TBX; type TMDIForm = class(TAMSBaseForm) FormActions: TActionList; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormActivate(Sender: TObject); private { Private-Deklarationen } public Constructor Create(AOwner : TComponent); override; end; TMDIFormClass = class of TMDIForm; implementation {$R *.dfm} procedure TMDIForm.FormClose(Sender: TObject; var Action: TCloseAction); begin inherited; Action := caFree; if Assigned(MainForm) AND (Assigned(MainForm.MDIToolbar)) then begin MainForm.MDIToolbar.BeginUpdate; MainForm.MDIToolbar.Items.Clear; MainForm.MDIToolbar.Visible := false; MainForm.MDIToolbar.EndUpdate; end; end; constructor TMDIForm.Create(AOwner : TComponent); begin inherited; WindowState := wsMaximized; end; procedure TMDIForm.FormActivate(Sender: TObject); var Item : TTBXItem; I : Integer; begin inherited; if Assigned(MainForm) then begin MainForm.MDIToolbar.BeginUpdate; MainForm.MDIToolbar.Items.Clear; for I := 0 to FormActions.ActionCount - 1 do begin Item := TTBXItem.Create(MainForm.MDIToolbar); Item.Action := FormActions.Actions[I]; MainForm.MDIToolbar.Items.Add(Item); end; MainForm.MDIToolbar.Visible := MainForm.MDIToolbar.Items.Count > 0; MainForm.MDIToolbar.EndUpdate; end; end; end. In den Formen die dadrunter abgeleitet liegen (z.B. PaneledMDIForm) kommen nur noch ein paar Panels hinzu, die steuern, wie die Fenster aufgebaut sind. Die angesprochene DialogForm hat noch einen OK und einen Abbrechen-Knopf und entsprechende Ereignisbehandlungsmechanismen, aber das ist wohl hier nicht weiter entscheidend. Jetzt bin ich ja mal gespannt, ob jemand sagen kann, wodurch hier so gewisse Instabilitäten auftreten können... Gruß, |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz