Einzelnen Beitrag anzeigen

-n1h1l-

Registriert seit: 27. Aug 2008
30 Beiträge
 
#1

dynamischer Record führt zu Problemen bei Programm beenden

  Alt 1. Jul 2021, 05:53
Moin, folgendes Problem habe ich an dem ich verzweifel. Ich erstelle ein array von einem eigenem record. Beim beenden free ich alle erstellten komponenten des records. sobald ich eine weitere Komponente in den record aufnehme bekomme ich immer (egal welche art von komponente Button oder Panel) eine Zugriffsverletzung beim beenden. erstellen und sehen klappt ohne Probleme.

ich habe ein Record wie folgt definiert:

type TKalenderTag = record
ids : array[0..3] of string;
Box : TGroupBox;
Tage : array[0..3] of TCheckBox;
BG : array[0..3] of TPanel;
// about : array[0..3] of TPanel;
end;


und Kalender : array of TKalenderTag;


zur Laufzeit erstelle ich in einer Schleife dynamisch Komponenten für Checkbox Groupbox und Panel:

procedure TForm2.createCalender(pMain : TPanel);
var i,j,p : integer;
begin
SetLength(Kalender,34);
q := 0;

for j := 0 to 5 do
begin
for i := 0 to 6 do
begin
Kalender[q].Box := TGroupBox.Create(pMain);
with Kalender[q].Box do
begin
Parent := pMain;
Height := 120;
width := 110;
text := '0'+ inttostr(q);
TextSettings.Font.Size := 16;
TextSettings.Font.Style := [TFontStyle.fsBold];
Position.Y := 147*j + 41;
Position.X := (110*i);
StyleLookup := 'GroupBox4Style1';
end;

for p := 0 to 3 do
begin
Kalender[q].BG[p] := Tpanel.Create(self);
with Kalender[q].BG[p] do
begin
parent := Kalender[q].Box;
Height := 30;
// StyleLookup := 'Panelgreen';
Margins.Left := 3;
Margins.Right := 3;
Align := TAlignLayout.Top;
end;
{
Kalender[q].about[p] := Tpanel.Create(self);
with Kalender[q].about[p] do
begin
parent := Kalender[q].Box;
Height := 30;
Margins.Left := 3;
Margins.Right := 3;
end;
}

Kalender[q].Tage[p] := Tcheckbox.Create(self);
with Kalender[q].Tage[p] do
begin
parent := Kalender[q].BG[p];
Align := TAlignLayout.left;
StyleLookup := 'KalenderCheckstyle';
width:= 50;
case p of
0: Text := 'T-V';
1: Text := 'N-V';
2: Text := 'T-A';
3: Text := 'N-A';
end;

end;
end;



Kalender[q].BG[0].Margins.top := 25;
inc(q);
end;
end;
end;


wenn ich das formular beende, "befreie" ich die die erstellten komponenten wie folgt:

var
I: Integer;
j: Integer;
begin

for I := 0 to 33 do
begin

for j := 0 to 3 do
begin

FreeAndNil(Form2.Kalender[i].Tage[j]);
// FreeAndNil(Form2.Kalender[i].about[j]);
Freeandnil(Form2.Kalender[i].BG[j]);

end;

Freeandnil(Form2.Kalender[i].Box);
end;

wenn ich about als Panel oder Button in den quellcode nehme erhalte ich beim beenden eine ZUgriffsverletzung. Ich verstehe einfach nicht warum das problem entsteht zumal es mit dem rest funktioniert. Warum macht es probleme, wenn ich es nur um eine sache erweiter???

Vielen Dank für eure Hilfe!

Ach die zugriffsverletzung kommt bei i=1 und j=0
  Mit Zitat antworten Zitat