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.