我是新手,问几个简单问题(80分)

  • 主题发起人 主题发起人 xuzy888
  • 开始时间 开始时间
X

xuzy888

Unregistered / Unconfirmed
GUEST, unregistred user!
1、在密码输入窗口中,我想在控件EDIT1中输入密码后敲回车,就可以对密码进行处理(我现在另外用了一个“确认”键,如何让二者有同样的功效?)
2、同样在上面的窗口中,我用了一个”取消“键,用来关闭密码输入窗口,为什么会出现EAccessViolation异常?代码如下:
procedure TForm1.Button2Click(Sender: TObject);
begin
//Application.Free;
//Form1.hide;
//Form1.destroy;
Form1.close;
Form1.free;
end;
如果想让ESC键也起这样的作用,如何做?
3、Delphi程序有几种发布形式?我想作成单个的EXE文件,如何设置?
4、如何在程序运行时在窗体上动态地放置一系列相同的控件,数目不定?(Delphi3是否支持动态数组?)好象Delphi4支持吧,那么如何让他们响应事件?(比如说,CLICK事件)
 
1.在edit的 onchange 中写
3。简单程序默认就是单个exe的
 
2.procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
 
1.放一个bitbtn,属性modalresult:=mrok就是默认的确认按钮,相当于按下回车,
modalresult=mrcancel相当于按下esc
2.如果form1是主窗体的话,执行完form1.close后程序就会终止,也就是说
application自己会把form1来free的,此时再次调用form1.free就会出错
正确的做法:form1.close; 就完了。
3。可以直接作成单个exe的,不要选择用运行包就可以了
4.当然可以
 
1.加入以下代码:
Form1.Edit1KeyPress(Sender:TObject;var key:char);
begin
if key=#13 then //回车
begin
OkButtnClick;
key:=#0;
end;
end;
2.如果该窗体(非主窗体)是available(在project-options内设置)类型
即需要时动态创建并在关闭后释放空间则释放的语句应如下写:
form1.onclose(sender;tobject;var action:tcloseaction);
begin
action:=cafree;
end;
 
1.g:王安鹏
2.3.g:www.
4.Delphi3支持动态数组.
 
www答得比较正确
 
1.只要把该按钮的Default值设置为True即可。
2.如果Form1是由程序自动创建(即通过Application.CreateForm创建)的话,
使用Form1.Free即会出错。
3.Delphi在缺省方式下即会生成可单独运行的EXE文件(在源文件所在路径)。
4.Delphi支持动态数组,但不像VB一样支持控件数组,如果要对一系列控件进行相同
操作,可以把一系列控件的相同事件属性设置为同一处理过程即可。如果是动态创
建的控件,可以通过赋值的形式设置事件响应过程,如:
Button1.OnClick:=GeneralButtonClick;
另外,为了识别事件的发生者,可以通过Sender参数识别,其实还一个技巧就是使
用控件的Tag属性。
 
1。同意王安鹏;
2,3。同意JohnsonGuo;
4。可以在Form上动态的创建可视构件!

procedure TForm1.Button1Click(Sender: TObject);
var MyBtn:TButton;
begin
MyBtn:=TButton.Create(Self);
MyBtn.Parent :=Form1;
MyBtn.Top :=10;
MyBtn.Left :=10;
MyBtn.Width :=40;
MyBtn.Height :=30;
MyBtn.Visible :=true;
end;
 
JohnsonGuo:
1、很好
4、Button1.OnClick:=GeneralButtonClick;中GeneralButtonClick是什么?可以是事件处理程序,如TForm1.Edit1Change(Sender: TObject)吗?我这样调用别的事件处理程序,程序提示错误;能否给个例子;

王安鹏:OkButtnClick是事件处理程序么?给个例子;
key:=#0;为什么?

WWW:
如何不选择用运行包?我的程序中用了自装的Alcomps包,装时还选了Runtime包(不选就出现找不到DCU文件的错误)。就这样我的程序编译成EXE在别的机器上运行时找不到所需的DLL文件Alcomps.dpl?
在D3中如何实现动态控件数组?

wumeng:
在D3中如何实现动态控件数组?并如何指定它的时间处理程序?
 
下面这个是模拟计算器输入的简单例子:

新建一个工程,在Form1上放一个Label1(TLabel),写代码如下:

type
TForm1 = class(TForm)
...
procedure ButtonsClick(Sender:TObject);
private
{ Private declarations }
Buttons:Array [0..9] of TButton;
public
...
end;

...

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 9 do begin
Buttons:=TButton.Create(Self);
with Buttons do begin
Left:=i*40;
Top:=100;
Width:=20;
Height:=20;
Caption:=IntToStr(i);
Parent:=Self;
OnClick:=ButtonsClick;
end;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:Integer;
begin
for i:=0 to 9 do
Buttons.Free;
end;

