如果A/B/C/D/E窗体不引用主窗体, 能不能调用主窗体的过程或者是函数或者能不能访问主窗体的某个控件。

解决方案 »

  1.   

    1,一般不可以;
    2,但可以通过消息来控制,不过比较复杂;因为要用FINDWINDOWEX来找HANDLE;
      

  2.   

    FINDWINDOWEX来找HANDLE;
    怎么做
      

  3.   

    FindWindow(
    lpClassName: PChar; {a pointer to a null terminated class name string}
    lpWindowName: PChar {a pointer to a null terminated window name string}
    ): HWND; 函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
    参数:
    IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。var Wnd : HWnd;
    Wnd := FindWindow('Notepad',Nil);
      

  4.   

    同意outer2000(天外流星) 的说法。在不引用主窗体的情况下一般无法调用。
      

  5.   

    想法很奇怪,为什么要这么做.
    如果你在窗体F引用主窗体,做个函数调用主窗体的过程或者是函数
    A/B/C/D/E窗体引用F窗体,调用F窗体的函数,就可以间接调用主窗体的过程或者是函数.
    总之变通的方法很多,不要死脑筋
      

  6.   

    FindWindowEx(
    Parent: HWND; {a handle to a parent window}
    Child: HWND; {a handle to a child window}
    ClassName: PChar; {a pointer to a null terminated class name string}
    WindowName: PChar {a pointer to a null terminated window name string}
    ): HWND; {returns a handle to a window}函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。参数;
     hwndParent:要查找子窗口的父窗口句柄。
     如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
     Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
     hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
     lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
     lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。Wnd:=FindWindowEx(Wnd,0,'Edit',Nil);
      

  7.   

    楼上说的有道理,可以单独放在一个单元里, 如果每个窗体都装这个单元,那use 不是更简单吧? 
    因为现有100多个窗体, 每个窗体都需要调用主窗体的 菜单,(也就是每个窗体启动的时候把 窗体的标题写在 菜单-->窗口 的条目里,)如果是系统自带的菜单就直接可以访问了, application.mianform.menu
    但这个菜单是第三方控件 这样做是没有用的。var Wnd : HWnd;
    Wnd := FindWindow('Notepad',Nil); 哪里能做到
      

  8.   

    FindWindowEx()具体怎么做。解决立刻放分。
      

  9.   

    如下,别的窗体不是由application创建,而是自己创建
    下面是怎样操作一个TADOQuery控件,其他类似。
    qry1为TfmFavorit类中的一个TADOQuery控件,
    执行qry1 := Query;后就可以在TfmFavorit中操作qry1(代码略去),相当于操作Query,
    当然Query是主窗体里面的一个TADOQuery控件了。
        
    procedure MoveURLFromFavorit(Query: TADOQuery; StrPath: string);
    begin
      with TfmFavorit.Create(nil) do
      try
        qry1 := Query;
        InitForm;
        ShowModal;
      finally
        Free;
      end;
    end;