Hi,
I have attempted to write a component, but get a stack overflow when it is run. I am not sure what I have done wrong, but maybe someone here can point out my errors.
I have included both my original code & component code.
To run my original code, just start a new project and replace all the code in unit1 with my code (it is all dynamic).
Any comments, help or input is appreciated.
Thanks heaps,
Adam
--- original code ---
--- component code ---
------------------------------------
There's no place like 127.0.0.1
------------------------------------
I have attempted to write a component, but get a stack overflow when it is run. I am not sure what I have done wrong, but maybe someone here can point out my errors.
I have included both my original code & component code.
To run my original code, just start a new project and replace all the code in unit1 with my code (it is all dynamic).
Any comments, help or input is appreciated.
Thanks heaps,
Adam
--- original code ---
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure panelTimerTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
mainPanel : TPanel;
panelArray : array[0..16] of TPanel;
iCurrentPanel : smallInt;
paneltimer : TTimer;
lblStatus : TLabel;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
iPanelCount : smallInt;
begin
//set form width
Form1.Width := 400;
Form1.Height := 200;
//create main panel
mainPanel := TPanel.Create(self);
mainPanel.Parent := Self;
mainPanel.Height := 30;
mainPanel.Ctl3D := False;
mainPanel.BevelInner := bvNone;
mainPanel.BevelOuter := bvNone;
mainPanel.BorderStyle := bsSingle;
mainPanel.Color := clWhite;
mainPanel.Width := 278;
mainPanel.Height := 55;
//create the status label
lblStatus := TLabel.Create(self);
lblStatus.Parent := mainPanel; //place label in main panel
lblStatus.Align := alTop; //place lable at top on mainPanel
lblStatus.Alignment := taCenter;
lblStatus.Font.Name := 'Arial';
lblStatus.Font.Size := 10;
//lblStatus.Font.Style:= [fsBold];
lblStatus.Caption := 'Processing...';
//create panels
for iPanelCount := 0 to 16 do
begin
//create panel
panelArray[iPanelCount] := TPanel.Create(self);
with panelArray[iPanelCount] do
begin
Parent := mainPanel; //belongs inside the mainPanel
Caption := '';
Ctl3D := False;
BevelInner := bvNone;
BevelOuter := bvNone;
BorderStyle := bsSingle;
Width := 10;
Height := 10;
Top := 25;
Left := (iPanelCount*15) + 10;
//Tag := iPanelCount;
end;
end;
//create timer
panelTimer := TTimer.Create(self);
panelTimer.Interval := 150;
panelTimer.OnTimer := panelTimerTimer;
panelTimer.Enabled := true;
end;
procedure TForm1.panelTimerTimer(Sender: TObject);
begin
if (iCurrentPanel > 16) then iCurrentPanel := 0;
case iCurrentPanel of
0:
begin
if (panelArray[iCurrentPanel].Color = clBtnFace) then
begin
panelArray[iCurrentPanel].Color := clSkyBlue;
end
else
begin
panelArray[iCurrentPanel].Color := clBtnFace;
end;
if (panelArray[16].Color = clSkyBlue) then
(panelArray[16].Color := clBtnFace);
end;
else //case else
begin
panelArray[iCurrentPanel].Color := clSkyBlue;
panelArray[iCurrentPanel-1].Color := clBtnFace;
end;
end; {case}
//move to next panel
Inc(iCurrentPanel);
end;
end.
--- component code ---
Code:
unit AnimatedGauge;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TAnimGauge = class(TComponent)
private
fAnimateSpeed : Integer;
fCaption : string;
fEnabled : boolean;
procedure SetAnimateSpeed(iValue : integer);
procedure SetCaption(sCaption : string);
procedure SetEnabled(bValue : boolean);
procedure panelTimerTimer(Sender: TObject);
public
Constructor Create(AnOwner:TComponent); Override;
Destructor Destroy; Override;
published
property AnimateSpeed : integer read fAnimateSpeed write SetAnimateSpeed;
property Caption : string read fCaption write SetCaption;
property Enabled : boolean read fEnabled write SetEnabled;
end;
var
mainPanel : TPanel;
panelArray : array[0..16] of TPanel;
iCurrentPanel : smallInt;
paneltimer : TTimer;
lblStatus : TLabel;
Procedure Register;
implementation
Constructor TAnimGauge.Create(AnOwner:TComponent);
var
iPanelCount : smallInt;
begin
inherited Create(AnOwner);
//create main panel
mainPanel := TPanel.Create(self);
//mainPanel.Parent := Self;
mainPanel.Height := 30;
mainPanel.Ctl3D := False;
mainPanel.BevelInner := bvNone;
mainPanel.BevelOuter := bvNone;
mainPanel.BorderStyle := bsSingle;
mainPanel.Color := clWhite;
mainPanel.Width := 278;
mainPanel.Height := 55;
//create the status label
lblStatus := TLabel.Create(self);
lblStatus.Parent := mainPanel; //place label in main panel
lblStatus.Align := alTop; //place lable at top on mainPanel
lblStatus.Alignment := taCenter;
lblStatus.Font.Name := 'Arial';
lblStatus.Font.Size := 10;
//lblStatus.Font.Style:= [fsBold];
lblStatus.Caption := 'Processing...';
//create panels
for iPanelCount := 0 to 16 do
begin
//create panel
panelArray[iPanelCount] := TPanel.Create(self);
with panelArray[iPanelCount] do
begin
Parent := mainPanel; //belongs inside the mainPanel
Caption := '';
Ctl3D := False;
BevelInner := bvNone;
BevelOuter := bvNone;
BorderStyle := bsSingle;
Width := 10;
Height := 10;
Top := 25;
Left := (iPanelCount*15) + 10;
//Tag := iPanelCount;
end;
end;
//create timer
panelTimer := TTimer.Create(self);
panelTimer.Interval := 150;
panelTimer.OnTimer := panelTimerTimer;
panelTimer.Enabled := true;
SetAnimateSpeed(200);
SetCaption('Processing ...');
SetEnabled(False);
end;
Destructor TAnimGauge.Destroy;
begin
inherited Destroy;
end;
procedure TAnimGauge.SetAnimateSpeed(iValue : integer);
begin
AnimateSpeed := iValue;
end;
procedure TAnimGauge.SetCaption(sCaption : string);
begin
Caption := sCaption;
end;
procedure TAnimGauge.SetEnabled(bValue : boolean);
begin
Enabled := bValue;
end;
procedure TAnimGauge.panelTimerTimer(Sender: TObject);
begin
if Enabled then
begin
if (iCurrentPanel > 16) then iCurrentPanel := 0;
case iCurrentPanel of
0:
begin
if (panelArray[iCurrentPanel].Color = clBtnFace) then
begin
panelArray[iCurrentPanel].Color := clSkyBlue;
end
else
begin
panelArray[iCurrentPanel].Color := clBtnFace;
end;
if (panelArray[16].Color = clSkyBlue) then
(panelArray[16].Color := clBtnFace);
end;
else //case else
begin
panelArray[iCurrentPanel].Color := clSkyBlue;
panelArray[iCurrentPanel-1].Color := clBtnFace;
end;
end; {case}
//move to next panel
Inc(iCurrentPanel);
end;
end;
procedure Register;
begin
RegisterComponents('GAUGES', [TAnimGauge]);
end;
end.
------------------------------------
There's no place like 127.0.0.1
------------------------------------