Runtime Error 216 : general protection fault
ce qu'en dis microsoft :
erreur qui se produit quand l'ordinateur est infecté par le cheval de troie SubSeven
bon je pense qu'en tant qu'utilisateur avertis, tu as un anti-virus a jours et que tu scan regulierement ton pc avec un anti-malware.
liberer les objets ne suffit pas!
il y a une convention de liberation a respecter
exemple :
objet1 := {classe}.create({parent});
plus tard :
objet2 := {classe}.create({parent});
a la fermeture :
Incorrect :
objet1.Free;
objet2.Free;
Correct :
objet2.Free;
objet1.Free;
ceci :
var TSeg:TSegment;
...
for i0:=0 to CompteurSeg-1 do begin
TSeg := TSegment.Create(FPrinc);
TSeg.X1:= ListSeg[i0].x1;
TSeg.Y1:= ListSeg[i0].y1;
TSeg.X2:= ListSeg[i0].x2;
TSeg.Y2:= ListSeg[i0].y2;
end;
n'est pas bien ! car a chaque Create seul FPrinc garde les references de TSeg et encore ce n'est pas sur.
il faut utiliser soit : un tableau dynamique de TSeg, soit mieux, un TObjectList qu'on derive pour utiliser avec TSeg.
on peu egalement utiliser les TCollectionItem et TCollection qui ont un fonctionnement a peu prés similaire au TObjectList.
exemple avec TObjectList :
type
{ TSegment }
TSegment = class(TCustomControl)
private
FFX1,FFX2,FFY1,FFY2 : integer;
protected
procedure Paint; override;
public
constructor Create ( AOwner : TComponent); override;
destructor Destroy; override;
published
Property X1 : integer read FFX1 write FFX1;
property X2 : integer read FFX2 write FFX2;
property Y1 : integer read FFY1 write FFY1;
property Y2 : integer read FFY2 write FFY2;
end;
{ TSegmentList }
TSegmentList = class(TList)
private
FOwnsObjects: Boolean;
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
function GetItem(Index: Integer): TSegment;
procedure SetItem(Index: Integer; Segment : TSegment);
public
constructor Create; overload;
constructor Create(AOwnsObjects: Boolean); overload;
property Items[Index: Integer]: TSegment read GetItem write SetItem; default;
function Add(Segment: TSegment): Integer;
procedure Insert(Index: Integer; Segment: TSegment);
function Extract(Item: TSegment): TSegment;
function Remove(Segment: TSegment): Integer;
function IndexOf(Segment: TSegment): Integer;
function First: TSegment;
function Last: TSegment; function FindInstanceOf(AClass: TClass; AExact: Boolean
True; AStartAt: Integer 0): Integer;
property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;
end;
<hr size="2" width="100%" />
{ TSegmentList implementation }
constructor TSegmentList.Create;
begin
inherited Create;
FOwnsObjects := True;
end;
constructor TSegmentList.Create(AOwnsObjects: Boolean);
begin
inherited Create;
FOwnsObjects := AOwnsObjects;
end;
function TSegmentList.Add(Segment: TSegment): Integer;
begin
Result := inherited Add(Segment);
end;
function TSegmentList.Extract(Item: TSegment): TSegment;
begin
Result := TSegment(inherited Extract(Item));
end;
function TSegmentList.First: TSegment;
begin
Result := TSegment(inherited First);
end;
function TSegmentList.Last : TSegment;
begin
Result := TSegment(inherited Last);
end;
function TSegmentList.GetItem(Index: Integer): TSegment;
begin
Result := inherited Items[Index];
end;
function TSegmentList.IndexOf(Segment: TSegment): Integer;
begin
Result := inherited IndexOf(Segment);
end;
procedure TSegmentList.Insert(Index: Integer; Segment: TSegment);
begin
inherited Insert(Index, Segment);
end;
function TSegmentList.FindInstanceOf(AClass: TClass; AExact: Boolean;
AStartAt: Integer): Integer;
var
I: Integer;
begin
Result := -1;
for I := AStartAt to Count - 1 do
if (AExact and (Items[I].ClassType = AClass)) or
(not AExact and Items[I].InheritsFrom(AClass)) then
begin
Result := I;
break;
end;
end;
procedure TSegmentList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if OwnsObjects then
if Action = lnDeleted then
TSegment(Ptr).Free;
inherited Notify(Ptr, Action);
end;
function TSegmentList.Remove(Segment: TSegment): Integer;
begin
Result := inherited Remove(Segment);
end;
procedure TSegmentList.SetItem(Index: Integer; Segment: TSegment);
begin
inherited Items[Index] := Segment;
end;
<hr size="2" width="100%" />
{ dans form1 }
var
TSL : TSegmentList;
procedure TForm1.FormCreate(Sender: TObject);
var N : integer;
begin
TSL := TSegmentList.Create(true);
for N := 0 to 9 do
TSL.Add(TSegment.Create(Self));
end;
procedure TForm1.FormDestroy(Sender: TObject);
var N : integer;
begin
for N := TSL.Count-1 to 0 do
TSL.Remove(TSL.Items[N]);
TSL.Free;
end;
<hr size="2" width="100%" />
Croc (click me)