//这个是被运行的窗体,它可以接收参数并保存在公用变量para1中
constructor TForm_SCD.create(var P1:String);
begin
inherited Create(Application);
Para1:=P1;
//临时添加的测试行,希望它被改变后还能返回
Para1:='新字串';
end;
//现在开始测试:调用上面的窗体
procedure TForm1.Button1Click(Sender: TObject);
var TestStr:String;
begin
TestStr:='开始字串';
Show_Form_ByStr('TForm_SCD',TestStr); //运行实例窗体
showmessage(TestStr); // 这里为问题所在之处:TestStr的值并没有变成 '新字串',还是'开始字串' 。
end;
constructor TForm_SCD.create(var P1:String);
begin
inherited Create(Application);
Para1:=P1;
//临时添加的测试行,希望它被改变后还能返回
Para1:='新字串';
end;
//现在开始测试:调用上面的窗体
procedure TForm1.Button1Click(Sender: TObject);
var TestStr:String;
begin
TestStr:='开始字串';
Show_Form_ByStr('TForm_SCD',TestStr); //运行实例窗体
showmessage(TestStr); // 这里为问题所在之处:TestStr的值并没有变成 '新字串',还是'开始字串' 。
end;
所以TestStr的值并不会改变;constructor TForm_SCD.create(var P1:String);
begin
inherited Create(Application);
Para1:=P1;
//临时添加的测试行,希望它被改变后还能返回
Para1:='新字串';
//加入试试<--Add
P1 := Para1;
end;
这有什么用啊?
Para1:=P1;我的本意是要把 P1的地址赋给Para1的地址,但实际上赋的不是地址而是值。只要能把P1的地址赋过去,所有的问题都解决了。大家出招!
因为要重复(递归)调用同一个Form,会搞乱套的,所以只能定义在自家院里。
其一:
.....
showmessage(TestStr); // 这里为问题所在之处:TestStr的值并没有变成 '新字串',还是'开始字串' 。
如果TestStr是要得到"新字串",正如duanhai(段海)讲的一样,你并没有给p1赋值,TestStr的值不会改变呀。其二:要把 P1的地址赋给Para1的地址,而不是传变量值 不是很明白楼主的意思,到底是要返回值还是要得到地址,这个地址是什么?内存地址还是。
begin
inherited Create(Application);
Para1:=P1;
//临时添加的测试行,希望它被改变后还能返回
P1:='新字串';// <-这里变了
end;
…………………………………………
TestStr:='开始字串';
Show_Form_ByStr('TForm_SCD',TestStr); //运行实例窗体
showmessage(TestStr);
…………………………………………
会显示:新字串
这样理应可以解决问题。
constructor TForm_SCD.create(var P1:String);
传的本来就是var P1,所以P1在TForm_SCD.create里的改变会使
Show_Form_ByStr('TForm_SCD',TestStr); 里的TestStr发生改变。
Show_Form_ByStr('TForm_SCD',TestStr); //這裡的TestStr是傳值,還是傳地址啊。