窗体之间传递数据(50分)

  • 主题发起人 主题发起人 天道酬勤
  • 开始时间 开始时间

天道酬勤

Unregistered / Unconfirmed
GUEST, unregistred user!
我利用wm_copydata在两个窗体之间传递字符串可以。<br>传递字定义的纪录时,老显示乱码?<br>unit1 code:<br>//传递字符<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; ds:Tcopydatastruct;<br>begin<br>&nbsp;ds.cbData:=length(Trim(Self.Edit1.Text))+1;<br>&nbsp;GetMem (ds.lpData, ds.cbData );<br>&nbsp;StrCopy(ds.lpData,PChar(Edit1.Text));<br>&nbsp;try<br>&nbsp; &nbsp;form2:=Tform2.Create(nil);<br>&nbsp; &nbsp;SendMessage(form2.Handle,wm_copydata,self.Handle,Cardinal(@ds));<br>&nbsp; &nbsp;Form2.ShowModal;<br>&nbsp;finally<br>&nbsp; &nbsp;Form2.Free;<br>&nbsp; &nbsp;Freemem(ds.lpdata);<br>&nbsp;end;<br>end;<br><br>//发送记录<br>procedure TForm1.Button2Click(Sender: TObject);<br>type<br>&nbsp; Tstudentinfo=packed record<br>&nbsp; Lname:string[10];<br>&nbsp; Lsex:String[2];<br>end;<br>var<br>&nbsp; ds:Tcopydatastruct;<br>begin<br>&nbsp; ds.cbData:=sizeof(Stuinfo);<br>&nbsp; Getmem(ds.lpData ,ds.cbData);<br>&nbsp; try<br>&nbsp; &nbsp;form2:=Tform2.Create(nil);<br>&nbsp; &nbsp;SendMessage(form2.Handle,wm_copydata,self.Handle,Cardinal(@ds));<br>&nbsp; &nbsp;Form2.ShowModal;<br>&nbsp;finally<br>&nbsp; &nbsp;Form2.Free;<br>&nbsp; &nbsp;Freemem(ds.lpdata);<br>&nbsp;end;<br>end;<br>unit2 code;<br>procedure TForm2.GetData(var Msg: Twmcopydata);<br>begin<br>&nbsp; label1.Caption:=StrPas(Msg.CopyDataStruct^.lpData); 显示字符<br>&nbsp; 记录怎样显示出来?<br>end;<br><br>
 
建议你去看本书,深入WINDOWS核心编程, 这本书里有很多这样的例子。
 
你为什么不做一个有的记录定义在主窗体中或公共窗体中作为公共变量呢?<br>发送消息前更新记录<br>接收时读取记录的值就行了。
 
procedure TForm1.Button2Click(Sender: TObject);<br>type<br>&nbsp;Tstudentinfo=packed record<br>&nbsp;Lname:string[10];<br>&nbsp;Lsex:String[2];<br>end;<br>var<br>&nbsp;ds:Tcopydatastruct;<br>begin<br>&nbsp;ds.cbData:=sizeof(Tstudentinfo);<br>&nbsp;Getmem(ds.lpData ,ds.cbData);<br>&nbsp;try<br>&nbsp; Tstudentinfo(ds.lpData^).Lname := 'ABCDEFGHI';<br>&nbsp; form2:=Tform2.Create(nil);<br>&nbsp; SendMessage(form2.Handle,wm_copydata,self.Handle,Cardinal(@ds));<br>&nbsp; Form2.ShowModal;<br>finally<br>&nbsp; Form2.Free;<br>&nbsp; Freemem(ds.lpdata);<br>end;<br>end;<br><br>procedure TForm2.GetData(var Msg: Twmcopydata);<br>type<br>&nbsp;Tstudentinfo=packed record<br>&nbsp;Lname:string[10];<br>&nbsp;Lsex:String[2];<br>end;<br>begin<br>&nbsp;label1.Caption:= Tstudentinfo(Msg.CopyDataStruct^.lpData^).LName;<br>end;
 
同意hnxx2003的看法,何必要搞的那么复杂。
 
分开两个窗体,使用两个独立的窗体在试,<br>还有,这样做好象没有太大的意义。
 
這個做法有些地方還是可以用到,要不何必還要WM_COPYDATA這個消息呢.
 
当然需要,我的程序就用了这个方式传递数据,<br>不过和你的不同,我的是两个独立不相关的程序,用的和上面的代码相同,使用正常/
 
后退
顶部