AGB  ·  Datenschutz  ·  Impressum  







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

Objektablage zum Teil instabil?

Ein Thema von sir-archimedes · begonnen am 9. Feb 2006 · letzter Beitrag vom 9. Feb 2006
Antwort Antwort
sir-archimedes

Registriert seit: 2. Jan 2006
Ort: Münster
167 Beiträge
 
Delphi 2006 Professional
 
#1

Objektablage zum Teil instabil?

  Alt 9. Feb 2006, 16:17
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,
  Mit Zitat antworten Zitat
roedel

Registriert seit: 8. Feb 2006
Ort: Senftenberg
31 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Objektablage zum Teil instabil?

  Alt 9. Feb 2006, 17:02
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
Steh' zu dem was du tust oder lass' es!
  Mit Zitat antworten Zitat
sir-archimedes

Registriert seit: 2. Jan 2006
Ort: Münster
167 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Objektablage zum Teil instabil?

  Alt 9. Feb 2006, 17:19
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 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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Objektablage zum Teil instabil?

  Alt 9. Feb 2006, 17:37
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 von dominik.boehm:
Ich werde wohl nicht der einzige sein, der so seine Anwendung konzipiert, oder?
Doch. Zumindest fast. 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. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
sir-archimedes

Registriert seit: 2. Jan 2006
Ort: Münster
167 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Objektablage zum Teil instabil?

  Alt 9. Feb 2006, 17:58
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ß,
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:57 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