Laten we eens proberen je code wat op te schonen, want voor je het weet heb je 192 if's achter elkaar staan. Ik los dat meestal op door een object te maken waarin je je data kunt stoppen en vervolgens een TList waar je deze objecten dan weer in stopt.
Als eerste het object:
Code:
TFrameItem = class(TObject
private
FFrame: TCustomFrame;
FFrameClass: TCustomFrameClass;
FCaption: string;
public
property FrameClass: TCustomFrameClass read FFrameClass write FFrameClass;
property Frame: TCustomFrame read FFrame write FFrame;
property Caption: string read FCaption write FCaption;
constructor Create(FrameClass: TCustomFrameClass; Caption: string);
end;
Code:
{ TFrameItem }
constructor TFrameItem.Create(FrameClass: TCustomFrameClass;
Caption: string);
begin
inherited Create;
FFrameClass := FrameClass;
FCaption := Caption;
end;
Hierin kun je dus een frameclasse opslaan, als je het frame later nodig hebt kun je dat aanmaken en in de betreffende property zetten. Nu hebben we een lijst nodig om deze objecten in op te slaan. Vervolgens ga je de lijst vullen met de betreffende panelclasses. O ja, deze moet je nog wel even definieren. Als je dus een panel TJouwPanel hebt moet je daarbij ook een TJouwPanelClass = class of TJouwPanel
aanmaken.
Code:
TForm1 = class(TForm)
TreeView1: TTreeView;
Panel1: TPanel;
procedure TreeView1Change(Sender: TObject; Node: TTreeNode;
private
FFrameList: TObjectList;
public
constructor Create(AOwner: TComponent; override;
destructor Destroy; override;
end;
Code:
constructor TForm1.Create(AOwner: TComponent;
begin
inherited;
FFrameList := TObjectList.Create;
FFrameList.Add(TFrameItem.Create(TFrame, 'Vragen staat vrij op NLDelphi...');
end;
Je OnChange event wordt nu een stuk korter:
Code:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode;
var
FrameItem: TFrameItem;
begin
FrameItem := TFrameItem(FFrameList[TreeView1.Selected.Index]);
if FrameItem.Frame = nil then
FrameItem.Frame := FrameItem.FrameClass.Create(Self;
FrameItem.Frame.Left := 2;
FrameItem.Frame.Top := 10;
FrameItem.Frame.Height := 370;
FrameItem.Frame.Width := 634;
FrameItem.Frame.Parent := Panel1;
end;
Op deze manier voorkom je dus dat je al je verschillende panels in je event moet zetten, deze staan nu wat netter in de Create van je form. Toch worden ze pas aangemaakt als ze nodig zijn.
Bookmarks