Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objektablage zum Teil instabil? (https://www.delphipraxis.net/62788-objektablage-zum-teil-instabil.html)

sir-archimedes 9. Feb 2006 15:17


Objektablage zum Teil instabil?
 
Hallo,

ich nutze jetzt das erste mal die Objektablage. Ich habe nämlich folgenden Form-Vererbungsstammbaum:
Delphi-Quellcode:
.
      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
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.

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,

roedel 9. Feb 2006 16:02

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

sir-archimedes 9. Feb 2006 16:19

Re: Objektablage zum Teil instabil?
 
Zitat:

Zitat von roedel
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 ich habe da eigentlich keine wirklichen Fehler drin... (Meine ich ;-)) Zumindest funktionieren die Sachen gut, wenn ich Delphi gerade neu gestartet habe. Daher sollte das fehlerfrei sein. Komisch ist nur, dass mein Delphi instabil zu werden scheint, wenn ich in den Basisklassen (also hier z.B. in TAMSForm) etwas ändere. Dann treten die Fehlermeldungen teilweise auf. Allerdings auch nicht immer...

Zitat:

Zitat von roedel
Also: ran ans Bugfixing. //ich weis, das is bäh

Mein Bugfixing ist momentan "Taskmanager=>BDS=>Prozess beenden", Delphi starten, weiterarbeiten. Nur nervt das auf die Dauer ;-)

Hansa 9. Feb 2006 16:37

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:

Zitat von dominik.boehm
Ich werde wohl nicht der einzige sein, der so seine Anwendung konzipiert, oder? ;-)

Doch. Zumindest fast. :mrgreen: Bei mir geht die Hierarchie allerdings in 2-stellige Bereiche. 8) Das geht sehr wohl und auch ohne Fehler. Und es ist alles festgelegt, von Label-Farben über Positionen, Tastatur/Mausbehandlung, eigene Prozeduren usw. Gestern hat mir z.B. ein Label "Station-Nr" nicht mehr gepaßt, weil es zu hellblau war. :lol: Das steht aber auf 100 Forms. Das ist jetzt clNavy durch Änderung an EINER einzigen (richtigen) Stelle. Alternativ könnte man natürlich auch die 100 Forms einzeln ändern. :lol:

sir-archimedes 9. Feb 2006 16:58

Re: Objektablage zum Teil instabil?
 
Okay, ich versorge euch dann mal mit Code:

Zunächst das Formular aus dem Package (pkgForms.bpl):
Delphi-Quellcode:
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.
Registrieren tue ich es so (pkgFormsD.bpl):
Delphi-Quellcode:
unit uAMSFormReg;

interface
uses uAMSForm, Classes, DesignIntf, DesignEditors;

procedure Register;

implementation

procedure Register;
begin
  RegisterCustomModule(TAMSForm, TCustomModule);
end;

end.
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.
Delphi-Quellcode:
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.
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):
Delphi-Quellcode:
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.
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.

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 21:01 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