Buongiorno a tutti,
ho una finestra con dentro uno scrollbox, dentro questo scrollbox creo n frame a runtime e li aggiungo ad una Tlist.
A volte, e ribadisco a volte, o perlomeno non riesco a capire quando e perchè, quando pulisco la lita quindi quando libero i tframe suggedono cose strane.
O non “sparisce” il frame, o mio da access violation durante la free, o quando crea il frame mi dice che esiste già.
Non riesco ad uscirne,
questo il codice interessato:
per creare la lista di frame
procedure TFrmVars.createListSubid;
var
i,j,sub: Integer;
StartValue, EndValue: Integer;
HexValue: string;
ListItem: TListItem;
framesubid:TSubIdFrame;
begin
StartValue := StrToInt('$' + EdSubFrom.Text);
EndValue := StrToInt('$' + EdSubTo.Text);
if not(Assigned(MylstSubid)) then
begin
MylstSubid:=TList<TSubIdFrame>.Create;
end;
sub:=StartValue;
for i := 0 to (EndValue-StartValue) do
begin
framesubid:=TSubIdFrame.Create(self);
framesubid.Parent:=Scrollbox;
framesubid.AutoSize:=True;
framesubid.Align:=alTop;
framesubid.top:=i*50+50;
framesubid.EdSubid.Caption:= Format('0x%.2x', [sub]);
framesubid.edData.Width:= 27*strtoint(edDlc.Text);
framesubid.btnData.Left:=framesubid.edData.Left+framesubid.edData.Width+5;
framesubid.Name:='framesubid_'+IntToStr(i);
framesubid.dlc:=StrToInt(edDlc.Text);
framesubid.edData.Caption:=Format('%.2d ', [sub]);
for j := 1 to framesubid.dlc -1 do
begin
framesubid.edData.Caption:=framesubid.edData.Caption+'00 ';
end;
if framesubid.edData.Caption.Length>0 then
begin
framesubid.edData.Caption:= Copy(framesubid.edData.Caption, 1, Length(framesubid.edData.Caption) - 1);
end;
inc(sub);
MylstSubid.Add(framesubid);
end;
end;
per la liberazione degli oggetti e pulire la lista
procedure TFrmVars.ClearList;
var
i: Integer;
Frame: TSubIdFrame;
begin
if Assigned(MylstSubid) then
begin
for i := MylstSubid.Count - 1 downto 0 do
begin
Frame := MylstSubid[i];
if Assigned(Frame) then
begin
try
Frame.Parent := nil; // Rimuovi il frame dal suo genitore
RemoveComponent(Frame); // Rimuovi il frame dalla lista dei componenti gestiti da Delphi
FreeAndNil(Frame); // Libera il frame e imposta il puntatore a nil
except
on E: Exception do
begin
//ShowMessage('Errore durante la liberazione del frame: ' + E.Message);
end;
end;
end;
end;
MylstSubid.Clear; // Dopo aver liberato tutti i frame, svuota la lista
end;
RemoveAllSubidFrames;
end;
procedure TFrmVars.RemoveAllSubidFrames;
var
i: Integer;
Frame: TComponent;
begin
for i := Scrollbox.ControlCount - 1 downto 0 do
begin
Frame := Scrollbox.Controls[i];
if Frame is TSubIdFrame then
begin
if Pos('framesubid_', Frame.Name) = 1 then
begin
Frame.Free;
end;
end;
end;
end;
posso aggiungere l evento onclose della form
procedure TFrmVars.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
ClearList;
if Assigned(MylstSubid) then
begin
MylstSubid.Free; // Libera la lista dopo aver liberato i frame
MylstSubid := nil; // Imposta a nil per sicurezza
end;
except
on E: Exception do
begin
ShowMessage('Errore durante la chiusura del form: ' + E.Message);
end;
end;
end;
a volte non da errori, dopo un tot di volte comincia ad andare di matto, o access violation su FreeAndNil(Frame);
o mi dice che esiste gia un oggetto con quel nome su framesubid:=TSubIdFrame.Create(self);
o li lista ha un numero di item che non ha senso
o a volte rimangono dei frame a vide o e non li cancella, dando errore
, non mi capacito. :/