标签: delphi-5

如何将WebBrowser呈现给设备上下文?

我想将网页(即TWebBrowser)呈现给设备上下文.我想使用Internet Explorer的布局引擎将内容呈现给设备上下文(即图元文件,pdf图元文件).


从Internet Explorer 9开始,IHTMLElementRender不再支持该接口:

IHTMLElementRender接口

使用此接口将元素的内容绘制到指定的设备上下文,通常是打印机.

会员
IHTMLElementRender接口从继承的IUnknown接口,但没有其他成员.

至于他们不再提及DrawToDC方法甚至存在:

IHTMLElementRender :: DrawToDC方法

已过时.将元素的内容绘制到指定的设备上下文.

句法

HRESULT DrawToDC(
     HDC hDC
);
Run Code Online (Sandbox Code Playgroud)

参数

  • hDC
    [in] 指定要绘制的设备的HDC,通常是打印机.

回报价值

如果成功则返回S_OK,否则返回错误值.

备注

从Windows Internet Explorer 9开始,不推荐使用此方法,不应使用此方法.

对于某些打印机,运行IHTMLElementRender :: DrawToDC可能会导致问题.通过首先运行IHTMLElementRender :: SetDocumentPrinter方法,然后将修改后的设备上下文传递给IHTMLElementRender :: DrawToDC,可以确保IHTMLElementRender :: DrawToDC在所有打印机上正常工作.

注意:我引用了所有文档,以便在Microsoft最终将其从MSDN中完全删除时仍可以找到它.随着接口声明:

IHTMLElementRender = interface(IUnknown)
   ['{3050F669-98B5-11CF-BB82-00AA00BDCE0B}']
   function DrawToDC(hdc: HDC): HResult; stdcall;
   function SetDocumentPrinter(const bstrPrinterName: WideString; hdc: HDC): …
Run Code Online (Sandbox Code Playgroud)

delphi winapi rendering delphi-5 internet-explorer-9

9
推荐指数
1
解决办法
3486
查看次数

如何在EExternal异常期间获取EXCEPTION_POINTERS?

我如何得到EXCEPTION_POINTERS,即:

  • PEXCEPTION_RECORD
  • PCONTEXT

EExternal异常期间的数据?

背景

当Windows抛出异常时,它会传递一个PEXCEPTION_POINTERS; 指向异常信息的指针:

