怎样获取此窗体的当前可视子窗体的句柄?(100分)

  • 主题发起人 主题发起人 夜鹰
  • 开始时间 开始时间

夜鹰

Unregistered / Unconfirmed
GUEST, unregistred user!
unit MainF;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Sub:TSub;
I:Integer;
begin
for I:=1 to 5 Do
begin
Sub:=TSub.Create(Self);
Sub.Parent:=Self;
Sub.Align:=alClient;
Sub.Caption:='Form ' + IntToStr(I);
Sub.Show;
end;
end;
end.
/////////////////////////////////////////////////////////////////////
unit SubF;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TSub = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Sub: TSub;
implementation
{$R *.DFM}
procedure TSub.Button1Click(Sender: TObject);
begin
ShowMessage(Self.Caption);
end;
end.

关闭或 打开几个窗体后,怎么判断当前的最上面的可视子窗体?
 
Application类里面不是有个ActiveControl属性么?

取得这个属性的parent就是
 
To vine:
不行的,我已经试过了,不能得到当前窗体的可视子窗体的
 
每个窗体都有一个Active属性

可以:
with form1 do
for i:=0 to componentcount-1 do
if component is TSub then
if TSub(component).active then
begin
activeform:=TSub(component).name;
break;
end;

可能一时间写得太乱了,自己整理一下吧!
 
To vine:
不行的,我已经试过了,不能得到当前窗体的可视子窗体的
procedure TForm1.ToolButton1Click(Sender: TObject);
var
TS:TSub;
begin
TS:=TSub.Create(Self);
TS.Parent:=Self;
TS.Tag:=5;
TS.Align:=alClient;
TS.Caption:='Form ' + IntToStr(I);
TS.Show;
Inc(I);
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
var
I:Integer;
begin
I:= Screen.FormCount;
for I := 0 to Screen.FormCount - 1 do
if (Screen.Forms.Tag = 5) and (Screen.Forms.ControlState
ShowMessage(Screen.Forms.Caption);

end;
这是我以前试过的代码,不行的,可能是检测窗体的位置,就是在最上面的一个子窗体



 
代码:
试试这个吧。
procedure TForm1.Button1Click(Sender: TObject);
//回调函数
//===============================================================
function EnumChildWindowsProc(hwnd: Integer; lparam: Longint): Boolean; stdcall;
const
ClassName = 'TfrmMain';
var
buffer: array[0..255] of Char;
ResultCh: Integer;
begin
Result := True;
GetClassName(hwnd, buffer, 256);
if buffer = ClassName then
begin
ShowMessage('已经找着,句柄为' + IntToStr(hwnd));
//PostMessage(hwnd, WM_CLOSE, 0, 0);
//做其它事情
end;
end;

//===============================================================
const
title1 = '标题一';
title2 = '标题二';
var
Buffer: array[0..255] of Char;
hwnd: Integer;

begin
hwnd := FindWindowEx(0, 0, nil, PChar(title1));
if hwnd = 0 then
hwnd := FindWindowEx(0, 0, nil, PChar(title2));
if hwnd <> 0 then
EnumChildWindows(hwnd, @EnumChildWindowsProc, Integer(@hwnd));
end;
 
To Nizvoo:
我想要的象是MDI中的ActiveMIDChild 类似的属性可以直接获取最上面的窗体的句柄
如果一个个去枚举用Screen.FormCount就可以了。我只好再想想了。
 
你可以把子窗体的指针放到一个TList里,然后设置一个公用的索引变量,
在每个子窗体的Active改变的时候设置该索引变量即可。
 
怎样向程序内所有的窗体都发送消息来控制,而不用循环每个都发送
 
多人接受答案了。
 

Similar threads

后退
顶部