//实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录 Function FillForm(WebBrowser: TWebBrowser2; FieldName: String; Value: String): Boolean; Var i, j: Integer; FormItem: Variant; Begin Result := False; //no form on document If WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 Then Begin Exit; End; For I := 0 To WebBrowser.OleObject.Document.forms.Length - 1 Do Begin FormItem := WebBrowser.OleObject.Document.forms.Item(I); For j := 0 To FormItem.Length - 1 Do Begin Try //when the fieldname is found, try to fill out If FormItem.Item(j).Name = FieldName Then Begin FormItem.Item(j).Value := Value; Result := True; End; Except Exit; End; End; End; End; FillForm(浏览器控件名称, 编辑框名称, 内容)
str := (Webbrowser1.Document as IHTMLDocument2).cookie;
Ver: TFixedFileInfo; begin Ver := FileInfo(Application.ExeName); Edition.Caption := '软件版本:' + IntToStr(Ver.wFileVersionLS) + '.' + IntToStr(Ver.wFileVersionMS) + '.' + IntToStr(Ver.wProductVersionLS) + '.' + IntToStr(Ver.wProductVersionMS) + ' - [正式版]'; end; 这样,明白了吗? ---------------------------------------------- 有空来俺们的小站逛逛(http://www.e8e.net) |
作者: |
|
2008-12-25 18:41:32 | ||||
2楼: | 其他,如文件大小什么什么的,自己搜索下。 ---------------------------------------------- |
|
加入我的收藏 | ||
楼主: | 我有个结构是这样子的 TConfig = record A: Boolean; B: Integer; C: Boolean; D: Integer; //以此类推 非常多,下面还有数组 sName: array[0..8] of string; boUse: array[0..8] of Boolean; wNum: array[0..8] of Word; end; var Config: TConfig = ( A: False; B: 0; C: True; D: 2; //以此类推 非常多,下面还有数组 sName:('1','2','3','4','5','6','7','8'); boUse:(False, True, False, False, True, False, True, False, False); wNum: (0, 1, 0, 4, 0, 3, 0, 0, 0); ); 当定义时,初始了,在程序运行中,需要初始成定义时的数据,只能一个个赋值吗?还是有其它办法吗? ---------------------------------------------- delphi众人拾柴火焰高!支持盒子~~~~~~~~~~ |
作者: |
|
2010-12-15 21:31:49 | ||||
1楼: | 全局变量或Const定义的常量可以给初始值 ---------------------------------------------- 武稀松http://www.raysoftware.cn |
作者: |
|
2010-12-15 21:44:32 | ||||
2楼: | 不懂得你说的在程序中初始是什么意思。应该是你想说在程序运行时为整个Record赋值吧,那直接 := 就可以了。 ---------------------------------------------- http://hi.baidu.com/wqyfavor |
作者: |
|
2010-12-15 21:48:10 | ||||
3楼: | TO wqyfavor 在程序运行的时候 用户可以修改 结构中的类型数据 用户还可以执行恢复默认设置, 当他恢复默认设置的时候 能否将这个结构初始化成 结构定义那里的值 只能一个一个的赋予给结构中的成员吗? ---------------------------------------------- delphi众人拾柴火焰高!支持盒子~~~~~~~~~~ |
作者: |
|
2010-12-15 22:35:16 | ||||
4楼: | 没有办法 统一值的话,你可以用fillchar ---------------------------------------------- 卖源码http://item.taobao.com/item.htm?spm=686.1000925.1000774.16.gmrHsT&id=37407600038每天点一下广告,支持盒子不关闭 |
作者: |
|
2010-12-15 23:17:55 | ||||
5楼: | 恢复成定义那里的值,你可以把那个定义改成const啊,就是一个常量。然后赋值给你的变量就可以了啊。 ---------------------------------------------- http://hi.baidu.com/wqyfavor |
作者: |
|
2010-12-16 2:32:19 | ||||
6楼: | to wqyfavor 你还是不懂得我的意识 结构内非常多 如果一个一个赋值 会很麻烦 我想整个RECORD初始值 ---------------------------------------------- delphi众人拾柴火焰高!支持盒子~~~~~~~~~~ |
作者: |
|
2010-12-16 9:29:30 | ||||
7楼: | 都告诉你了. 全局变量或Const定义的常量可以给初始值. 你先定义一个全局变量或常量. 当想赋初始值的时候就等于这个变量或常量不就得了. ---------------------------------------------- 武稀松http://www.raysoftware.cn |
作者: |
|
2010-12-16 10:38:44 | ||||
8楼: | 不知道string, interface等能不能自动处理。 不过如果有动态数组或者对象引用那肯定是不能直接等于的。 ---------------------------------------------- - |
作者: |
|
2010-12-17 18:42:21 | ||||
9楼: | 用CopyMemory就可以了,不用一个一个赋值 ---------------------------------------------- 兼金软件工作室 |
作者: |
|
2010-12-17 19:02:27 | ||||
10楼: | 像 lz 给出来的 record(成员包括自动管理生存期的 string 类型),CopyMemory/Move 属于找死的行为,必须要用“:=”标准赋值语句,或者自己调 system._CopyRecord 才行(后者还很麻烦)。FillChar/ZeroMemory 除非在还没使用过该局部变量的时候用,否则只要任何一个 string 里有指向非常量的内容,就会产生内存泄露。 ---------------------------------------------- cnblogs中我写的关于Delphi的blog,欢迎访问: http://www.cnblogs.com/egust/ |
作者: |
|
2010-12-17 19:24:29 | ||||
11楼: | 给你个例子自己去看 RecBskyCust = record Ver: integer; Cust_ID: integer; Cust_name: string[40]; Cust_NiName: string[40]; Email: shortstring; MPhone: string[80]; Phone: string[80]; SFZ: string[18]; pass: string[40]; Func: integer; Reg_Time: TDateTime; UpDate_Time: TDateTime; QQ: integer; Msn: shortstring; OtherIM: shortstring; Company: shortstring; Area_Code: integer; PostCode: integer; Address: shortstring; CUST_STATES: TPassStates; Descr: string; end; function CopyRecord(Rs: RecBskyCust; var RD: RecBskyCust): boolean; overload; begin Result := False; try DisposeRecord(RD); System.move(Rs, RD, sizeof(Rs) - sizeof(string)); RD.Descr := Rs.Descr; Result := True; except on E: Exception do Application.MessageBox(PChar(E.Message + '错误号:' + IntToStr(E.HelpContext)), '错误!', MB_OK + MB_ICONERROR + MB_TOPMOST); end; end; function DisposeRecord(Var R: RecBskyCust): boolean; begin Result := False; try R.Descr := ''; zeromemory(@R, sizeof(R)); Result := True; except on E: Exception do Application.MessageBox(PChar(E.Message + '错误号:' + IntToStr(E.HelpContext)), '错误!', MB_OK + MB_ICONERROR + MB_TOPMOST); end; end; 除了string 类型 还有动态数组和其它指针类型也需要单独处理,所以尽量把这类数据类型放到record的最后 |
网上有这种代码了,只是因为写的较早,有些地方写的不那么言简意赅,而且在XE后的版本中有问题(因为Unicode字符的关系)
下面是精简修改过的代码,只取第一块硬盘的序列号,Win7 + XE 测试通过。需要先安装JwApi函数库,因为有些结构体在库中有声明了
- unit uGetHDSN;
- interface
- uses
- Windows, JwaWinIoctl;
- function GetIdeSerialNumber: AnsiString;
- implementation
- type
- TIdSector = packed record
- wGenConfig: USHORT;
- wNumCyls: USHORT;
- wReserved: USHORT;
- wNumHeads: USHORT;
- wBytesPerTrack: USHORT;
- wBytesPerSector: USHORT;
- wSectorsPerTrack: USHORT;
- wVendorUnique: array [0 .. 2] of USHORT;
- sSerialNumber: array [0 .. 19] of AnsiChar;
- wBufferType: USHORT;
- wBufferSize: USHORT;
- wECCSize: USHORT;
- sFirmwareRev: array [0 .. 7] of AnsiChar;
- sModelNumber: array [0 .. 39] of AnsiChar;
- wMoreVendorUnique: USHORT;
- wDoubleWordIO: USHORT;
- wCapabilities: USHORT;
- wReserved1: USHORT;
- wPIOTiming: USHORT;
- wDMATiming: USHORT;
- wBS: USHORT;
- wNumCurrentCyls: USHORT;
- wNumCurrentHeads: USHORT;
- wNumCurrentSectorsPerTrack: USHORT;
- ulCurrentSectorCapacity: ULONG;
- wMultSectorStuff: USHORT;
- ulTotalAddressableSectors: ULONG;
- wSingleWordDMA: USHORT;
- wMultiWordDMA: USHORT;
- bReserved: array [0 .. 127] of Byte;
- end;
- PIdSector = ^TIdSector;
- const
- IDE_ATA_IDENTIFY = $EC;
- function LittleToBig(Data: Word): Word;
- asm
- xchg ah, al
- end;
- function GetIdeSerialNumber: AnsiString;
- var
- hDevice: THandle;
- Size, cbBytesReturned: DWORD;
- SCIP: TSendCmdInParams;
- SCOP: PSendCmdOutParams;
- P: PWORD;
- I: Integer;
- begin
- Result := '';
- hDevice := CreateFile('\.PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or
- FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
- if hDevice = INVALID_HANDLE_VALUE then
- Exit;
- Size := SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1;
- SCOP := AllocMem(Size);
- SCIP.irDriveRegs.bCommandReg := IDE_ATA_IDENTIFY;
- if DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, @SCIP, SizeOf(TSendCmdInParams) - 1, SCOP, Size,
- cbBytesReturned, nil) = False then
- begin
- FreeMem(SCOP);
- CloseHandle(hDevice);
- Exit;
- end;
- // 处理一下序列号在内存中的顺序
- with PIdSector(@SCOP^.bBuffer[0])^ do
- begin
- SetLength(Result, Length(sSerialNumber));
- P := @Result[1];
- CopyMemory(P, @sSerialNumber[0], Length(sSerialNumber));
- for I := 1 to Length(sSerialNumber) div 2 do
- begin
- P^ := LittleToBig(P^);
- Inc(P);
- end;
- end;
- FreeMem(SCOP);
- end;
- end.