Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
Delphi 10.1 Berlin Enterprise
|
Re: Problem mit Feld in selbstdefinierter Klasse
16. Aug 2004, 16:32
Die Exception kommt, weil du den PCCount eines nicht initialisierten Objekts ändern willst! (Daher die Frage(5.) von Mütze, hab ich auch voll übersehen... )
Nachfolgende Fehler:
- Das Freigeben der Labels klappt auch nicht richtig, weil sie nicht als Unterelemente von deiner ScrollBox erstellt werden. (und somit nicht über Components erreichbar sind)
- Wenn du eine Schleife durchläufst und dann einzelne Elemente aus der Liste nimmst, dann stimmt der Zähler nicht, denn wenn i = 0 ist und du somit das 1. Element löscht, wird das 2. zum Element[0], aber du bist jetzt bei i=1. Das heißt, jedes 2.Element wird gelöscht und dann gibt's einen Überlauf!!!
Hier die gefixte Unit:
Delphi-Quellcode:
unit PCButtonList;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, Forms;
type TPCButtonList = class(TPanel)
private
FPCCount: Integer;
ScrollBox: TScrollBox; // <-- besagtes Feld
procedure SetPCCount(Count: Integer); // <-- prozedur die das füllen regeln soll
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
// procedure SetBounds(ALeft,ATop: Integer); reintroduce;
property PCCount: Integer read FPCCount write SetPCCount;
published
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(' Beispiele', [TPCButtonList]);
end;
{ TPCButtonList }
constructor TPCButtonList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ScrollBox := TScrollBox.Create(Self);
with ScrollBox do
begin
Name := ' ScrollBox';
Parent := self;
AutoScroll := True;
BorderStyle := bsNone;
// @OnMouseMove := @MouseMoves;
with HorzScrollBar do
begin
Increment := 70;
Smooth := False;
Tracking := True;
end;
end;
FPCCount := 0;
end;
destructor TPCButtonList.Destroy;
begin
FreeAndNil(ScrollBox);
inherited;
end;
procedure TPCButtonList.SetPCCount(Count: Integer);
var I: Integer;
const Tops: array[0..14] of Byte = (14,0,1,2,3,4,5,6,7,8,9,10,11,12,13);
begin
while ScrollBox.ComponentCount > 0 do
ScrollBox.Components[0].Free;
for I := 1 to Count do
begin
with TPanel.Create(ScrollBox) do
begin
Parent := ScrollBox;
Name := ' Rechner' + IntToStr(I);
Caption := ' SomeTitle' + ' ' + IntToStr(I);
SetBounds((Pred(I) div 15)*70,30*Tops[I mod 15],65,22);
end;
end;
FPCCount := Count;
end;
end.
Und der Aufruf:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, PCButtonList;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
PCButtonList: TPCButtonList;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
PCButtonList := TPCButtonList.Create(Form1);
with PCButtonList do
begin
Parent := Form1;
Name := ' PCButtonList';
// SetBounds(13,10);
PCCount := 24; // <-- was hier passiert, 24 is jetz einfach irgendein wert
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PCButtonList.PCCount := 10;
end;
end.
Nur nicht unterkriegen lassen!!!
|