Ich baue gerade so eine Art ImageExplorer.
Ich habe mir schon ein schönes TTreeView Bäumchen gebaut mit Ordnerstrukturen, jetzt möchte ich, das beim Klicken auf einen Ordner in einem Zweiten Frame alle Verfügbaren Bilder schön angezeigt werden. Und zwar vier Bilder nebeneinander und das Reihe für Reihe nach unten.
Erster Ansatz war vier Panels und das Frame mit Autosize zu verwenden, dynamisch ein Panel zu erzeugen mit Aliment Top und dadrin ein TImage, und dann ein TMemo Aliment Top und Client. Der Ansatz hat mich in den Wahnsinn getrieben.
Jetzt versuche ich es mit einem Gridpanel. Das will aber auch nicht so wie ich will. Immer das selbe mit diesen Komponenten!
Also dann mal zum Code:
Hier die Komponenten:
Delphi-Quellcode:
procedure TForm1.CreateImageFields(ANumber: Integer);
var
LNewPanel: TPanel;
LNewPanelIn : TPanel;
LNewImage: TImage;
LNewMemo : TMemo;
i: Integer;
test : string;
begin
AddLinesToGridPanel(ANumber);
DestroyImages;
FPanelDictionary.Clear;
test := 'hallo';
for i := 0 to ANumber-1 do
begin
LNewPanel := TPanel.Create(FramePictureList.GridPanelToAdd);
LNewPanel.Parent := FramePictureList.GridPanelToAdd;
LNewPanel.Name := 'NewPanel'+IntToStr(i);
LNewPanel.Height := 200;
LNewPanel.Align := alClient;
LNewPanel.Caption := IntToStr(i);
LNewImage := TImage.Create(LNewPanel);
LNewImage.Name := 'NewImage'+IntToStr(i);
LNewImage.Parent := LNewPanel;
LNewImage.Align := alTop; //LNewImage.Height := 141;
LNewImage.Stretch := true;
LNewImage.Width := 200;
LNewImage.Height := 150;
LNewImage.Proportional := true;
LNewImage.Center := true;
LNewImage.Tag := i;
try
if FSelectedPath <> '' then
LNewImage.Picture.LoadFromFile(FSelectedPath+FPicturePath.Strings[i]);
LNewImage.OnClick := Frame21ToolButton3Click;
except
end;
LNewMemo := TMemo.Create(LNewPanel);
LNewMemo.Parent := LNewPanel;
LNewMemo.Align := alClient;
LNewMemo.Name := 'NewMemo'+IntToStr(i);
LNewMemo.Text := '';
LNewImage.Tag := i;
LNewMemo.Height := 50;
LNewMemo.Width := 200;
LNewPanel.Visible := true;
FPanelDictionary.Add(i, LNewPanel);
end;
FramePictureList.Align := alClient;
end;
Hier das Panel:
Delphi-Quellcode:
procedure TForm1.AddLinesToGridPanel(ANumbersOffields: Integer);
var
LColums : integer;
i: Integer;
LRowitem : TRowItem;
LMagicNumber : Integer;
j: Integer;
begin
LMagicNumber := 200;
LColums := Round((ANumbersOffields/4));
FramePictureList.GridPanelToAdd.RowCollection.BeginUpdate;
FramePictureList.GridPanelToAdd.ColumnCollection.BeginUpdate;
for i := 0 to -1 + FramePictureList.GridPanelToAdd.ControlCount do
FramePictureList.GridPanelToAdd.Controls[0].Free;
FramePictureList.GridPanelToAdd.Height := LMagicNumber*LColums;
FramePictureList.GridPanelToAdd.Height := LMagicNumber*LColums;
FramePictureList.GridPanelToAdd.ColumnCollection.Clear;
FramePictureList.GridPanelToAdd.ColumnCollection.BeginUpdate;
for i := 1 to 4 do
with FramePictureList.GridPanelToAdd.ColumnCollection.Add do
begin
SizeStyle := ssPercent;
Value := LMagicNumber ; //have cells evenly distributed
end;
for i := 1 to LColums do
with FramePictureList.GridPanelToAdd.RowCollection.Add do
begin
SizeStyle := ssPercent;
Value := LMagicNumber; //have cells evenly distributed
end;
for i := 0 to FramePictureList.GridPanelToAdd.ControlCount -1 do
FramePictureList.GridPanelToAdd.Controls[i].Height:= LMagicNumber;
FramePictureList.GridPanelToAdd.RowCollection.EndUpdate;
FramePictureList.GridPanelToAdd.ColumnCollection.EndUpdate;
end;
Das Resultat ist, das die obersten zwei Reihen nur halb so groß sind und man nur Teile des Bildes, aber nicht des Memo. Ab der dritten Reihe sieht es gut aus.
Ideen?