Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: Problem mit Feld in selbstdefinierter Klasse

  Alt 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!!!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat