同志们都进来看看!!单元之间调用问题 !!偶快疯了!!(100分)

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

etu5

Unregistered / Unconfirmed
GUEST, unregistred user!
偶在主单元main.pas里定义了
private
str:string;
{ Private declarations }
public
function getstr:string;
{ Public declarations }
end;
在一个procedure里写了:str:='Demo';
在另一个单元other.pas
uses main;

然后在一个procedure里写了下面语句:
ShowMessage(main.MainForm.getstr);

开始还是可以的,在other.pas单元可以出现一个显示为'Demo'的对话框……可是不知道怎么回事,第N次运行时发现在other.pas单元showMessage意外的得出的是个空字符!!这是怎么回事阿?? 开始还是可以SHowMessage出主单元main.pas定义的私有变量str的,怎么又不行了那??大虾救偶阿!!!

偶以为是str可能在某个地方被更改了,所以偶又在main单元定义个私有变量str1:string
定义了个公共function getstr1;在other.pas写上showMessage(main.mainform.getstr1),得出的还是空字符……怎么回事阿??????

帮帮偶阿!!偶快疯了

是不是Delphi的编译器的问题阿??偶都重启几次了还是那样阿
 
为什么把str定义为私有的啊,
把他放到PUBLIC里试试拉
 
str:='Demo';是在哪里,在getstr里吗?
 
既然想引用就声明为公共变量啊
换个位置
 
代码贴出来,比较容易找
 
偶的意思是:
//----------------------------
main.pas:
Type
TMainForm=class(Form)
...
...
...
private:
str:string;
Public:
function getStr:string;
implementation
....
function TMainForm.getStr:string;
begin
result:= str;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
str:='demo';
end;

//---------------------------
other.pas:
Type
Totherform=class(form)
...
...
implementation
uses main;

procedure TMainForm.Button1Click(Sender: TObject);
begin
showMessage(main.mainform.getstr);
end;

这应该是没错误的,因为偶重新建立了一个工程,把上面的语句试了没问题……
可是在偶原来的那个程序中问题还是存在阿!这是怎么回事阿 ?????????偶快疯了!!!
 
在一个procedure里写了:str:='Demo';
===================================

只能说明在 show...之间根本没有调用 这个procedure 进行初始化,
或在其它地方重新进行了设置。
 
看other.pas单元:
Type
Totherform=class(form)
...
...
implementation
uses main;

procedure TMainForm.Button1Click(Sender: TObject);//此行是否笔误,应为Totherform吧?
begin
showMessage(main.mainform.getstr);
end;
 
我对你的程序 看的不是太清楚
不好意思帮不上忙
 
看看工程的初始化代码。
Other单元中
procedure TMainForm.Button1Click(Sender: TObject);//TMainForm应该是TOtherForm吧,这样能通过?
begin
showMessage(main.mainform.getstr);
end;
 
1,这两个单元,谁先Create,main在前,
2,showMessage,messagebox有时会有问题,具体原因说不清;
 
To xuxincheng, 对,是笔误……偶发帖子写错了

 
同志们,错误找到了!

竟然是这么一个弱智的错误:
偶在工程文件中:
program Project;

uses
Forms,
main in 'main.pas' {MainForm},
newsubwin in 'newsubwin.pas' {NewForm},
addindex in 'addindex.pas' {addindexForm};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TMainForm, MainForm)
//错误在这里,重复创建了两个MainForm应用
Application.CreateForm(TNewForm, NewForm);
Application.CreateForm(TaddindexForm, addindexForm);
Application.Run;
end.

天哪~~~偶郁闷阿
可是这样
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TMainForm, MainForm)

两次为什么会导致其他单元引用不了该单元的私有字符变量阿?得到的总是空字符?WHY???大虾教偶~~!!!
 
是不是它(Delphi编译器)发现有两个MainForm应用不知道调用哪个应用的那个私有字符变量好,所以得到一个空字符阿??
 
比较怪,难以解释。。。
 
书上说,千万不要这样做!但它没说会出现什么问题!通过etu5兄的实践,就清楚了
不过居然没有抱错!
 
一个建议:
你这样设置你的变量不更好:把它声明成属性。

在public段
property Str: String read GetStr write SetStr;

这样更符合Delphi的面向对象编程习惯。
 
早点收贴吧!
 
谢谢各位富翁们的关注!谢谢!:)

散分了,每人都有份~
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
855
import
I
后退
顶部