typedef struct _EXCEPTION_POINTERS {
   PEXCEPTION_RECORD ExceptionRecord;
   PCONTEXT          ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
Run Code Online (Sandbox Code Playgroud)

Delphi抛出EExternal异常时,它只包含一半的信息,PEXCEPTION_RECORD唯一的:

EExternal = class(Exception)
public
  ExceptionRecord: PExceptionRecord;
end;
Run Code Online (Sandbox Code Playgroud)

EExternal例外情况下,如何同时获得两者?

示例用法

我正在尝试使用MiniDumpWriteDumpDelphi中的函数编写Minidump .

该函数有一些可选参数:

function MiniDumpWriteDump(
    hProcess: THandle; //A handle to the process for which the information is to be generated.
    ProcessID: DWORD; //The identifier of the process for which the information is to be generated.
    hFile: …
Run Code Online (Sandbox Code Playgroud)

delphi minidump exception-handling dbghelp delphi-5

9
推荐指数
1
解决办法
1891
查看次数

Delphi SampleProfiler:这段代码如何调用ntdll.dll?

我用Delphi采样分析器描述了我应用程序的一部分.像大多数人一样,我看到大部分时间都花在了里面ntdll.dll.

注意:我打开选项忽略 Application.Idle时间,并从中调用System.pas.所以它不在里面,ntdll因为应用程序是空闲的:

alt text http://i40.tinypic.com/fkmc9j.jpg

在多次运行多次之后,大部分时间似乎花在了内部ntdll.dll,但奇怪的是调用者是谁:

在此输入图像描述

来电者来自Virtual Treeview:

PrepareCell(PaintInfo, Window.Left, NodeBitmap.Width);    
Run Code Online (Sandbox Code Playgroud)

注意:应用程序不在内部,ntdll.dll因为应用程序处于空闲状态,因为调用者不是Application.Idle.

令我困惑的是,这条线本身(即不是PrepareCell 内部的东西)是调用者ntdll.更令人困惑的是:

  • 不仅不是内在的东西 PrepareCell()
  • 它甚至不是设置PrepareCell(如弹出堆栈变量,建立隐含例外帧等),这是主叫方.这些东西会在探查器中显示为beginPrepareCell内部的热点.

VirtualTrees.pas:

procedure TBaseVirtualTree.PrepareCell(var PaintInfo: TVTPaintInfo; WindowOrgX, MaxWidth: Integer);
begin
   ...
end;
Run Code Online (Sandbox Code Playgroud)

所以我想弄清楚这一行:

PrepareCell(PaintInfo, Window.Left, NodeBitmap.Width);    
Run Code Online (Sandbox Code Playgroud)

正在打电话ntdll.dll.


其他唯一的方法是三个参数:

  • PaintInfo
  • Window.Left
  • NodeBitmap.Width

也许其中一个是函数或属性getter,它会调用ntdll.所以我在线上放了一个断点,并在运行时查看CPU窗口:

alt text http://i44.tinypic.com/2ut0pkx.jpg …

delphi delphi-5

8
推荐指数
1
解决办法
2560
查看次数

Delphi:在运行时查找从给定基类下降的类?

是否正在运行时,查找从特定基类下降的所有类?

例如,假装有一个类:

TLocalization = class(TObject)
...
public
   function GetLanguageName: string;
end;
Run Code Online (Sandbox Code Playgroud)

或者假装有一堂课:

TTestCase = class(TObject)
...
public
   procedure Run; virtual;
end;
Run Code Online (Sandbox Code Playgroud)

或者假装有一堂课:

TPlugIn = class(TObject)
...
public
   procedure Execute; virtual;
end;
Run Code Online (Sandbox Code Playgroud)

或者假装有一堂课:

TTheClassImInterestedIn = class(TObject)
...
public
   procedure Something;
end;
Run Code Online (Sandbox Code Playgroud)

在运行时,我想找到所有下降的类,TTestCase以便我可以使用它们.

是否可以查询RTTI以获取此类信息?

或者:德尔福有没有办法让每个班级走路?然后我可以简单地打电话:

RunClass: TClass;

if (RunClass is TTestCase) then
begin
   TTestCase(RunClass).Something;
end;
Run Code Online (Sandbox Code Playgroud)

也可以看看

delphi rtti delphi-5

8
推荐指数
2
解决办法
5518
查看次数

Delphi:如何为后代添加不同的构造函数?

更新:我最初的例子有点复杂.这是一个简单的8行示例,它解释了一个代码块中的所有内容.以下不编译会发出警告:

TComputer = class(TObject)
public
    constructor Create(Cup: Integer); virtual;
end;

TCellPhone = class(TComputer)
public
    constructor Create(Cup: Integer; Teapot: string); virtual;
end;
Run Code Online (Sandbox Code Playgroud)

注意:这个问题是我正在进行的关于Delphi中构造函数的子句的系列问题的第3部分

原始问题

如何将构造函数添加到现有类?

让我们给出一个假设的例子(即我在SO编辑器中输入的一个例子,它可能编译也可能不编译):

TXHTMLStream = class(TXMLStream)
public
   ...
end;
Run Code Online (Sandbox Code Playgroud)

进一步假设正常使用TXHTMLStream涉及在可以使用之前执行大量重复代码:

var
   xs: TXHTMLStream;
begin
   xs := TXHTMLStream.Create(filename);
   xs.Encoding := UTF32;
   xs.XmlVersion := 1.1;
   xs.DocType := 'strict';
   xs.PreserveWhitespace := 'true';
   ...

   xs.Save(xhtmlDocument);
Run Code Online (Sandbox Code Playgroud)

假设我想创建一个简化所有样板设置代码的构造函数:

TXHTMLStream = class(TXMLStream)
public
    constructor Create(filename: string; Encoding: TEncoding); virtual;
end;

constructor TXHTMLStream.Create(filename: string; Encoding: TEncoding);
begin
   inherited Create(filename);
   xs.Encoding …
Run Code Online (Sandbox Code Playgroud)

delphi constructor delphi-5 constructor-chaining

8
推荐指数
1
解决办法
2435
查看次数

学习支持Delphi的最快方法是什么?

我已经接受了一些用Delphi编写的应用程序的支持.我有编程经验,但在Delphi中没有,在OOP中也很少.在经验丰富的Delphi程序员看来,学习如何破译原始程序员指令并纠正代码中的一些问题的最快方法是什么?

顺便说一下,代码是用Delphi 5编写的,原始的程序员无法回答有关他的工作的问题.

TIA

delphi delphi-5

8
推荐指数
1
解决办法
459
查看次数

Delphi5中浮点除零异常

我的应用程序是用Delphi5编写的.我正在使用madExcept来追踪错误.我追踪了一个"浮点dvision by zero"异常,它不应该是.引发它的代码段如下:

val:=100*Power(1.25,c);
Run Code Online (Sandbox Code Playgroud)

其中'c'实际上总是具有值'1'.

日志的堆栈跟踪:

main thread ($338f8):
00403504 +010 MyApp.exe   System   1970  +5 @FRAC
00479148 +058 MyApp.exe   Math              Power
007ae8a6 +262 MyApp.exe   MyClass  1962 +36 TMyClass.FormMouseWheel
Run Code Online (Sandbox Code Playgroud)

我有一个例外,一个分区确实发生了,但是除数是一个变量,当异常发生时它也有一个值'1'.我能够调试和重现.

我的问题:我错过了什么?浮点除法是否有一些我不知道的误报?

此外:我没有在异常点使用任何C++ DLL,因为它们倾向于以不同方式处理FP分区(返回NaN或+/- INF而不是引发异常).

任何指针赞赏.

delphi floating-point division delphi-5 divide-by-zero

8
推荐指数
1
解决办法
4354
查看次数

TListView标题栏中的复选框 - 如何防止它窃取焦点?

这与如何在TListView标题列中显示复选框的问题有关.

我想从使用代码这个答案@Sertac Akyuz.(我还需要这个在WinXP中工作)

但我想让标题CheckBox不从ListView或其他活动控件中窃取焦点.

一个快速的解决方法是始终将焦点设置为ListView ListHeaderWndProc:

...
FListHeaderChk.Checked := not FListHeaderChk.Checked;
ListView1.SetFocus;
// code that checks/clears all items
Run Code Online (Sandbox Code Playgroud)

但这有点难看.因为CheckBox首先被聚焦,然后焦点返回到ListView.如果我单击CheckBox并将鼠标拖到CheckBox外部,则无法接收BN_CLICKED消息.

我也尝试过:

TCheckBox = class(StdCtrls.TCheckBox)
  private
    procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    procedure DefaultHandler(var Message); override;
  end;

procedure TCheckBox.WMMouseActivate(var Message: TWMMouseActivate);
begin
  Message.Result := MA_NOACTIVATE; // no effect!
end;

procedure TCheckBox.CreateParams(var Params: TCreateParams);
const
  WS_EX_NOACTIVATE = $08000000;
begin
  inherited;
  Params.ExStyle := Params.ExStyle …
Run Code Online (Sandbox Code Playgroud)

delphi checkbox listview delphi-5

8
推荐指数
1
解决办法
1153
查看次数

使用.AsString或.Text?

我刚刚看到他们使用过的一些代码(D5)......

aStr:=tblAcct.FieldByName('Name').Text;
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但我一直用...

aStr:=tblAcct.FieldByName('Name').AsString;
Run Code Online (Sandbox Code Playgroud)

我在加载TMemo时使用了两者,但似乎没有区别.

aMemo.Lines.Text:=tblAcct.FieldByName('History').Text;
aMemo.Lines.Text:=tblAcct.FieldByName('History').AsString;
Run Code Online (Sandbox Code Playgroud)

有什么理由我应该使用一个而不是另一个?如果是这样,哪一个?

实际上对于TMemo,我通常使用......

aMemo.Lines.Assign(tblAcct.FieldByName('History'))
Run Code Online (Sandbox Code Playgroud)

这似乎也很好.

谢谢

delphi delphi-5

8
推荐指数
1
解决办法
2648
查看次数

如何在编辑框中接收TAB键?

我想OnKeyPress在用户按下Tab键时接收事件.

procedure TForm1.Edit1(Sender: TObject; var Key: Char);
begin
   case Key of
   #09:
      begin
         //Snip - Stuff i want to do
      end;
   end;
end;
Run Code Online (Sandbox Code Playgroud)

我尝试子类化Edit框,并处理WM_GETDLGCODE消息:

procedure TfrmEnableVIPMode.AccountNumberWindowProc(var Message: TMessage);
begin
   case Message.Msg of
   WM_GETDLGCODE: Message.Result := DLGC_WANTTAB;
   else
      FOldAccountNumberWindowProc(Message);
   end;
end;
Run Code Online (Sandbox Code Playgroud)

我现在收到Tab KeyPress事件(正如我所希望的那样),但现在按下LeftRight光标键会使焦点转移到Tab键顺序中的上一个或下一个控件.

收到Tab键按键事件的正确方法是什么?

奖金阅读

我试着做MSDN文档所说的内容:

wParam
用户按下的虚拟键,提示Windows发出此通知.处理程序必须有选择地处理这些键.例如,处理程序可能接受并处理VK_RETURN,但将VK_TAB委托给所有者窗口.有关值列表,请参阅虚拟键代码.

lParam指向MSG结构的指针(如果系统正在执行查询,则为NULL).

wParamwParam均为零.

更新二

我意识到我和这个答案有同样的错误:

if Message.Msg …
Run Code Online (Sandbox Code Playgroud)

delphi accessibility delphi-5 subclassing

7
推荐指数
2
解决办法
3971
查看次数