//这个是被运行的窗体,它可以接收参数并保存在公用变量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;

解决方案 »

  1.   

    在你的事件中,并没有改变P1的值,
    所以TestStr的值并不会改变;constructor TForm_SCD.create(var P1:String);
    begin
      inherited Create(Application);
      Para1:=P1;
      //临时添加的测试行,希望它被改变后还能返回
      Para1:='新字串';
      //加入试试<--Add
      P1 := Para1;
    end;
      

  2.   

    P1 := Para1;
    这有什么用啊?
      

  3.   

    经再测试,发现是这一行没起作用:
    Para1:=P1;我的本意是要把 P1的地址赋给Para1的地址,但实际上赋的不是地址而是值。只要能把P1的地址赋过去,所有的问题都解决了。大家出招!
      

  4.   

    不能这样做: "保存要返回的结果到共有变量"
    因为要重复(递归)调用同一个Form,会搞乱套的,所以只能定义在自家院里。
      

  5.   

    之前你写到:  
    其一:
    .....
      showmessage(TestStr); // 这里为问题所在之处:TestStr的值并没有变成 '新字串',还是'开始字串' 。
    如果TestStr是要得到"新字串",正如duanhai(段海)讲的一样,你并没有给p1赋值,TestStr的值不会改变呀。其二:要把 P1的地址赋给Para1的地址,而不是传变量值 不是很明白楼主的意思,到底是要返回值还是要得到地址,这个地址是什么?内存地址还是。
      

  6.   

    constructor TForm_SCD.create(var P1:String);
    begin
      inherited Create(Application);
      Para1:=P1;
      //临时添加的测试行,希望它被改变后还能返回
      P1:='新字串';// <-这里变了
    end;
    …………………………………………
      TestStr:='开始字串';
      Show_Form_ByStr('TForm_SCD',TestStr); //运行实例窗体
      showmessage(TestStr); 
    …………………………………………
    会显示:新字串
    这样理应可以解决问题。
      

  7.   

    原因就是因为你用的是
    constructor TForm_SCD.create(var P1:String);
    传的本来就是var P1,所以P1在TForm_SCD.create里的改变会使
    Show_Form_ByStr('TForm_SCD',TestStr); 里的TestStr发生改变。
      

  8.   

    問題會不會在這個函數中啊:
    Show_Form_ByStr('TForm_SCD',TestStr); //這裡的TestStr是傳值,還是傳地址啊。
      

  9.   

    var是一个传址引用呀! 上面几位朋友都把对脉了!就不多说了
      

  10.   

    欢迎加入Borland DELPHI程序员,参与群里技术讨论!欢迎女孩子,也欢迎男孩子参与技术讨论!群号15154361