Einzelnen Beitrag anzeigen

windi

Registriert seit: 22. Dez 2004
Ort: Chemnitz
21 Beiträge
 
RAD-Studio 2010 Arc
 
#1

Problem mit selbst erstellter Komponente

  Alt 22. Apr 2006, 15:24
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.
  Mit Zitat antworten Zitat