RT

解决方案 »

  1.   

    不是用循环取得的所有的Edit吗?I第一个值和最后一值。
      

  2.   

    第一个和最后一个比较容易得到。如果只是Edit的话,每一个都可以得到,更好控制。
    你开贴给50分,结贴时系统再返给你25分,而你发贴还可以得到10分,所以这个贴子你给50分实际花的分数为15分。想了想,这点分数虽然不是很多,考虑到问题的复杂度不高,就给你贴出代码吧:function       GetPasHandle(hwnd:       Integer;       lparam:       Longint):Boolean;       stdcall;
    var
      cap:array[0..100] of char;
    begin
      Result:=True;
      GetClassName(hwnd,cap,99);
      if lstrcmpi('edit',cap)=0 then
       begin
        PInteger(lparam)^:=hwnd;
      //  Result:=False; 加上这句,得到的是第一个Edit的句柄,去掉这句,得到的是最后一个句柄。
       end;
    end;调用时用:
    var q:=0;
     EnumChildWindows(h,@GetPasHandle,Integer(@q));
     if q<>0 then showmessage('句柄:'+inttostr(q));
    代码未做测试,因为经常写遍历窗体,很熟悉,所以是随手写的。
      

  3.   

    第一个最后一个的判断依据应该是 (Components[i] as TEdit).TabOrder
    那就很简单了,判断TabOrder是最大或者是最小就返回Edit对象即可
      

  4.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=self.ControlCount-1 to 0  do
      begin
        if (self.Controls[i] is Tedit) then
            //
      end;
    end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=0 to self.ControlCount-1 do
      begin
        if (self.Controls[i] is Tedit) then
            //
      end;
    end;
      

  5.   

    //Form成员函数
    var
      FirstEdit,LastEdit: TEdit;
      I: Integer;
    begin
      FirstEdit := Nil;
      LastEdit := Nil;
      for i := 0 to ComponentCount - 1 do
        begin
          if Components[i] is TEdit then
            begin
              FirstEdit := Components[i] as TEdit;
              break;
            end;
        end;
      if FirstEdit = Nil then 
        begin//没有任何一个Edit
          ShowMessage('没有Edit');
          Exit; 
        end;
      for i := ComponentCount  downto 1  do
        begin
          if Components[i-1] is TEdit then
            begin
              LastEdit := Components[i-1] as TEdit;
              break;
            end;
        end;    if LastEdit = FirstEdit then
        begin
          ShowMessage(Format('只有一个Edit,名称为:%s',[FirstEdit.Name]));
        end
      else
        begin
          ShowMessage(Format('第一个Edit的名称为:%s'#13#10'最后一个Edit的名称为:%s',[FirstEdit.Name,LastEdit.Name]));
        end;
    end;
      

  6.   


    你的方法只是针对自己的程序,对别的EXE上的Edit无效。如果是针对自己的程序就简单多了。我写的是一个万能法。
      

  7.   


    自已的窗体非常简单,你如果在发贴前在网上搜一下遍历窗体的话,你就可以节省发贴浪费的分了。
    代码如下:procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
     h:HWND;
    begin
    for i:=0 to ComponentCount-1 do //得到窗体的所有控件。
     if Components[i] is TEdit then //判断是否是TEdit类。注意C++上应该是Edit类。
         begin
          h:=TEdit(Components[i]).Handle;
       //   break;//决定是找第一个,还是找最后一个。删除此行代码的话是找最后一个。
         end;
    if h<>0 then
    showmessage('找到的句柄:'+inttostr(h))
    else
    showmessage('没找到');
    end;
      

  8.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=self.ControlCount-1 to 0  do
      begin
        if (self.Controls[i] is Tedit) then
            //
      end;
    end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=0 to self.ControlCount-1 do
      begin
        if (self.Controls[i] is Tedit) then
            //
      end;
    end;
    我就是想用这种方法来实现。
      

  9.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=self.ControlCount-1 to 0  do
      begin
        if (self.Controls[i] is Tedit) then
            //
      end;
    end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=0 to self.ControlCount-1 do
      begin
        if (self.Controls[i] is Tedit) then
            //
      end;
    end;
    我就是想用这种方法来实现。
      

  10.   


    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      i:integer; 
    begin 
      for i:=self.ControlCount-1 Downto 0  do 
      begin 
        if (self.Controls[i] is Tedit) then 
        begin
           (self.Controls[i] as Tedit).SetFocus;
           Break;
        end;
      end; 
    end; 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    var 
      i:integer; 
    begin 
      for i:=0 to self.ControlCount-1 do 
      begin 
        if (self.Controls[i] is Tedit) then 
        begin
           (self.Controls[i] as Tedit).SetFocus;
           Break;
        end; 
      end; 
    end;
      

  11.   

    这种方法要加上Break,否则效率远不如我的代码。如果窗体上Edit较多的话就可以看出来。
      

  12.   

    mwy654321 ,难道你只是为了分才回答问题?
      

  13.   

    你来mwy654321 ,我再开个,给你100
      

  14.   

    楼主的意思,我估计是按照TabOrder来排。
    而按照Controls[i]的顺序,不一定是TabOrder的顺序。
    如果真如我所说,可以用GetTabOrderList。怎么用看帮助。