Einzelnen Beitrag anzeigen

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, 18: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