有关delphi中THandle的问题
tmpval:=dword(value);这句的意思是把value强制转换成dword类型,主要看value是什么类型,如果value是一个指针类型,那么这句的的意思就是返回指针指向的地址。
pdword(tmpptr)^:=$91这句其实和tmpptr^:=$91一样,因为tmpptr本来就是pdword类型的指针,如果tmpptr是无类型指针(pointer)才需要这样转换一下。
象这样的类型Delphi还有很多,比如String和PString,Integer和PInteger等,当然你也可以自己定义
delphi的labelededit控件中如何输入负数
用易语言来说,这个是delphi的子程序。
在易语言里和 取十六进制文本() 这个的意思是一样的。
最后得到的结果也是一样。
。
不用转换,你直接在易语言里用 取十六进制文本() 这个就可以了。
在delphi里调用你要转换的那个子程序:EDIT1.Text:=Dword2Hex(9999,true);得到的结果是 270F在易语言里用 编辑框1.内容 = 取十六进制文本(9999)得到的结果也是 270F ======================================晕,楼主看来你是对delphi是一点也不了解。
你提出这个问题,给出的这些代码,最后调用的就是一个函数:Dword2Hex(integer,Boolean):string;而这个调用的函数和易语言的:取十六进制文本() 是一个意思。
delphi try命令
懒的给你写了,帮你找了点资料 一、异常的来源 在Delphi的应用程序中,下列的情况都比较有可能产生异常。
(1)文件处理 (2)内存分配 (3)Windows资源 (4)运行时创建对象和窗体 (5)硬件和操作系统冲突 二、异常的处理 (1)try…except…end; 在try体内的代码发生异常时,系统将转向except部分进行异常的处理。
这是Delphi处理异常的最基本的方式之一。
(2)try…finally…end; 这种异常处理结构一般用于保护Windows的资源分配等方面,它确保了无论try体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些Windows对象的正确处理。
和try…except…end不同,该结构的finally部分总被执行。
(3)不存在try…except…finally…end结构来既处理异常,又保护资源分配的结构,但是,try…except…end结构允许嵌套到try…finally…end结构中,从而实现既处理异常,又保护资源的分配。
三、异常的精确处理 (1)定义一个异常。
在Delphi中,每个异常都是Exception[1]类的一个派生类[2]。
因此,定义一个异常就是定义一个Exception类的派生类。
type EMyException = class(Exception); 当然,基类可以是Exception或者Exception的任何一个任何层次的派生类。
(2)在程序中抛出一个异常。
根据不同的情况抛出异常是使用异常的最基本的模式。
在Delphi中,由raise语句来实现。
【语法】raise 异常类.Create('异常的缺省说明'); (3)在try…except…end中更加精确的捕捉异常。
使用on E:异常类 do…结构可以在do体内处理特定异常类所抛出的异常。
四、异常的调试 在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools—>Debugger Options…进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。
五、异常的补充说明 (1)每一段程序都有可能产生错误!这是软件业的一个不容置疑的现象和规律。
事实上,传统的if…else…结构完全可以解决所有的错误,使用Exception机制也没能够回避在最原始的层次,通过遍历可能的情况来产生异常的做法,那么,为什么还要异常机制? 答案很清楚:异常提供了一种更加灵活和开放的方式,使得后来的编程者可以来根据实际的情况处理这种错误,而不是使用预先设定好的处理结果。
Delphi7异常处理 了解什么是异常和Delphi7中提供的异常类 掌握Delphi7环境下自定义异常的方法和异常 处理的语法结构与实现 异常 什么是异常 程序开发过程中,有编译期错误和运行期错误,编译期错误很容易发现,而运行期错误(逻辑错误和异常)往往很难预料.为了程序的稳定性和可靠性,就需要对程序异常处理和保护.异常:理解为一种特殊的事件,该事件发生时,程序的正常执行将被打断.由程序导致的不正常情况是错误而不是异常,程序错误与异常不是相同的概念.异常是为方便用户报告错误并处理错误而创建的机制,一般是由操作系统完成的.运行期错误处理 软件开发过程中,程序员必须提供适度的方式来处理不可避免的错误.一般方法如下:1 传统方法2 使用异常进行错误处理 传统方法 在Pascal早期版本中,程序员必须借助编译器开关和状态变量去检测和处理存在的错误.{$I-}{此编译器指令关闭I/O检测} Assign(InFile,InputName); Reset(InFile); {$I+}{此编译器指令恢复I/O检测} If IOResult0 then {错误处理代码}; 使用异常进行错误处理 结构化异常处理是Delphi语言内建的特性.为我们处理异常提供了方便.处理异常有两方面:1 异常处理可确保适当地恢复在应用程序中分配或改变的任何资源.2 结构化异常处理为开发人员提供了一种一致的处理各种类型运行期错误的方式 Delphi7异常处理机制 异常处理的基本思想是通过提供规范方式处理软,硬件错误的能力,使程序更加健壮.异常处理可以将处理错误的代码与正常的逻辑处理代码相分离.Delphi缺省的方式是在应用程序收到异常之前捕获异常.IDE会给出一个”预警”对话框,以指明应用程序将要产生异常.异常处理机制是一种程序设计安全策略,它是建立在保护块思想上,通过try和end语句块对代码的封装确保在程序发生异常时,程序能够正常运行或释放所占用的资源.Delphi7异常处理机制 传统程序设计中,用如下的伪代码方法来检查和处理程序错误:执行一个任务 If 前一个任务未能正确执行 执行错误处理 执行下一个任务 If 前一个任务未能正确执行 执行错误处理 …… Delphi7异常处理机制 例; try Age := StrToInt(Edit1.Text); ShowMessage(Format('生于%d年', [YearOf(Now) - Age])); except on EConvertError do showmessage('输入编辑框的不是一个有效的数字!'); on ERangeError do showmessage('输入编辑框的年龄值太大!'); end;异常类 Delphi7根据异常类型定义了相应的异常类.所有异常类的基类都是Exception类.Delphi7内置了大量的异常类,用户也可以通过Exception类自定义异常类.记住异常类的要点:1 异常类是响应不同异常现象的入口.2 熟悉异常类的层次结构.Exception异常类 Exception是所有异常类的基类,它并不是以'T'开头,而是以'E'开头,它的派生类也是以'E'开头的.Exception类定义于SysUtils单元中.Exception类最常用的...
C的函数定义,转换成Delphi
把txt定义为PAnsiChar,即为ANSI风格,你说的“Ascii格式”不准确,要是严格的ASCII,则只能是英文,中文根本不行;Length(txt)不需要*2,完整如下:vartxt:PAnsiChar;WriteCount: DWORD;HPRo: Cardinal;begintxt:= '问世间,情为何物,直叫人生死相许';Threadd:=VirtualAllocEx(HPro, nil, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);WriteProcessMemory(HPro,Threadd,txt, Length(txt), WriteCount);end;
delphi dll窗体 控制主窗体
DLL是你是无法处理主窗体的信息的,虽然都在一个进程当中,你可以使用得到主窗体的线程,再采用发消息的模式来实现:function TForm1.MainApplicationHandle: HWND;varMainModule: HMODULE;CurrentPID: DWORD;WindowsPID: DWORD;beginMainModule := GetModuleHandle(nil);CurrentPID := GetCurrentProcessID();Result := 0;while True dobeginResult := FindWindowEx(0, Result, 'TApplication', nil);if (Result = 0) then Exit; // 未找到GetWindowThreadProcessID(Result, WindowsPID);if (WindowsPID = CurrentPID) and(HMODULE(GetWindowLong(Result, GWL_HINSTANCE)) = MainModule)then Exit; // 找到!!end;end;
枚举指定窗口 DELPHI
hwnd: HWND 不就是句柄了吗?不需要FindWindow来找了吧!!操作其他程序就难免要用到EnumWindows,虽然用FindWindow有时候更方便,但如果是动态的标题,要取得窗口的句柄,还是要用遍历。
虽然网上有相关介绍,但都不够详细,今天发现一篇讲的不错的,贴上来,以后参考。
其中最后两三个例子对回调函数中的变量传值的方法还是很值得借鉴的。
// EnumWindows 的功能是遍历所有顶层窗口function EnumWindows(lpEnumFunc: TFNWndEnumProc; {回调函数指针}lParam: LPARAM {给回调函数的参数, 它对应回调函数的第二个参数}): BOOL; stdcall; //成功与否, 其实是返回了回调函数的返回值// EnumWindows 专用的回调函数的格式:function EnumWindowsProc(hwnd: HWND; {找到的窗口句柄}lParam: LPARAM {EnumWindows 传给的参数; 因为它是指针, 可传入, 但一般用作传出数据}): Boolean; stdcall; {函数返回 False 时, 调用它的 EnumWindows 将停止遍历并返回 False}例一: 获取所有顶层窗口的句柄//需要个 TListBox 显示数据function EnumWindowsProc_1(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;beginForm1.ListBox1.Items.Add(IntToStr(hwnd));Result := True;end;procedure TForm1.Button1Click(Sender: TObject);beginEnumWindows(@EnumWindowsProc_1, 0);end;例二: 获取所有顶层窗口的标题(排除无标题窗口)function EnumWindowsProc_2(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;varbuf: array[Byte] of Char;beginGetWindowText(hwnd, buf, SizeOf(buf));if buf ” then Form1.ListBox1.Items.Add(buf);Result := True;end;procedure TForm1.Button1Click(Sender: TObject);beginEnumWindows(@EnumWindowsProc_2, 0);end;例三: 查找第一个记事本的句柄function EnumWindowsProc_3(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;varbuf: array[Byte] of Char;beginGetClassName(hwnd, buf, SizeOf(buf));if buf = 'Notepad' thenbeginForm1.ListBox1.Items.Add(Format('记事本句柄: %d', [hwnd]));Result := False; //如果不需要继续找, 找到第一个就结束endelsebeginResult := True;end;end;procedure TForm1.Button1Click(Sender: TObject);beginEnumWindows(@EnumWindowsProc_3, 0);end;例四: 获取所有顶层窗口的句柄与类名数组:typeTMyStruct = recordhwnd: HWND;ClassName: string;end;TMyStructArray = array of TMyStruct;PMyStructArray = ^TMyStructArray;function EnumWindowsProc_4(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;varbuf: array[Byte] of Char;p: PMyStructArray;beginGetClassName(hwnd, buf, SizeOf(buf));p := PMyStructArray(lParam);SetLength(p^, Length(p^) + 1);p^[High(p^)].hwnd := hwnd;p^[High(p^)].ClassName := buf;Result := True;end;procedure TForm1.Button1Click(Sender: TObject);varArr: TMyStructArray;beginEnumWindows(@EnumWindowsProc_4, Integer(@Arr));ShowMessage(IntToStr(Length(Arr))); //总数ShowMessageFmt('%d - %s', [Arr[0].hwnd, Arr[0].ClassName]); //第一个元素end;例五: 重复上一个例子, 如果数组是全局遍历并不靠参数传递, 代码会简单些typeTMyStruct = recordhwnd: HWND;ClassName: string;end;varArr: array of TMyStruct;function EnumWindowsProc_5(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;varbuf: array[Byte] of Char;beginGetClassName(hwnd, buf, SizeOf(buf));SetLength(Arr, Length(Arr) + 1);Arr[High(Arr)].hwnd := hwnd;Arr[High(Arr)].ClassName := buf;Result := True;end;procedure TForm1.Button1Click(Sender: TObject);beginSetLength(Arr, 0);EnumWindows(@EnumWindowsProc_5, Integer(Arr));ShowMessage(IntToStr(Length(Arr))); //总数ShowMessageFmt('%d - %s', [Arr[0].hwnd, Arr[0].ClassName]); //第一个元素end;SplendourChiang 的目的是获取进程 ID 和窗口句柄的数组, 按 “例四” 的方法给修改如下:typeMyProcessInfo = recordPID, WinHWND : DWORD;end;TMyProcessInfoArray = array of MyProcessInfo;PMyProcessInfoArray = ^TMyProcessInfoArray;function MyEnumWindowsProc(Wnd: DWORD; lParam: LPARAM): Bool; stdcall;varPID : DWORD;p: PMyProcessInfoArray;beginGetWindowThreadProcessID(Wnd, @PID);p := PMyProcessInfoArray(lParam);SetLength(p^, Length(p^) + 1);p^[High(p^)].PID := PID;p^[High(p^)].WinHWND := Wnd;Result := True;end;procedure TForm1.Button1Click(Sender: TObject);varCC: TMyProcessInfoArray;beginSetLength(CC, 0);EnumWindows(@MyEnumWindowsProc, Integer(@CC));ShowMessage(IntToStr(Length(CC))); //总数ShowMessageFmt('%d - %d', [CC[0].PID, CC[0].WinHWND]); //第一个元素end;
转载请注明出处51数据库 » delphi dword 负数
我叫尚春晚