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?