怎样把句柄绑定到控件

Firing_Sky 2000-03-22 06:07:00
在Delphi中,我已经得到一个句柄,现在我要判断这个句柄指向的是不是一个TForm,该怎么办。不要告诉我在VC中用Attach可以做到,我要知道在Delphi中该怎么实现
...全文
235 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxy 2000-03-25
  • 打赏
  • 举报
回复
olo is right
窗口的句柄和窗口本身的指针不是一个概念。
Lin 2000-03-24
  • 打赏
  • 举报
回复
olo是对的,顺便谢谢:也解决了我的问题。
olo 2000-03-24
  • 打赏
  • 举报
回复
if FindControl(Handle) = Form1 then
Firing_Sky 2000-03-24
  • 打赏
  • 举报
回复
就是因为窗口句柄转换成类指针后,该指针指向的内存位置不可预测, 所以我用了TWinControl强制转换啊!
kxy 2000-03-23
  • 打赏
  • 举报
回复
to : lin你贴的好快:),我写的时候还没有见你贴上来:)
Lin 2000-03-23
  • 打赏
  • 举报
回复
Firing_Sky:
  我想了一下,无论是你的还是我的方法都不可能行:窗口句柄转换成类指针后,该指针指向的内存位置不可预测,用is运算符号极有可能引起非法内存访问而导致VCL内核出错。
  解决方法有一个:将Form的Self指针用SetWindowLong存放于GWL_USERDATA常量处,获得窗口句柄后再GetWindowLong,最后转换成TForm就可以了。
kxy 2000-03-23
  • 打赏
  • 举报
回复
反过来看,一个Form的窗口句柄是 From.Handle,所以你的代码会报错,
var aForm : TForm ; H,实际是 AForm.Handle,
可以这样,用windowsAPI的GetWindowLong得到 H,的CLASSNAME是 TForm
Firing_Sky 2000-03-23
  • 打赏
  • 举报
回复
Lin:我原来的用法是这样的

Var
H:HWND;
Ctrl:TWinControl;
begin
……
得到一个窗体句柄H
……
Ctrl:=TWinControl(H);
if Ctrl is TForm then //运行到这儿就报错了
begin
……
对Ctrl进行操作
……
end;
end;

这好像和你说的方法类似,但会报错

929 :你说的那些东西我知道
我的源代码如上,你看看就明白我所说的“绑定一个句柄到TWinControl”是什么意思了
929 2000-03-23
  • 打赏
  • 举报
回复
我写了个函数,它是用CLASSNAME进行比较来判断传进来的窗口句柄是否指向一个DELPHI的的窗口类型(TFORM)。

另外,我想问一下,将一个句柄绑定到窗口是什么意思?TFORM中HANDLE是只读的。
函数及测试程序如下:其中函数叫ISMYWINDOW

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function ismywindow(hw:HWND;FormClass: TFormClass):boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
if ismywindow(form1.Handle,tform1 ) then

