Может я не понял вопроса, но почему все говояр мол так нельзя??? Непонятно, вообще-то льзя, но ошибка из-за вот этого:
После этого в листе у нас указатель есть (ведь его никто не дулалил нетак ли) и он указывал в свое время до ФрииАндНил на наш класс (объект) а после? правильно он указывает тудаже, но там уже тю тю...
Или в чем был вопрос то?Просто если вы ждали, что при удалении объекта обнулится поинтер в листе?
Просто судя по этому:
Вы именно этого ждали?
Если да, то одисей уже написал, про указатель ссылок и все такое, если просто хотите юзать списки (TList) То я делаю как то так:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
List:TList;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button2Click(Sender: TObject); //Удаления последнего (хвоста)
begin
if (List<>Nil) and (List.Count>0) then
begin
TForm(List[List.Count-1]).Free;
List.Delete(List.Count-1); //Обязательно иначе полная чушь
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if (List<>Nil) and (List.Count>0) then
TForm(List[List.Count-1]).Show; //Показываем хвостик
end;
procedure TForm1.Button1Click(Sender: TObject); //Создание в данном случае 10 окон
var I:Integer;
NF:TForm;
begin
if List = nil then
List:=TList.Create;
For I:=1 to 10 do
begin
NF:=TForm.Create(Nil);
NF.Caption:=IntToStr(I);
List.Add(NF);
end;
end;
end.
Для Объектов типа ObjectКод: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
{ TComplexObject }
PMyObject=^TMyObject;
TMyObject = Object
I:Integer;
S:String;
constructor Create(vI:Integer; vS:String);
end;
var
Form1: TForm1;
List:TList;
implementation
{ TComplexObject }
constructor TMyObject.Create(vI:Integer; vS:String);
begin
I:=vI;
S:=vS;
end;
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button2Click(Sender: TObject); //Удаления последнего (хвоста)
begin
if (List<>Nil) and (List.Count>0) then
begin
Dispose(PMyObject(List[List.Count-1]));
List.Delete(List.Count-1); //Обязательно иначе полная чушь
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if (List<>Nil) and (List.Count>0) then
Caption:= PMyObject(List[List.Count-1])^.S; //Показываем хвостик
//Либо так Caption:= TMyObject(List[List.Count-1]^).S;
end;
procedure TForm1.Button1Click(Sender: TObject); //Создание в данном случае 10 окон
var I:Integer;
NO:PMyObject;
begin
if List = nil then
List:=TList.Create;
For I:=1 to 10 do
begin
NO:=New(PMyObject);
NO^.Create(I, 'Строка№ '+IntToStr(I));
List.Add(NO);
end;
end;
end.
PS. Что-то я перегрелся, даже вопросы недопонимаю (:...