有两个窗体,分别为一个串口接收的界面,但是就在我设置INI文件来控制传输的协议的参数时,却是怎么的也编译不过去:请问怎样的处理这样两个窗体时数据取值和建值时的冲突问题,同时还有一个是当我在程序运行时,设置窗体中值变时,在FORM1的DCB数据也能同时变,不知怎样的实现,现在我的程序只能重新启动,运行Form1oncreat()后DCB数据才能变。Form1(主窗体)INI部份代码如下:procedure TForm1.FormCreate(Sender: TObject);
var
dcb:tdcb;
error:boolean;
commname:string;
filename:string;
begin
form2.edit1.Text:=inttostr(myinifile.ReadInteger('DCBDATa','baudrate',0));//在这里就产生了冲突,可能为为窗体建立时不能同时查找数据
form2.combobox1.Text:=inttostr(myinifile.ReadInteger('DCBDATa','data',0));
form2.combobox2.Text:=inttostr(myinifile.ReadInteger('DCBDATa','stopbit',0));
form2.combobox3.Text:=inttostr(myinifile.ReadInteger('DCBDATa','psrity',0));
hrecv:=createfile(pchar('com2'),generic_read,0,nil,open_existing,file_flag_overlapped,0);
if hrecv=invalid_handle_value then
  raise exception.Create('打开COM2错误');
  error:=setcommmask(hrecv,ev_rxchar);
  if (not error) then
  raise exception.Create('setmmmask错误');
  setupcomm(hrecv,1024,1024);
  getcommstate(hrecv,dcb);
  dcb.BaudRate:=strtoint(form2.edit1.text);
  dcb.ByteSize:=strtoint(form2.combobox1.text);
  dcb.StopBits:=strtoint(form2.combobox2.text);
  dcb.Parity:=strtoint(form2.combobox3.text);
  error:=setcommstate(hrecv,dcb);
  if (not error) then
    raise exception.Create('设置COM2错误');
    statusbar1.Panels[0].Text:='COM2已打开';
end;Form2(设置窗体)INI部份代码如下:procedure TForm2.Button1Click(Sender: TObject);
begin
myinifile:=tinifile.Create(extractfilepath(paramstr(0))+'dkongsort.ini');
myinifile.WriteInteger('DCBDATa','baudrate',strtoint(edit1.Text));
myinifile.WriteInteger('DCBDATa','data',strtoint(combobox1.Text));
myinifile.WriteInteger('DCBDATa','stopbit',strtoint(combobox2.Text));
myinifile.WriteInteger('DCBDATa','parity',strtoint(combobox3.Text));
myinifile.Free;
close;
end;

解决方案 »

  1.   

    窗体建立的时候可以读数据,这是肯定的,但问题是在TForm1建立的时候TForm2也建立了么,如果没有当然会出错。第二个问题不懂,8好意思
      

  2.   

    我也试想过这样的问题,因此在但是我在Tform1.formoncrate()中也加入了form2.oncreat(nil)在读数据的前面;如果是这样的问题的话,这个代码的加入应当可以解决这个问题来的,但还是不行。
      

  3.   

    试试用ShowMessage去调试,先别赋值
      

  4.   

    数据是可以出来的,只是前面有显示冲突的警示语句(而且是二次),之后前面还是运行正常的,只端口打不开,DCB数据取值不对,不过第二个问题已解决,增加一个form1.formcreate(nil)人、事件,就可同步实现数据的更新了。但是我另外作的一个模拟的却非常的好,而且我也对照了其中的代码,也没有那里有误,只是一个是一个窗体,一个是两个窗体,我模拟的代码如下,完全可以完成数据的读、写和实时的更新,哎苦闷!!!:
    implementation
    var
      appna,rate:string;
      myinifile:tinifile;
    {$R *.dfm}
    procedure TForm1.FormCreate(Sender: TObject);
    var
    filename:string;
    begin
    filename:=extractfilepath(application.ExeName) + 'testini.ini';
    if not fileexists(filename) then
      raise exception.Create('testini文件不存在');
      myinifile:=tinifile.Create(filename);
      edit1.Text :=myinifile.ReadString('参数配置一','appname','');
      spinedit1.Text :=inttostr(myinifile.ReadInteger('参数配置一','appyear',0));
      checkbox1.Checked :=myinifile.ReadBool('参数配置一','appbeta',false);
      edit2.Text:=inttostr(myinifile.ReadInteger('参数配置一','rate',0));
      rate:=myinifile.ReadString('参数配置一','rate','');
      appna:=myinifile.ReadString('参数配置一','appname','');
      label1.Caption:=rate;
      label6.Caption:=appna;
    end;
    procedure tform1.formdestroy(sender:tobject);
     begin
       myinifile.Free ;
      end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    myinifile.WriteString('参数配置一','appname',edit1.Text);
    myinifile.WriteInteger('参数配置一','appyear',strtoint(spinedit1.Text));
    myinifile.WriteBool('参数配置一','appbeta',checkbox1.Checked );
    myinifile.WriteInteger('参数配置一','rate',strtoint(edit2.Text));
    self.FormCreate(nil);
    end;
      

  5.   

    在form1.formcreat()建立时,不能给form2中的edit或其它的文字栏赋值吗,但是它们的初始的赋值是可以的(即在属性text中的值),这难道不是一样的道理吗