各位大哥:opendialog 这样用为什么不行?谢谢! ( 积分: 100 )

  • 主题发起人 主题发起人 宇宙神
  • 开始时间 开始时间

宇宙神

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Menus;

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
StringGrid1: TStringGrid;
OpenDialog1: TOpenDialog;
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.N1Click(Sender: TObject);

var
ss:string;
begin
if (OpenDialog1.Execute) then
begin
ss:=OpenDialog1.FileName;
end;
showmessage(ss);
end;



end.

编译没有错误,可是运行有错误,而且是内存地址错的那种
帮我试试,好吗?

谢谢!
 
rocedure TForm1.N1Click(Sender: TObject);

var
ss:string;
begin
[red]ss := '';[/red]
if (OpenDialog1.Execute) then
begin
ss:=OpenDialog1.FileName;
end;
showmessage(ss);
end;

或者
rocedure TForm1.N1Click(Sender: TObject);

var
ss:string;
begin

if (OpenDialog1.Execute) then
begin
ss:=OpenDialog1.FileName;
[red]showmessage(ss);[/red]
end;

end;
 
你的错误在于,ss这样的字符串在Delphi编译的时是当作指针用的,在栈内声明(就是局部变量)的变量是没有初始值的,所以ss可以是指向任何地址的指针,而当你试图访问的时候,那个指向的地址不一定可用,所以就出现错误了.

你的错误就是在你点了OpenDialog弹出后的取消按钮后出现,对把?自己整理一下逻辑吧.
 
同意楼上的
 
同意 zqw0117。
 
呵呵,同样的代码我这里没报错啊,楼主把编译选项中的Strict var-strings勾上再试试。
 
zqw0117分析的很透彻
不过我以前也那样用过却没有错误呵呵
不知道为什么
电脑的事情很多没办法解释清楚
不过听了zqw0117后突然觉的有时候我太想当然了
 
来晚了,不过在判断对话框时最好这样判断!
if (opendialog1.execute) and (opendialog1.filename<>'') then
begin
................................
end;
 
同意楼上的
 
又学到了新的东西[:D]
 
在栈内声明(就是局部变量)的变量是没有初始值的
===============
看来局部变量最好也自己初始化。
 
奇怪的是在我这儿没有出错啊
 
太感谢各位大哥了
 
多人接受答案了。
 
>>来自:暗夜中独舞, 时间:2007-3-9 9:08:57, ID:3678686
>>zqw0117分析的很透彻
>>不过我以前也那样用过却没有错误呵呵
>>不知道为什么
>>电脑的事情很多没办法解释清楚
>>不过听了zqw0117后突然觉的有时候我太想当然了


这纯属幸运,因为栈内存是不会初始化,换句话说,这段内存原来存有什么数据,下次申请的时候仍然保留上次写入的数据。之所以你这样用不报错,是幸好这个位置存的就是0,如果这个位置再被别的代码请求并写入过数据,情况就会完全不一样了。所以一定不要忘记对局部变量赋初值。其实楼主的代码在编译的时候会有一个Warning警告的,那个警告已经说明了他的ss变量的值可能是未知的(不确定的)。

>>来自:lifangchao2008, 时间:2007-3-9 9:10:01, ID:3678687
>>来晚了,不过在判断对话框时最好这样判断!
>>if (opendialog1.execute) and (opendialog1.filename<>'') then
>>begin
>>................................
>>end;

这个if判断非常多余,因为OpenDialog.Execute如果返回的是True的话,OpenDialog.FileName必定不是空字符串。所以直接写if OpenDialog1.Execute then就足够了。
 
帮你顶一下
 
后退
顶部