AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Polymorphie mit eigenen Frames: TabOrder nicht gefunden
Thema durchsuchen
Ansicht
Themen-Optionen

Polymorphie mit eigenen Frames: TabOrder nicht gefunden

Ein Thema von Neg · begonnen am 18. Jan 2004 · letzter Beitrag vom 22. Jan 2004
Antwort Antwort
Neg

Registriert seit: 16. Jan 2004
Ort: Berlin
63 Beiträge
 
Delphi 5 Professional
 
#1

Polymorphie mit eigenen Frames: TabOrder nicht gefunden

  Alt 18. Jan 2004, 19:14
Moin moin... Bin neu hier und hab auch gleich eine Frage.

Achtung, wird etwas länger, aber der größte Teil des Quellcodes zeigt nur den Kontext des Problems und kann schnell überflogen werden.

Also, in meinem Programm erstelle ich dynamisch zur Laufzeit Seiten für ein PageControl. Diese Seiten sehen folgendermaßen aus:
Delphi-Quellcode:
type
  TFileSheet = Class(TTabSheet)
    private
    FileName: String;
    Modified: Boolean;
    Mode: TGenerationMode;
    ID: integer;
    AddRule: TAdditionalRules;
    ContentFrame: TSheetFrame;
  end;
Der ContentFrame wird von verschiedenen Klassen, die von TSheetFrame abgeleitet wurden, instanziiert, z.B. so:
Delphi-Quellcode:
case Mode of
SimpleMode:
  begin
  SheetFrame:=TFrameSimpleMode.Create(FileSheet[c]);
  InitSheetFrame(SheetFrame as TFrameSimpleMode);
  end;
AdvancedMode:
  begin
  SheetFrame:=TFrameAdvMode.Create(FileSheet[c]);
  InitSheetFrame(SheetFrame as TFrameAdvMode);
  end;
// usw...
else SheetFrame:=NIL;
end; {of case}

FileSheet[c].ContentFrame:=SheetFrame;
SheetFrame.Parent:=FileSheet[c];
Ein TSheetFrame ist übrigens lediglich eine Interface-Klasse folgender Gestalt:
Delphi-Quellcode:
type
  TSheetFrame = Class(TFrame)
  public
      procedure RefreshLanguage; virtual; abstract;
  end;
Die Polymorphie ist eigentlich nur dafür gut, damit ich später, wenn man zur Laufzeit die Sprache umstellt, folgendes schreiben kann:
Delphi-Quellcode:
for i:=0 to PageControlMode.PageCount-1 do
    begin
    FileSheet[i].ContentFrame.RefreshLanguage;
    end;
So, jetzt das eigentlich Problem:
Damit die Polymorphie funktioniert, muss ich ja meine Frames von TSheetFrame statt von TFrame ableiten. Also habe ich einfach überall in dem automatisch generierten Code die Klassen-Deklaration entsprechend umgeändert.
Vorher:
Delphi-Quellcode:
type
  TFrameSimpleMode = class(TFrame)
    ComboBoxTemp: TComboBox;
    LabelTemplate: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure RefreshLanguage; override;
  end;
Nachher:
Delphi-Quellcode:
type
  TFrameSimpleMode = class(TSheetFrame)
    ComboBoxTemp: TComboBox;
    LabelTemplate: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure RefreshLanguage; override;
  end;
Alles funktioniert wie es soll.
Aber: Nachdem ich das Projekt geschlossen hatte, konnte ich mir nach dem Öffnen nicht mehr die Frames (den Code oder das Form) anschauen, ohne die angehängte Fehlermeldung präsentiert zu bekommen. Danach lässt sich das Programm nicht mehr compilieren! Wenn ich mir aber nach dem Öffnen kein Frame anschaue, dann lässt sich das Programm aber normal compilieren und starten.

Offensichtlich kommt Delphi irgendwie nicht damit klar, dass ich an den "von ihm" kreierten Frames rumgefuscht habe. Ich würde jetzt aber gerne wissen, was genau das Problem ist. Wie würde man das richtig machen (mit Polymorphie). Ich habe das Problem inzwischen ohne Polymorphie -mit case und typecasts- gelöst. Ich möchte aber gerne wissen, warum es nicht so ging wie ich es versuchte.

PS: Der erste, der eine gute Antwort abliefert, kriegt ein virtuelles Bier spendiert.
Miniaturansicht angehängter Grafiken
error.gif  
  Mit Zitat antworten Zitat
Neg

Registriert seit: 16. Jan 2004
Ort: Berlin
63 Beiträge
 
Delphi 5 Professional
 
#2

Re: Polymorphie mit eigenen Frames: TabOrder nicht gefunden

  Alt 21. Jan 2004, 00:10
*push*
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Polymorphie mit eigenen Frames: TabOrder nicht gefunden

  Alt 21. Jan 2004, 09:41
Hallo Neg,

