AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

GridPanel für TImages and Memo

Ein Thema von EricMeyer · begonnen am 26. Nov 2019 · letzter Beitrag vom 28. Nov 2019
Antwort Antwort
EricMeyer

Registriert seit: 31. Mai 2012
Ort: Berlin
23 Beiträge
 
#1

GridPanel für TImages and Memo

  Alt 26. Nov 2019, 18:39
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?
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
510 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: GridPanel für TImages and Memo

  Alt 26. Nov 2019, 18:57
Wie ist dein GridPanel grundsätzlich eingestellt?
z.B. in welcher Einheit wird die Zeilenhöhe angegeben?
  Mit Zitat antworten Zitat
EricMeyer

Registriert seit: 31. Mai 2012
Ort: Berlin
23 Beiträge
 
#3

AW: GridPanel für TImages and Memo

  Alt 26. Nov 2019, 19:13
option1.pngoption2.pngoption3.png
z.B. in welcher Einheit wird die Zeilenhöhe angegeben? - Wo lese ich den das heraus?
  Mit Zitat antworten Zitat
EricMeyer

Registriert seit: 31. Mai 2012
Ort: Berlin
23 Beiträge
 
#4

AW: GridPanel für TImages and Memo

  Alt 26. Nov 2019, 20:33
Hier nochmal ein Beispiel mit dem Resultat. (Musste erst einen Ordner finden, mit unproblematischen und ausreichenden Bildern) resultat.png
  Mit Zitat antworten Zitat
EricMeyer

Registriert seit: 31. Mai 2012
Ort: Berlin
23 Beiträge
 
#5

AW: GridPanel für TImages and Memo

  Alt 28. Nov 2019, 19:17
Letztendlich habe ich es dann noch manuell mit Panels gemacht. Ich habe ein paar andere Forenbeiträge gefunden, die auch ohne Antwort blieben, aber insgesamt. Die Komponente scheint nicht so bliebt zu ein. Ich habe mir dann ein eigenes Grid aus Panels gebaut. Habe es in einer vom Frame abgleiteten Komponente gemacht, der ich noch zwei Felder mitgeben und initialisiert habe; NumberPanels und Skalefaktor;

Hier der Code, falls es jemanden interessiert
Delphi-Quellcode:
function TFrame2.AddPannel: TPanel;
var
  LRow : Integer;
  LColumn : Integer;
  MyNewPanel : TPanel;
begin
    self.NumberPanels := self.NumberPanels+1;
    LColumn := (Self.NumberPanels-1) mod 4;
    LRow := (Trunc(((self.NumberPanels-1)/4)));
    Panel1.Height := (self.Skalefaktor*LRow)+self.Skalefaktor+2;
    MyNewPanel := TPanel.Create(Panel1);
    MyNewPanel.Parent := Panel1;
    MyNewPanel.left := self.Skalefaktor*LColumn+2;
    MyNewPanel.top := self.Skalefaktor*LRow+2;
    MyNewPanel.Height := self.Skalefaktor;
    MyNewPanel.Width := self.Skalefaktor;
    MyNewPanel.Visible := true;
    MyNewPanel.Caption := IntToStr(self.NumberPanels);
    Result := MyNewPanel;
end;

procedure TFrame2.DeleteAllPanels;
var
  i: Integer;
  panelname : string;
begin
while Panel1.ControlCount > 0 do
  Panel1.Controls[0].Free;
  self.NumberPanels := 0;
end;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf