Hallo,
ich habe erst kürzlich begonnen, mich mit Delphi auseinanderzusetzen und stoße leider ein wenig an meine Grenzen.
Das Ziel ist es, ein Splitterpanel als Komponente zu erzeugen, welches von TPanel abgeleitet wird.
Soweit so gut. Das dynamische hinzufügen funktioniert auch problemlos, wenn man allerdings im Designer ein SubPanel entfernt, dann gibt es einen Fehler.
Woran es liegt, kann ich mir auch vorstellen -> SubPanels müssen beim entfernen korrekt aus der ComponentenListe gelöscht werden. Nur WIE???
Es gibt ja bereits viele SplitterPanel auch FreeWare mit Source, aber ich möchte nicht der Verwendung wegen diese Komponente erstellen, sondern weil ich es einfach verstehen möchte, wie es funktioniert.
Eine um bereits funktionierende Routinen verkürzte Version des Quelltextes habe ich beigefügt.
Vielleicht hat ja jemand eine Idee und könnte es mir erklärem, wie ich die SubPanels wieder entfernen und den Speicher freigeben kann.
Vielen Dank schonmal im Voraus,
Miguel
Delphi-Quellcode:
unit SplitterPanel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls;
type
TSplitterPanel =
class(TPanel)
private
_SubPanelQuantity : Integer;
_SubPanel : TPanel;
function GetSubPanelQuantity : Integer;
procedure SetSubPanelQuantity(_Value: Integer);
protected
public
constructor Create(_aOwner: TComponent);
override;
destructor Destroy;
override;
published
property SubPanelQuantity : Integer
Read GetSubPanelQuantity
Write SetSubPanelQuantity;
property SubPanel : TPanel
Read _SubPanel;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
TestComponents', [TSplitterPanel]);
end;
constructor TSplitterPanel.Create;
begin
inherited Create(_aOwner);
_SubPanelQuantity := 1;
end;
destructor TSplitterPanel.Destroy;
begin
inherited Destroy;
end;
function TSplitterPanel.GetSubPanelQuantity: Integer;
begin
result := _SubPanelQuantity;
end;
procedure TSplitterPanel.SetSubPanelQuantity(_Value: Integer);
var
i : Integer;
begin
If _Value <> _SubPanelQuantity
Then
Begin
If _Value > _SubPanelQuantity
Then
Begin
With _SubPanel
Do
Begin
Name := '
SubPanel' + IntToStr(Self.ComponentCount-1);
End;
_SubPanel := TPanel.Create(Self.Parent);
_SubPanel.Parent := Self;
_SubPanel.
Name := '
SubPanel' + IntToStr(Self.ComponentCount);
End
Else
Begin
End;
_SubPanelQuantity := _Value;
End;
End;
end.