窗体上的控件数量与名称

//包含控件数:
var
  num: Integer;
begin
  num := Self.ControlCount;
  ShowMessage('窗体上共有控件: ' + IntToStr(num)); //没有包括不可视控件和panl内的控件
  //ShowMessage('Panel1上共有控件: ' + IntToStr(Panel1.ControlCount));
end;

//遍历窗体上的控件:
var
  i: Integer;
begin
  for i := 0 to Self.ControlCount - 1 do
  begin
    ShowMessage(Self.Controls[i].Name);
  end;
end;

//让 Edit 只接受数字

//方法1:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9']) then
    Key := Chr(0);
end;

//方法2:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Byte(Key) in [48..57]) then  // 0的 Ascii 是 48
    Key := Chr(0);
end;

//方法3:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not CharInSet(Key, ['1'..'5']) then Key := #0;
end;
//Edit 文本的选择与光标位置
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.SetFocus;                           //给于焦点
  SendMessage(Edit1.Handle,EM_SETSEL,0,1);  //选择第一个字符
  SendMessage(Edit1.Handle,EM_SETSEL,0,-1); //全选
  SendMessage(Edit1.Handle,EM_SETSEL,1,1);  //光标移到第一个字符后面
  SendMessage(Edit1.Handle,EM_SETSEL,0,0);  //光标移到开始
  SendMessage(Edit1.Handle,EM_SETSEL,-1,0);  //光标移到开始
end;


procedure TForm1.Memo1Click(Sender: TObject);
begin
  Text := Format('当前列:%d, 当前行:%d', [Memo1.CaretPos.X, Memo1.CaretPos.Y]);
end;

//用 API 实现
procedure TForm1.Memo1Click(Sender: TObject);
var
  LineY,LineX: Integer;
begin
  LineY := SendMessage(Memo1.Handle,EM_LINEFROMCHAR,Memo1.SelStart,0);
  LineX := SendMessage(Memo1.Handle,EM_LINEINDEX,LineY,0);
  Text :=  '当前行:' + IntToStr(LineY) + '; ' +                  //0开始
          '当前列:' + IntToStr(Memo1.SelStart - LineX) + '; '//0开始
          '当前字符:' + IntToStr(Memo1.SelStart) + '. ';          //包括#13#10
end;

//统计字数

//添加 Memo1、Label1、Label2、还有Button1
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i,sum,e,c,t: Integer;
begin
  s := Memo1.Text;
  e := 0;
  c := 0;
  sum := Length(s);

  for i := 0 to sum do
  begin
    if (Ord(s[i]) >= 33) and (Ord(s[i]) <= 126) then
    begin
      Inc(e);
      Label1.Caption := '字母数: ' + IntToStr(e);
    end;

    if Ord(s[i]) >= 127 then
    begin
      Inc(c);
      Label2.Caption := '汉字数: ' + IntToStr(c div 2);
    end;
  end;
end;
 


我实现了查找richedit中的字符的功能,可以选择查找到的字符,但是richedit不会自己滚动到查找到的位置!
RichEdit1.ScrollBy(RichEdit1.CaretPos.X, RichEdit1.CaretPos.Y);


richedit可以实现用键控制改写/插入状态
1。如何用代码控制它一直在改写状态?
2。它和memo是同源的,怎样让memo也有这个功能?
找到了一种替代方法
在keypress事件中
memo1.sellength:=1;
memo1.seltext:=key;
当然要去掉不可见字符。
如果是用输入法就不知道怎么弄了,ime函数看不懂,不知道是什么消息

抱歉, 没能帮你解决; 原因: 它们都不是原生的 Delphi 控件.
我想用下面方式模拟一下, 但感觉不正统:
if GetKeyState(VK_INSERT) = 0 then
begin
...
end;


RichEdit2的时候,怎么保证没有半行文字的出现,最终是想将RicheEdit按其ClientHeight分页自动将输入文字转换成多张图片,曾想过在出现半行的地方插入回车符,但又不知道怎么精确定位到半行的位置。
RichEdit1.CaretPos := Point(0, 行数);

 



posted @ 2011-11-05 13:09  findumars  Views(298)  Comments(0Edit  收藏  举报