环境: 有一个Form1,里面有三个TEdit生成的Edit1,Edit2,Edit3而且都是没有caption的
要求: 编写另外一个程序,能分别获得Form1里面三个Edit的句柄

解决方案 »

  1.   

    for i := 1 to 3 do
    TEdit(FindComponent('edit'+inttostr(i)));
      

  2.   

    查DELPHI帮助关于FindComponent就很清楚了!
      

  3.   

    for i := 1 to 3 do
    TEdit(FindComponent('edit'+inttostr(i)));
      

  4.   

    用api函数呀
    findwindow
    findwindowex
    具体的帮助可以参考delphi在线帮助!
      

  5.   

    回复人: redlegend_126_com(redlegend)
    用api函数呀
    findwindow
    findwindowex
    具体的帮助可以参考delphi在线帮助!简单使用上面的应该不可以
    还要用GetClassName来确定该控件是Edit控件
      

  6.   

    你们的答案很有灌水的嫌疑^_^!
    那么容易的话,为什么不把代码给我?!
    GetClassName得到的三个都是Edit类,怎样区分?
      

  7.   

    汗还要区分没有caption的要求,不太可能区分,最多是获得先后区别,我说要用GetClassName是要你区分Button只类的控件
      

  8.   

    GetClassName得到的三个都是Edit类,怎样区分?这个问题你可以把3个edit分别命名掉,比如edtone,edttwo,edtthree,这样你得到类名的时候就是Tedtone,Tedttwo,Tedtthree
      

  9.   

    问题没这么复杂吧!!标准的API函数都可以做到的,如果不相信我把API手册发给你啊
      

  10.   

    都没有把问题的实质搞清楚我也遇到过类似的问题比如说某个外部程序,上面有三个edit,都没有text或者所谓的capiton 
    那么,如何用findwindowex,得到我想得到的某个edit的handel呢??我始终没有解决,不知道还有哪个高人,帮忙~~
      

  11.   

    比较他们之间的相对位置来确定哪个是哪个
    获得位置的函数GetWindowRect
      

  12.   

    比较他们之间的相对位置来确定哪个是哪个
    获得位置的函数GetWindowRect不知道可以吗,
    一会试试
      

  13.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(Edit1.Name + '的句柄 ' + IntToStr(Edit1.Handle));
      ShowMessage(Edit2.Name + '的句柄 ' + IntToStr(Edit1.Handle));
      ShowMessage(Edit3.Name + '的句柄 ' + IntToStr(Edit1.Handle));
    end;end.
      

  14.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(Edit1.Name + '的句柄 ' + IntToStr(Edit1.Handle));
      ShowMessage(Edit2.Name + '的句柄 ' + IntToStr(Edit1.Handle));
      ShowMessage(Edit3.Name + '的句柄 ' + IntToStr(Edit1.Handle));
    end;end.
      

  15.   

    如果你知道每个控件的大约位置,就可以使用ChildWindowFromPointEx:
    用ChildWindowFromPointEx可以得到,hParent是窗体句柄,Point(x, y) 是控件的大约
    位置,CWP_ALL表示所有控件,也可以制定只取某类控件,函数返回值为控件句柄。
    ChildWindowFromPointEx(hParent, Point(x, y) , CWP_ALL);
    下面是我写的一个获取别的程序edit的内容的例子
    procedure TForm1.Button1Click(Sender: TObject);
    var
      hParent, hEdit: HWND;
      u: pchar;
    begin
      try
        hParent := FindWindow(nil, 'fromB的标题');
        if hParent = 0 then
          showmessage('窗口没有找到!')
        else
        begin
          hEdit := ChildWindowFromPointEx(hParent, Point(10, 10) //大约位置
            , CWP_ALL);
          if hEdit = 0 then
            showmessage('Edit没有找到!')
          else
          begin
            U := StrAlloc(250);
            SendMessage(hEdit, WM_GETTEXT, 249, Integer(U));
            edit1.Text := Strpas(u);
          end;
        end;
      except
      end;
    end;
      

  16.   

    你们想那么复杂干什么,要区分3个edit控件很简单.用edit的tag属性啊.譬如Edit1.tag := 1;
    Edit2.tag := 2;Edit3.tag := 3for i := 1 to Form.ComponentCount do begin
       if (Form.Components[i] is TEdit) begin
          case (Form.Component[i] as TEdit).tag of 
              1: Edit1
              2: Edit2
              3: Edit3
          end;
       end;
    end;这样就区分了3个Edit控件,我目前想到的比较简单的方法,如果各位有更好的方法,跟着贴啊
      

  17.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
       FoundWindow: HWND;
       WindowText: array[0..255] of char;
    begin
       {find a TEdit child window}
       FoundWindow:=FindWindowEx(Form1.Handle, 0, 'TEdit',nil);   {get its text...}
       GetWindowText(FoundWindow, WindowText, 255);   {...and display it}
       Label1.Caption:='FindWindowEx found window handle '+IntToStr(FoundWindow)+
                       ': '+WindowText;end;
      

  18.   

    谢谢 xzhifei(星级饭桶·飞) ,你的方法基本可以~
    to  apololi(杭州小子) ,如果是外部程序的edit,它的tag我就无法知道,怎么用你的方法?