procedure TForm1.ButtonsClick(Sender:TObject);
begin
Label1.Caption:=Label1.Caption+(Sender as TButton).Caption;
end;

看完这个程序,应该没问题了吧。

另外,Edit1Change同样可以作为Button1.OnClick的事件处理过程,其根本是事件
处理过程的形式一致。
 
将确认按钮的Default属性社为True,将取消按钮的Cancel属性设为True,即可
实现1,2问题.
 
同意JohnsonGuo和Heado.
 
1、2同意Heado
3.把所需资源全都加入程序{$R 你的资源文件.res}重新编译。
4.
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
newobj_tag:=newobj_tag+1;
MyImage:=TImage.Create(self);
myimage.Picture.LoadFromFile ('d:/test/picmove/ufo.bmp');
myimage.Stretch :=true;

myimage.parent:=form1;
end;
 
JohnsonGuo:
受益良多。但我想再请教:你的例子程序应属动态生成控件数组,数组元素个数确定。但我想作的是在程序运行时,我用鼠标点一下就在该处放一个控件,点多少下,不一定,我想数组元素个数是动态的。
 
给你个完全的,可以加分了吧
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, ToolWin;

type
TForm1 = class(TForm)
Label1: TLabel;
Image1: TImage;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
procedure FormCreate(Sender: TObject);
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ToolButton1Click(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
bdrag:boolean;
x1,y1:integer;
newobj_x,newobj_y:integer;
newobj_tag:integer;
myimage: TImage;
implementation


{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
bdrag:=false;
newobj_tag:=1;
end;

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x1:=x;
y1:=y;
bdrag:=true;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if bdrag then
begin
label1.left:=label1.left+x-x1;
label1.top:=label1.top+y-y1;
end;{if}
end;

procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bdrag:=false;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x1:=x;
y1:=y;
bdrag:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if bdrag then
begin
image1.left:=image1.left+x-x1;
image1.top:=image1.top+y-y1;
end;{if}
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bdrag:=false;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
newobj_tag:=newobj_tag+1;
MyImage:=TImage.Create(self);
myimage.Picture.LoadFromFile ('d:/test/picmove/ufo.bmp');
myimage.Stretch :=true;


end;

procedure TForm1.FormClick(Sender: TObject);
begin
myimage.Left :=newobj_x;
myimage.Top :=newobj_y;

end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
newobj_x:=x;
newobj_y:=y;
myimage.parent:=form1;
end;

end.
 
如果要实现不定长控件数组的话,可以使用TList,举一个简单的例子如下:

uses
...
ExtCtrls;

type
PShape=^TShape;
TMainFrm = class(TForm)
...
private
List:TList;
function Item(Index:Integer):TShape;
public
...
end;

...

procedure TMainFrm.FormCreate(Sender: TObject);
begin
List:=TList.Create;
end;

procedure TMainFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
while List.Count>0 do begin
Item(0).Free;
Dispose(List[0]);
List.Delete(0);
end;
List.Free;
end;

function TMainFrm.Item(Index:Integer):TShape;
begin
Result:=PShape(List[Index])^;
end;

procedure TMainFrm.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Ptr:PShape;
begin
New(Ptr);
Ptr^:=TShape.Create(Self);
with Ptr^ do begin
Left:=X-2;
Top:=Y-2;
Width:=5;
Height:=5;
Parent:=Self;
end;
List.Add(Ptr);
end;
 
JohnSonGuo:
多谢赐教。不好意思。我还有一个问题。用Tlist实现不定长控件数组,如何让每一个控件来响应事件?
我在你的程序中加了一段:
procedure TMainFrm.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Ptr:PShape;
begin
New(Ptr);
Ptr^:=TShape.Create(Self);
with Ptr^ do begin
Left:=X-2;
Top:=Y-2;
Width:=5;
Height:=5;
Parent:=Self;
OnClick:=ButtonsClick;//新加的
end;
List.Add(Ptr);
end;

procedure TMainFrm.ButtonsClick(Sender:TObject);
begin
Label1.Caption:='hit it';
end;
实际执行结果是在我放第二个动态shape控件(点击窗体)时,Buttons就已执行,而没有等到去点击shape控件,为何?
另外,如何区分是不同的控件的事件而做出不同的响应?
 
你的程序有错,因为TShape本身没有OnClick事件,因此你对OnClick赋值,
编译器实际解释为对MainFrm.OnClick进行赋值。
那么当你放第二个TShape控件时,当然会激化MainFrm.OnClick事件了。
要区分不同的控件,可以通过设置控件的Tag属性,如:

with Ptr^ do begin
...
Tag:=List.Count;
end;

 
我已接受答案了。因分数不够分,对不起未分到的各位了。
 
后退
顶部