初学delphi,书中的代码还是有不懂的地方:) ( 积分: 100 )

  • 主题发起人 主题发起人 everhappy
  • 开始时间 开始时间
E

everhappy

Unregistered / Unconfirmed
GUEST, unregistred user!
问题添加到注释中,应该都是一些很傻的问题:)
谢谢了先:)
unit Squares1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
const
BoxCount = 25;
type
TDrawSqr = class(TForm)
Timer1: TTimer;
Button1: TButton;//点击新建unit,然后添加Button1: TButton,运行时怎么
看不到button呢?
procedure Timer1Timer(Sender: TObject);//timer1什么时候运行?
procedure FormCreate(Sender: TObject);

private
Colors: array[1..BoxCount] of TColor;
procedure DrawSquare(Scale: Double; Theta: Integer);
{ Private declarations }
public
{ Public declarations }
end;

var
DrawSqr: TDrawSqr;
procedure ShowSquares(Handle: THandle);export
//程序中调用ShowSquares(application.Handle)怎么不能看到结果呢?
implementation



{ TDrawSqr }
type
TSquarePoints = array [0..4] of TPoint;
const
Square: TSquarePoints =
( (x:-100; y: -100), (x: 100; y: -100), (x: 100; y: 100),
(x:-100; y: 100), (x:-100; y: -100) );
procedure ShowSquares(Handle: THandle);
begin
Application.Handle:= Handle;//究竟是把什么值在传递?为什么要传递呢?
DrawSqr :=TDrawSqr.Create(Application);
try
DrawSqr.ShowModal;
finally
DrawSqr.Free;
end;
end;

procedure TDrawSqr.DrawSquare(Scale: Double; Theta: Integer);
var
i: Integer;
CosTheta, SinTheta: Double;
Path: TSquarePoints;
begin
CosTheta:= Scale*cos(Theta*PI/180);
SinTheta:= Scale*sin(Theta*PI/180);
for i :=0 to 4 do
begin
Path.X:=Round(Square.X*CosTheta+Square.Y*SinTheta);
Path.Y:=Round(Square.Y*CosTheta+Square.X*SinTheta);
end;
Canvas.Polyline(Path);
end;

procedure TDrawSqr.FormCreate(Sender: TObject);
var
X:Integer;
begin
Randomize;
Colors[1]:= RGB(Random(255), Random(255),Random(255));
for X:= 2 to BoxCount do
Colors[X]:= Colors[X-1]+RGB(Random(64), Random(64), Random(64));

end;

procedure TDrawSqr.Timer1Timer(Sender: TObject);
var
i: Integer;
Scale: Double;
Theta: Integer;
begin
Scale:= 1.0;
Theta:= 0;
SetViewPortOrgEx(Canvas.Handle,ClientWidth div 2,ClientHeight div 2,nil);
Canvas.Pen.Color:= clWhite;
for i:= 1 to BoxCount do
begin
DrawSquare(Scale, Theta);
Theta:= Theta+ 10;
Scale:=Scale*0.85;
Canvas.Pen.Color:= Colors;
end;
Move(Colors[1], Colors[2], Sizeof(Colors)-Sizeof(TColor));
// Sizeof(Colors)-Sizeof(TColor));??
Colors[1]:= Colors[1]+ RGB(Random(64), Random(64), Random(64));
end;

end.
 
问题添加到注释中,应该都是一些很傻的问题:)
谢谢了先:)
unit Squares1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
const
BoxCount = 25;
type
TDrawSqr = class(TForm)
Timer1: TTimer;
Button1: TButton;//点击新建unit,然后添加Button1: TButton,运行时怎么
看不到button呢?
procedure Timer1Timer(Sender: TObject);//timer1什么时候运行?
procedure FormCreate(Sender: TObject);

private
Colors: array[1..BoxCount] of TColor;
procedure DrawSquare(Scale: Double; Theta: Integer);
{ Private declarations }
public
{ Public declarations }
end;

