+ -
当前位置:首页 → 问答吧 → 在MDI窗体下怎么判断要打开的窗体是否已打开

在MDI窗体下怎么判断要打开的窗体是否已打开

时间:2011-10-08

来源:互联网

就是用到了bpl封装了窗体单元,后在主程序里动态调用bpl,可以在主程序里调用到封装的窗体单元,现在的问题是:多次点击时会有多个重复的窗体单元,现在是不知道怎么判断该窗体已打开,已存在的情况下,只要放到最前面就行了。

Delphi(Pascal) code

 if (ChildForm[n,0] <> EmptyStr) and (ChildForm[n,0] = 'base') then
 begin
  TForm(BplForm).BringToFront;   //这个bpl是字符串,就是内存地址出错,自己测试用的
  Abort;
end;

作者: moshao6   发布时间: 2011-10-08

为打开的窗体取一个唯一的标识,添加到列表,下次打开时,先检测列表中是否已经存在

作者: bdmh   发布时间: 2011-10-08

Delphi(Pascal) code

var
  ps: array[0..254] of Char;
  hChild:HWND;
begin
   hChild:=   GetWindow(ParentWnd,   GW_CHILD);   //   取得第一個子視窗,ParentWnd:主窗口句柄
    while   hChild<>   0   do
    begin
        if   IsWindowVisible(hChild)  then
        begin
            GetClassName(hChild,ps, 255);   
            if   SameText(StrPas(ps[0]),'你的子窗口类名')   then   //  如果类名相同就置前
            begin
               SetForegroundWindow(hChild);
               exit;
            end;   
        end;
        hChild:=GetWindow(ParentWnd,   GW_HWNDNEXT);   //   取得下一個   siblings   視窗
    end;
    //如果没有就直接创建
end;

作者: m617105   发布时间: 2011-10-08

获取子窗体名称的句柄
如果存在证明打开,否则则未打开

作者: liubinhua   发布时间: 2011-10-08

怪我没有说明清楚,现在我放了一个传入的一个字符串(也就是窗体的名称),第一次我可以show出窗体来,现后传入的窗体名称(不是窗体句柄或对像)放到一个string数组里,当第二次打开时判断是不是有相同的名称,现在的问题是:
Delphi(Pascal) code
TForm(BplForm).BringToFront;   //这个bpl是字符串,就是内存地址出错,自己测试用的
 
这句代码不能show出窗体,只有一个内存地址错误,主要是bplForm是字符串而不是对像,那我要怎么样才能BringToFront出来已打开的窗体。

作者: moshao6   发布时间: 2011-10-08

Delphi(Pascal) code
 
var
  Aclass: TFormClass;
   ChildForm: array [0..3,0..1] of TFormClass;//全局
///--------------------------------///
  Aclass := TFormClass(GetClass(BplForm));
    if Aclass <> nil then
    begin
      for  n :=  0 to Screen.FormCount - 1  do
      begin
        if ChildForm[n, 0] = nil then
        begin
          with TFormClass(Aclass).Create(Application) as  TForm do
          begin
            ChildForm[n , 0] := Aclass;
            //ChildForm[n , 1] := Caption;
            FormStyle  := fsMDIChild;
            WindowState := wsMaximized;
            Break;
          end;
        end
        else
        if (ChildForm[n,0] <> nil) and (TFormClass(Aclass) = ChildForm[n,0])  then
        begin
          //ShowMessage(toString(TFormClass(Aclass)));
          (TFormClass(Aclass) as TForm).BringToFront;
          Abort;
        end;
      end;
      case flag of
        1: Show;
        2: ShowModal;
        3: Hide;
      end;

我的代码

作者: moshao6   发布时间: 2011-10-08

引用 2 楼 m617105 的回复:

Delphi(Pascal) code

var
ps: array[0..254] of Char;
hChild:HWND;
begin
hChild:= GetWindow(ParentWnd, GW_CHILD); // 取得第一個子視窗,ParentWnd:主窗口句柄
while hChild<> 0 do
begin
……


在这个方法中,你传递的是什么进来 的

作者: moshao6   发布时间: 2011-10-08

引用 6 楼 moshao6 的回复:

引用 2 楼 m617105 的回复:

Delphi(Pascal) code

var
ps: array[0..254] of Char;
hChild:HWND;
begin
hChild:= GetWindow(ParentWnd, GW_CHILD); // 取得第一個子視窗,ParentWnd:主窗口句柄
while hChild<> 0 ……

ParentWnd 主窗口句柄

作者: m617105   发布时间: 2011-10-08