Hi Leute,
ich habe ein kleines Problem mit einer selbst geschriebenen Komponente. Sie basiert auf einem Frame in dem dynamisch Shapes geladen werden. Durch die Eigenschaft "BufferSize" kann die Anzahl der Shapes verändert werden. Alle Shapes speichere ich mir in eine TList. Das ganze funktioniert auch soweit ganz gut, wenn ich die BufferSize-Eigenschaft zur Laufzeit ändere. Sobald ich diese aber im Objektinspektor editiere, erhalte ich ne Zugriffsverletzung im Modul 'rtl70.bpl'. Danach lässt sich Delphi nur noch im Task-Manager abschießen.
Beim ändern der BufferSize zerstöre ich als erstes alle Shape-Objekte in der Liste und erzeuge diese danach von neuem. Soweit ich herausgefunden habe, liegt das Problem im zerstören der Shapes. Ich habe schon ein wenig mit der Notification-Prozedur herumexperimentiert, aber noch keine richtige Lösung gefunden. Ich bin für jede Hilfe echt dankbar!!
Hier ein Auszug aus dem Quellcode:
Delphi-Quellcode:
TBuffer = class(TFrame)
private
FPlaces: TList;
function GetBufferSize: Byte;
procedure SetBufferSize(Size: Byte);
procedure DeleteShapes;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
published
property BufferSize: Byte read GetBufferSize write SetBufferSize;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
implementation
{$R *.dfm}
procedure TBuffer.DeleteShapes;
begin
while (FPlaces.Count > 0) do
begin
TShape(FPlaces.Items[0]).Destroy;
FPlaces.Delete(0);
end;
end;
function TBuffer.GetBufferSize: Byte;
begin
Result := FPlaces.Count;
end;
procedure TBuffer.SetBufferSize(Size: Byte);
var i: Byte;
PlaceShape: TShape;
begin
DeleteShapes;
for i := 0 to Size-1 do
begin
PlaceShape := TShape.Create(Self);
PlaceShape.Parent := Self;
PlaceShape.Name := 'Place' + IntToStr(i));
FPlaces.Add(PlaceShape);
end;
end;
procedure TBuffer.Notification(AComponent: TComponent; Operation: TOperation);
var i: Integer;
begin
inherited Notification(AComponent, Operation);
if (FPlaces <> NIL) then
for i := FPlaces.Count-1 downto 0 do
if ((Operation = opRemove) and (FPlaces.Items[i] <> NIL) and (AComponent = FPlaces.Items[i])) then
begin
FPlaces.Items[i] := NIL;
Break;
end;
end;
constructor TBuffer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPlaces := TList.Create;
SetBufferSize(4);
end;
destructor TBuffer.Destroy;
begin
DeleteShapes;
FPlaces.Destroy;
inherited Destroy;
end;
end.