Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Panels lassen sich nicht wie gewünscht in einer Scrollbox erzeugen

  Alt 20. Jan 2022, 14:12
Du hast da gerade mehere Probleme:
1. Die globalen Variabeln solltest du innerhalb als Felder deines Objekts (TForm4) erstellen oder lokal innerhalb der Funcion/Procedure, wenn diese sonst nicht verwendet werden.
2. Die globale Form Variable Form4 solltest du auf keinen Fall im Objekt direkt ansprechen!!! Wenn du innerhlab deines Objekts auf die Felder dessen zugriffen wills, kannst du die Felder direkt angeben. Unter Umständen must du mal innerhlab eines "with", das die Selben Felder enthält (z.B. Left bei TPanel und TForm), auf die Felder des Objekts zugreiffen, dann kannst du "Self.Left" schreiben. Self betrift dein Objekt in dem du dich befindest (TForm4).
3. Auf das "with" Statement solltes du besser verzichten oder nur nehmen, wenn da eindeutige namen verwendet werden. Denn Left,With,etc sind alle sowohl im TPanel als auch im TForm enthalten. Das kann zu unerwarteten Fehler führen, wenn da das Property Left von TPanel auf einmal abgeändert wird und dann neu PanelLeft heissen würde. Dein Code würde dann noch immer problemlos kompilieren, aber das setzen von Left, würde dann das Left von TForm veändern und nicht das nicht mehr vorhanden vom TPanel.

Habe deinen Code mal soweit angepasst, dass das obige nun korrekt ist. Beachte bitte auch die Kommentare inerhalb des Codes.

Delphi-Quellcode:
unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm4 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FPanel : TPanel; // Das könntest du auch lokal in der Procedure platzieren, wenn du nicht mehr an anderer Stelle darauf zugreiffen willst.
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);
var
  ydifferenz , xdifferenz ,x1,i,Tag1,k: integer;
  { Wenn diese Variabeln auch an anderen Stellen verwendet werden sollen,
    kannst du sie auch ins Objekt TForm4 verschieben, analog zu FPanel. }

  // FPanel:TPanel; Das ist im TForm4 als Feld definiert, könnte da aber auch weg und dafür hier stehen.
begin

  //Form
  Width := screen.Width;
  Top := screen.DesktopTop;
  Height := screen.Height;
  Left := screen.DesktopLeft;

  // Ydifferenz
  xdifferenz := Width div 31;
  ydifferenz := Height div 12 ;

 // Position Image
  { Ich denke du hast Image1 innerhalb des Scrollbox platziert oder?
    Die Scrollbox ist also der Parent des Image? Bei deinem folgenden Code ist mir nähmlich nicht klar, ob das wirklich das ist was du willst.
  with image1 do
  begin

  left := scrollbox1.Left;
  top := scrollbox1.top +(ydifferenz div 2 );
  width := form4.Width * 50;

  end;
  Das with wie folgt ersetzt:}

  image1.Left := Scrollbox.Left; // Ist das wirklch das was du willst? Du platzierst hiermit, das Image im gleichen Abtands zum linken Rahmen innerhalb der Scrollbox, wie die Scrollbox den Abstand zum Form Rahmen hat.
  image1.top := scrollbox1.top +(ydifferenz div 2 );
  image1.width := Width * 50; // With ist vom aktuellen Objekt in dem du dich befindest, als der TForm


  // Tag
  Tag1 := trunc(image1.width / 365);;
  x1 := trunc(Image1.width / 365);

  for i := 0 to 365 do
  begin

    Fpanel := TPanel.Create(self);
    Fpanel.left := x1 * i;
    Fpanel.top := -ydifferenz div 8;
    Fpanel.height := ydifferenz div 2;
    Fpanel.width := Tag1;
    Fpanel.parentbackground := false;
    Fpanel.parent := scrollbox1;
    Fpanel.visible := true;
    Fpanel.Color := clsilver; // Möchtest du hier nicht besser die Systemfarben nutzen, zB. clBtnFace?
    Fpanel.caption := inttostr(k);

    k := k+1; // hier könntest du auch einfach "Inc(k)" schreiben

  end;

end;
Mir ist aber nicht recht klar, was du da genau machen willst. Die Positionierung des TPanels scheint mir da etwas "komisch". Das Top des Panels ist ja immer die gleiche, weil du "ydifferenz" innerhalb der for Schlaufe nicht änderst. Müsstest du da nicht für die Berechung von Top auch noch eine weiteres "for j := 1 to 12" haben?

Geändert von Rolf Frei (20. Jan 2022 um 14:26 Uhr)
  Mit Zitat antworten Zitat