weil ich nur der erste sein möchte, der Dir hier antwortet ("Beer!"), möchte ich Dich an dieser Stelle lediglich auf Interfaces hinweisen.
Eine Lösung der Art
Delphi-Quellcode:
type
  IMyInterface = interface
  ['YourGUID']
    procedure RefreshLanguage;
  end;

  TMyFrame = class(TFrame, IMyInterface)
  protected
    procedure RefreshLanguage;
  end;

  TForm1 = class(TForm, IMyInterface)
  protected
    procedure RefreshLangauge;
  end;
sollte darüber hinaus die Erweiturung des Konzepts auf andere Klassen (zB TForm) ermöglichen, die nicht von einer abstrakten Oberklasse erben, ohne das der Client (Aufrufer) angepasst werden muss:
Delphi-Quellcode:
var
  myInterface: IMyInterface;
  myFrame: TMyFrame;
begin
  myFrame:= TMyFrame.Create(AForm);
  with myFrame do
    //...
  
  // use instances' interface
  myInterface:= myFrame;
  myInterface.RefreshLanguage;
  myInterface:= AForm;
  myInterface.RefreshLanguage;
  // syntactical suggar
  (myFrame as IMyInterface).RefreshLanguage;
  (AForm as IMyInterface).RefreshLanguage;
Ich empfehle Dir weiterhin eine Registratur aller anpassbaren Elemente (zB in Form eines Bei Google suchensingelton pattern) zu etablieren, bei der Sich die entsprechenden Komponenten bei der Erzeugung registrieren bzw beim Freigeben abmelden
Delphi-Quellcode:
constructor TMyFrame.Create(..);
begin
  inherited;
  TLanguageSingelton.Instance.Register(Self);
end;
um später zB mit dem Aufruf
TLanguageSingelton.Instance.RefreshLanguage; alle zu aktualisierenen Exemplare zu iterieren unabhängig davon, auf welchen Controls sie sich tatsächlich befinden...

Falls Du später mehrere solcher Funktionalitäten zur Verfügung stellen solltest, könnte dieser Ansatz jedoch schnell in sog "god-interfaces" ausarten. Für diesen Fall könnte man lieber ein Delegations-Objekt oder die simplifizierte Delphi-Variante, ein Ereignis, registrieren, dass das alleinige Wissen über die durchzuführenden Aktionen hat...
gruß, choose
  Mit Zitat antworten Zitat
Neg

Registriert seit: 16. Jan 2004
Ort: Berlin
63 Beiträge
 
Delphi 5 Professional
 
#4

Re: Polymorphie mit eigenen Frames: TabOrder nicht gefunden

  Alt 21. Jan 2004, 14:11
Aha. Das sieht interessant aus.

Sehe ich das richtig, dass TMyFrame = class(TFrame, IMyInterface) im Grunde so etwas wie eine Mehrfachvererbung ist, nur dass die zweite Klasse eben keine "richtige Klasse", sondern nur ein Interface ist - so, als würde ich z.B. in C++ eine Klasse als abstrakt deklarieren und ihre Methoden nicht implementieren, also nur Siganturen liefern (Interface-Klasse)?
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Polymorphie mit eigenen Frames: TabOrder nicht gefunden

  Alt 21. Jan 2004, 14:26
Das implementieren eines Interfaces (IMyInterface) kann man in C++ tatsächlich mit dem Merfacherben einer puren abstrakten Klasse (IMyInterface) vergleichen, allerdings wäre diese pure abstrakte Klasse wiederum von der abstrakten Klasse IInterface abgeleitet, die drei abstrakte Methoden (_AddRef, _Release und QueryInterface) einführt und den Zuweisungsoperator operator = () in der Form überlädt, dass eine Zuweisung eines Objekts (!=null eq <>nil) die vom Erben zu implementiernde Methode _AddRef aufruft und das aufheben einer Referenz (bzw Zuweisen von nil) die vom Erben zu implementiernde Methode _Release aufruft (Referenzzählung).
Der Compiler sorgt darüber hinaus dafür, dass diese "Zuweisung mit nil" (durch Try..Finally geschützt) auch beim Verlassen des Gültigkeitbereichs durchgeführt wird, ähnlich dem C++ Konzept der SmartPointer (tatsächlich gibt es mit TInterfacedObject bereits ein Objekt, dass sich "selbst freigibt").

Suche einfach mal im Forum nach Interface etc, hier wurden oft schon gute Erklärungen für Einsteiger verfasst.

Eine kleine Anmerkung zur beschriebenen Lösung mit TMyFrame (s.o.): Die Klasse TComponent implementiert bereits die von IInterface (bei Deinem D5 heißt es IUnknown) geforderten Methoden und führt zur Referenzzählung (im Normalfall) eine Dummyoperation aus.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: Polymorphie mit eigenen Frames: TabOrder nicht gefunden

  Alt 22. Jan 2004, 01:29
Baue eine separate Unit die du in einem DesignTime Package installierst. In dieser Unit sollte inetwa folgendes stehen:

Delphi-Quellcode:
unit RegMySheets;

interface

uses DesignIntf, DesignEditors;

procedure Register;

implementation

uses ....;

procedure Register;
begin
  RegisterCustomModule(TSheetFrame, nil);
end;
Ab D6 oder D7 musst du bei der Delphi IDE einen Klassen-Editor registrieren.

Gruß Hagen
  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 14: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