showmessage(form1.ClassName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
hclass:string;
begin
SetLength(hclass,50);
if iswindow(form1.Handle) then
begin
GetClassName(form1.Handle,pchar(hclass),50);
showmessage(hclass);
end ;
end;

function TForm1.ismywindow(hw: HWND;FormClass: TFormClass): boolean;
var
hclass:string;
begin
result:=false;
setlength(hclass,50);
if iswindow(hw) then
begin
GetClassName(hw,pchar(hclass),50);
hclass:=Trim(string(pchar(hclass)));
if hclass=formclass.ClassName then result:=true;
end;
end;

end.


Lin 2000-03-22
  • 打赏
  • 举报
回复
Firing_Sky:
假设你的句柄为Handle, 试试这样行不: if TObject(Handle) is TForm then ...
表格控件总览:   在VB开发环境中,表格控件在界面开发元素中占有重要的地位。它不仅有外观整洁、表达形式规范的优点,而且更重要的是它较高的信息表现率(就是相对于其他控件来说能够表达更多的信息),随着信息时代的到来,它的应用将更加的广泛。    那么在VB平台下,如何操作这一功能强大的控件元素呢?事实上我们知道,VB平台下面的表格控件是相当丰富的,总结下来提供了4种类型:Microsoft Data Bound grid Control、Microsoft Datagrid Control、Microsoft Flexgrid Control、Microsoft Hierarchial Flexgrid Control. 这四种表格各有其特点,下面我们一一讨论。   1. Microsoft Data Bound grid Control   此控件主要用于数据绑定(可以不绑定,但是因为不提供对单个cell的控制支持,所以实际上这样做是不经济的)。具体说来,就是数据源比较固定的情况下可以使用这种控件。   具体使用方法是设定此控件的datasource属性,就可以不用编写任何代码就可以显示该数据源所指向的记录数据。比如可以将datasource设置为一个data控件,而data控件又指向数据库"成绩"的 一个"语文"表,那么当程序运行时,它就自动显示此"语文"表的数据。 基本步骤如下: 1、向工程上添加Microsoft Data Bound Grid Control控件,即DBGrid控件。 2、在窗体上添加DBGrid控件DBGrid1和Data控件Data1。 3、设置Data1的DatabaseName属性为你要看的数据库的名字。 4、设置Data1的RecordSource属性为表的名字或合法的SQL Select语句。 5、设置DBGrid1的DataSource属性为Data1。   从上面的分析看得出来,这个控件虽然操作方便,但是它也有局限性,就是不能对显示的数据进行灵活的控制操作,比如有些数据允许用户修改,有些数据却不允许用户修改,而此控件却只能提供全部数据源的原子操作:即要么全部允许修改,要么就全部不允许。还有另外此控件也不提供对单个单元格(cell)进行操作,所以提供不了更为个性化的界面风格。   2. Microsoft Datagrid Control   此控件跟前面介绍的Data Bound grid Control控件很相似,也是主要进行绑定操作,而缺点和Data Bound grid Control完全一样。但是它跟Data Bound grid Control不一样的是其数据源的驱动引擎只能是OLEDB形式的,不能是DAO,比如就可以使用ADO数据控件,不能使用DATA控件。而Data Bound grid Control却刚好和它相反,这一点在开发中一定要注意。   3. Microsoft Flexgrid Control与Microsoft Hierarchial Flexgrid Control.   这里重点介绍这两种控件,因为在实际开发中,这两种控件应用的场合更多一些,它不仅能够反映数据,而且也能把数据的修改信息反映到数据库中去,所以弥补了上述两种控件的不足。   如果数据不需要修改,那么可以进行绑定操作,其方法跟前面介绍的完全一样,就是通过设置DataSource属性来完成数据的显示工作。但是实际开发中,需要对整个表格控件更为灵活的显示控制。   在给出例程之前,有必要对这一控件进行比较详尽的认识:这种控件允许将文本或者图象放置于每个单元格之中,控件的Row与Col属性允许用户在代码中指定当前行和列,当然也可通过操作鼠标和键盘来改变这两个属性,而text属性指明当前单元格的文本。如果单元格的文本太长而不能完全显示出来的话,可以通过将WordWrap属性设置为true来达到显示的目的。下面将比较重要的属性小结如下:   DataSource---------用来指定需要绑定的数据源,比如data控件。   Cellpicture----------用来设定当前单元格的图象,便于显示该图象。此属性不能在设计时使用。   Col,Row---------------设定当前列和当前行,注意它们均是从0开始的,如果同时设定它们,可以指定当前的单元格。设计时也不能使用。   Cols,Rows---------------设置表格控件总的列数和行数。   Hwnd---------------表格句柄,可以结合Windows API对表格控件进行更高级的控制。   Text---------------指定当前的单元格的文本内容。   TextMatrix(i,j)-------此属性比较重要,它用来指定第I行和第j列所确定的单元格的文本内容。它等价于下面的代码: MSHFlexGrid1.Rows =i MSHFlexGrid1.Cols =j MSHFlexGrid1.Text =指定的字符串   WordWrap-------为ture时可以在当前单元格换行显示,否则如果要显示的字符的长度超过列宽,那么就不能显示完全。
ASP.NET 参考手册 在 W3School,我们提供完整的 ASP.NET 参考手册,其中包括内建对象和组件,以及它们的属性和方法。 ASP.NET 实例 ASP.NET 实例 一系列的 ASP.NET 实例。 内容目录 ASP.NET 简介 本章解释 ASP.NET 的概念。 ASP.NET vs ASP 本章阐述 ASP.NET 和 ASP 之间的差异。 ASP.NET 页面 本章介绍如何创建您的第一个简单的 ASP.NET 页面。 ASP.NET 服务器控件 本章介绍 ASP.NET 服务器控件。 ASP.NET 事件 本章介绍一些 ASP.NET 事件句柄。 ASP.NET Forms ASP.NET WEB 表单 本章介绍 ASP.NET 的 WEB 表单。 ASP.NET 维持 ViewState 本文讲解如何维持 ViewState。 ASP.NET 文本框控件 本章阐述 ASP 的基础:文本框控件。 ASP.NET 按钮控件 本章阐述 ASP 的基础:按钮控件。 ASP.NET Binding ASP.NET 数据绑定 本文介绍 ASP.NET 数据绑定。 ASP.NET ArrayList 对象 本文讲解 ASP.NET ArrayList 对象。 ASP.NET Hashtable 对象 本文讲解 ASP.NET Hashtable 对象 ASP.NET SortedList 对象 本文讲解 ASP.NET SortedList 对象 ASP.NET XML 文件 本章介绍如何将数据绑定到一个 XML 文件。 ASP.NET asp:Repeater 控件 本章介绍如何通过 Repeater 控件将数据绑定到一个 XML 文件。 ASP.NET asp:DataList 控件 本文讲解使用 DataList 控件把数据绑定到 XML 文件。 ASP.NET Database ASP.NET 数据库连接 本章介绍 ADO.NET 以及连接到数据库。 ASP.NET 2.0 ASP.NET 2.0 新特性 本节介绍 ASP.NET 2.0 中的新特性。 ASP.NET 2.0 母版页 本节解释母版页(Master Pages)的概念。 ASP.NET 2.0 导航 本节讲解 ASP.NET 2.0 的导航控件。 ASP.NET 参考手册 ASP.NET HTML Server 控件参考 完整的 HTML 服务器控件参考手册,包括其属性、方法以及事件。 ASP.NET Web Server 控件参考 完整的 Web 服务器控件参考手册,包括其属性、方法以及事件。 ASP.NET Validation Server 控件参考 完整的 Validation 服务器控件参考手册,包括其属性、方法以及事件。 ASP.NET 实例 ASP.NET 实例 一系列 ASP.NET 实例。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