var
FormMsg:TForm3;
begin
//
if assigned(FormMsg) then
begin
FormMsg:=TForm3.Create(Self);
FormMsg.MsgParm.s_PayId := IntToStr(FormMsg.Handle);
FormMsg.MsgParm.FormHand:= FormMsg.Handle;
FormMsg.Show;
end;
end;
在Form3里這樣可以正確取到值
Form3頭部
unit Unit3;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls;
type TMsginfo = record
s_Op:string;
FormHand:Integer;
ItemId:Integer;
end;
PMsginfo = ^TMsginfo;
type
TForm3 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Splitter1: TSplitter;
Button1: TButton;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MsgParm:TMsginfo;
end;
var
Form3: TForm3;
MsgThread :Integer;
b_MsgComplent:Boolean;
implementation
procedure TForm3.Button1Click(Sender: TObject);
var
i:string;
begin
i := MsgParm.s_PayId;
end;
下面的執行緒我要怎么取值,請指點一下
procedure TForm3.FormShow(Sender: TObject);
var
ThreadID:Cardinal;
begin
//MsgParm.FormHand:= Self;
MsgParm.s_Op := 'Open'; //這里都能正確取值
b_MsgComplent:= True;
//MsgDo(1);
MsgThread:=CreateThread(nil,0,@MsgDo,@MsgParm,0,ThreadID);
end;
function MsgDo(P:Pointer):Integer;
var
payid:string;
begin
payid :=PMsgParm(P)^.s_PayId;//這樣取不到值了
payid :=MsgParm.s_PayId;//這樣取不到值了
//如果不是動態創建的
payid :=Form3.MsgParm.s_PayId;//這樣也取不到
end;
這個執行緒中我要如何取值,傳值
uj5u.com熱心網友回復:
創建執行緒時,不要傳MsgParm進去,而要傳TForm3的實體進去。譬如:MsgThread:=CreateThread(nil,0,@MsgDo,Self,0,ThreadID);
再在執行緒中通過此實體訪問其域變數MsgParm。
uj5u.com熱心網友回復:
function MsgDo(P:Pointer):Integer;定義錯誤,改成
function MsgDo(P:Pointer):Integer;stdcall;
uj5u.com熱心網友回復:
直接搞個全域變數不好嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86110.html
標籤:VCL組件開發及應用
上一篇:【告訴我我不是一個人】關于記憶體加載EXE并運行,WIN7下不可用的解決方法。
下一篇:表單顯示問題,新手求助!
