dllMDI窗体有没有办法调用父窗体的方法
dllMDI窗体有没有办法调用父窗体的方法
我想把所有子窗体都创建在DLL中,父窗体只向DLL传如APPLICATION对象
有没有办法在MDI子窗体内调用父窗体的自定义方法,通过父窗体的句柄对象能反射调用吗?
typedef int(*func)(int);
func sum;
sum = (func)Application->MainForm->MethodAddress("GetSum");
return sum(10);
这是我在BCB代码里写的代码,到行不通,sum 等于 NULL,
在设置子窗体的Parent = Application->MainForm运行时发生错误Cannot focus a disabled or invisible window
所有改用Application->MainForm
我还尝试了另外一种方法,但也不行
PMethodInfoHeader mih
mih = GetMethodInfo(Application->MainForm,"GetSum");
int p1 = 1,p2 =2;
Variant *v1;
int result = ObjectInvoke(Application->MainForm,mih, &p1,p2,v1,1);
return result;
[解决办法]
用回调函数
[解决办法]
回调,传指针
[解决办法]
回调。
[解决办法]
下面代码可以试试。
function GetInstanceFromhWnd(const HWND: Cardinal): TWinControl;
type
PObjectInstance = ^TObjectInstance;
TObjectInstance = packed record
Code: Byte; { 短跳转 $E8 }
Offset: Integer; { CalcJmpOffset(Instance, @Block^.Code); }
Next: PObjectInstance; { MainWndProc 地址 }
Self: Pointer; { 控件对象地址 }
end;
var
wc: PObjectInstance;
begin
Result := nil;
wc := Pointer(GetWindowLong(HWND, GWL_WNDPROC));
if wc <> nil then
begin
Result := wc.Self;
end;
end;
//dll窗体程序
procedure TfrmAttRecord.actCloseExecute(Sender: TObject);
var
tbs: TRzTabSheet;
begin
//获取主窗体的控件
tbs := TRzTabSheet(GetInstanceFromhWnd(Self.ParentWindow));
if tbs <> nil then
begin
//操作主窗体控件
tbs.PageControl.CloseActiveTab;
end;
end;