var
DrawSqr: TDrawSqr;
procedure ShowSquares(Handle: THandle);export
//程序中调用ShowSquares(application.Handle)怎么不能看到结果呢?
implementation



{ TDrawSqr }
type
TSquarePoints = array [0..4] of TPoint;
const
Square: TSquarePoints =
( (x:-100; y: -100), (x: 100; y: -100), (x: 100; y: 100),
(x:-100; y: 100), (x:-100; y: -100) );
procedure ShowSquares(Handle: THandle);
begin
Application.Handle:= Handle;//究竟是把什么值在传递?为什么要传递呢?
DrawSqr :=TDrawSqr.Create(Application);
try
DrawSqr.ShowModal;
finally
DrawSqr.Free;
end;
end;

procedure TDrawSqr.DrawSquare(Scale: Double; Theta: Integer);
var
i: Integer;
CosTheta, SinTheta: Double;
Path: TSquarePoints;
begin
CosTheta:= Scale*cos(Theta*PI/180);
SinTheta:= Scale*sin(Theta*PI/180);
for i :=0 to 4 do
begin
Path.X:=Round(Square.X*CosTheta+Square.Y*SinTheta);
Path.Y:=Round(Square.Y*CosTheta+Square.X*SinTheta);
end;
Canvas.Polyline(Path);
end;

procedure TDrawSqr.FormCreate(Sender: TObject);
var
X:Integer;
begin
Randomize;
Colors[1]:= RGB(Random(255), Random(255),Random(255));
for X:= 2 to BoxCount do
Colors[X]:= Colors[X-1]+RGB(Random(64), Random(64), Random(64));

end;

procedure TDrawSqr.Timer1Timer(Sender: TObject);
var
i: Integer;
Scale: Double;
Theta: Integer;
begin
Scale:= 1.0;
Theta:= 0;
SetViewPortOrgEx(Canvas.Handle,ClientWidth div 2,ClientHeight div 2,nil);
Canvas.Pen.Color:= clWhite;
for i:= 1 to BoxCount do
begin
DrawSquare(Scale, Theta);
Theta:= Theta+ 10;
Scale:=Scale*0.85;
Canvas.Pen.Color:= Colors;
end;
Move(Colors[1], Colors[2], Sizeof(Colors)-Sizeof(TColor));
// Sizeof(Colors)-Sizeof(TColor));??
Colors[1]:= Colors[1]+ RGB(Random(64), Random(64), Random(64));
end;

end.
 
);//timer1什么时候运行?
——————————————————————————

if timer1.enable then
begin

end;
 
button看不到应该是visible属性为false了,设为true就行了。
timer控件要设enable为true它才开始触发timer事件
 
TTimer 控件的属性里看看

有 Enabled 的 设为 True 才会运行
Interval 为运行的间隔 默认为 1000 表示 1 秒运行一次..

看不到那个 Button 应该是这个问题了
procedure TDrawSqr.DrawSquare(Scale: Double; Theta: Integer); // 这个函数重画了界面,,可能刚好隐藏你的 Button
 
兄弟这本书对你来说可能有点难,建议你先看基础一点的书如delphi X从入门到精通之类。“ Application.Handle:= Handle;//究竟是把什么值在传递?为什么要传递呢?”传递的是一个句柄。
 
button看不到是visible属性为false了,设为true就行了,还有就是你先设置button后来的控件被盖了
 
谢谢各位:)
还是有些地方不懂
to:qqhh
button看不到是visible属性为false了.我已经试过把它设成true,但还是不行.应该gooodlife说的是对的
Application.Handle:= Handle关键是为什么要执行这条语句?:)
 
一些调用windows api函数的时候常常需要给出api函数和你的系统,比如说主form的接口,这个接口就是“句柄”,通常是Handle,只有这样windows才知道要在哪个容器(比如这个form)上执行这个api函数。
ps:建议楼主如newsmile所说先看看简单一点的,可能这本书要用到的知识太多了,只要找一本适合当前自己的书就可以了,慢慢来。
 
多人接受答案了。
 
后退
顶部