全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1089
推到 Plurk!
推到 Facebook!

加入BUTTON

尚未結案
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-27 03:35:36 IP:211.147.xxx.xxx 未訂閱
如果只知道某个物件(并不清楚它是Form, 还是Panel或其它)的handle, 有没有方法在某个位置上加上一个按钮? 能给个例子吗? 谢谢
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-27 08:44:39 IP:218.80.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
var
  B:TButton;
begin
  B:=TButton.Create(Self);
  B.ParentWindow:=Panel1.Handle;
end;
久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-27 08:53:23 IP:218.160.xxx.xxx 未訂閱
Hi mchakuna 您好:
procedure TForm1.Button1Click(Sender: TObject);
var Btn : TButton;
    MHandle : THandle;
begin
   MHandle := Form1.Handle;
   Btn := TButton.Create(FindControl(MHandle));
   Btn.Top := 10;
   Btn.Left := 10;
   Btn.Caption := 'New Button';
   Btn.Name := 'Button2';
   Btn.Parent := FindControl(MHandle);
end;
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-27 15:15:18 IP:211.147.xxx.xxx 未訂閱
引言: Hi mchakuna 您好:
procedure TForm1.Button1Click(Sender: TObject);
var Btn : TButton;
    MHandle : THandle;
begin
   MHandle := Form1.Handle;
   Btn := TButton.Create(FindControl(MHandle));
   Btn.Top := 10;
   Btn.Left := 10;
   Btn.Caption := 'New Button';
   Btn.Name := 'Button2';
   Btn.Parent := FindControl(MHandle);
end;
我不是高手, 高手是正在銀幕前微笑的人.
谢谢, 我按上面的代码写好了。我是在DLL中编写的,而这个DLL会在主程序中某个元件上(应该是个panel)加上上述的button。然而,我想加入一个响应程序,如
 Btn.OnClick := MyClick; 
编译是通过了, 但好像按了button后并没有响应。如果在程序中强制调向button的click函数,这个事件却有响应。是不是主程序把click事件载取了所以在dll中无法获入这个button的click响应?我要怎样才可以使这个button响应? 谢谢
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-27 17:43:34 IP:211.147.xxx.xxx 未訂閱
引言:
引言: Hi mchakuna 您好:
procedure TForm1.Button1Click(Sender: TObject);
var Btn : TButton;
    MHandle : THandle;
begin
   MHandle := Form1.Handle;
   Btn := TButton.Create(FindControl(MHandle));
   Btn.Top := 10;
   Btn.Left := 10;
   Btn.Caption := 'New Button';
   Btn.Name := 'Button2';
   Btn.Parent := FindControl(MHandle);
end;
我不是高手, 高手是正在銀幕前微笑的人.
谢谢, 我按上面的代码写好了。我是在DLL中编写的,而这个DLL会在主程序中某个元件上(应该是个panel)加上上述的button。然而,我想加入一个响应程序,如
 Btn.OnClick := MyClick; 
编译是通过了, 但好像按了button后并没有响应。如果在程序中强制调向button的click函数,这个事件却有响应。是不是主程序把click事件载取了所以在dll中无法获入这个button的click响应?我要怎样才可以使这个button响应? 谢谢
我参考论坛中的一个关於Hook的例子加入了这个button的click事件响应, 代码如下。
 
function MouseProc(icode:Integer; wP:wParam; lP:lParam):LRESULT;stdcall;
var
  pMsg : ^TMouseHookStruct;
  h : HWnd;
begin
  try
    if (iCode >= 0) then
    begin
      if iCode =HC_ACTION then
      begin
        pMsg := Pointer(lp);
        h := pMsg.hwnd; 
        // 如果是我的button发出的click事件
        if (h=btn.Handle) and (wP=513) then 
        begin
          // 对click事件的响应
        end;
        Result := 0;
      End
      Else Result := CallNextHookEx(idHook, iCode, wp, lp);
    end;
  except
    Result := 0;
  end;
end;
这里的wP=513是我从网上找到的代表按下的事件码。我不知这个代码是否在不同的平台也是一样的。总觉得不太好。有没有更好的表示标识click事件的方法?另外,如果在处代码中加入messagebox来显示一些内容,我发觉它会不断显示很多很多次, 为什么会这样? 有没有方法解决?而且即使不调用messagebox,在启动Hook之后,好像除这个Button外,系统上的其它窗口都不再响应左键click了,唉 最后想问一个问题,按mustapha.wa及miles的方法,我加入了TButton, 但我想要的是加入一个带BMP背景的按钮。我试过用TBitBtn代替tbutton,编译成功,但运行时却带出一串非法操作。好像问题是在读入bmp图上。我把读入bmp图的语句去掉,错误不出现但按钮还却不见了!!!! 發表人 - mchakuna 於 2004/02/27 17:55:21
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-01 14:03:36 IP:218.160.xxx.xxx 未訂閱
Hi mchakuna 您好: 1. Btn.OnClick := MyClick; 這應該沒問題, MyClick的宣告對嗎 procedure MyClick(Sender : TObject); 2.我看不太出來問題在哪裡, 若要用到Hook就麻煩了, 是否方便將程式碼上來, 大家來想想辦法. 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-01 14:12:49 IP:211.147.xxx.xxx 未訂閱
引言: Hi mchakuna 您好: 1. Btn.OnClick := MyClick; 這應該沒問題, MyClick的宣告對嗎 procedure MyClick(Sender : TObject); 2.我看不太出來問題在哪裡, 若要用到Hook就麻煩了, 是否方便將程式碼上來, 大家來想想辦法. 我不是高手, 高手是正在銀幕前微笑的人.
我的代码很简单, 就是把你们的代码贴上来而矣
  TBtnHandler = class
    public
      procedure MyClick(Sender: TObject);
  end;    function CallFunction : Integer; stdcall; // 主程序会调用这个函数
var
  BtnHandler :TBtnHandler;                
begin
  BackPanelHwnd := 0;   // 按钮将加於这个handle指定的元件上
  /////////////////////////////////////////////////////////
  // MainFormHandle是主程序窗体的handle
  // EnumChildWindows找出所要的元件的handle (即BackPanelHWnd)
  EnumChildWindows(MainFormHandle, @EnumWindowsProc, 0);
  if BackPanelHwnd<>0 then
  begin
    Btn:=TButton.Create(FindControl(BackPanelHwnd));
    Btn.ParentWindow := BackPanelHwnd;
    Btn.Width  := 50;
    Btn.Height := 20;
    Btn.Top  := 100;
    Btn.Left := 20;
    Btn.Caption:='Btn';
    Btn.Name:='Button';
    BtnHandler := TBtnHandler.Create;
    Btn.OnClick := BtnHandler.MyClick;
  end;
  /////////////////////////////////////////////////////////
  Result := 0;
end;
注意, 响应函数MyClick在类BtnHandler中. 如果在程序中直接调用Btn.click, 则myclick会被响应 發表人 - mchakuna 於 2004/03/01 14:16:58
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-03 09:04:07 IP:218.80.xxx.xxx 未訂閱
试试 Btn.ControlStyle:=Btn.ControlStyle+[csClickEvents]; Btn.OnClick:=BtnHandler.MyClick; 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
系統時間:2024-05-13 7:01:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!