小编TLa*_*ama的帖子

TWebBrowser:缩放+"一个窗口模式"不兼容

我在尝试什么:

我需要一个总是放大的TWebBrowser(~140%)并将所有链接保存在同一个webbrowser中(即_BLANK链接应该在同一个浏览器控件中打开).

我是怎么做到的:

我已将FEATURE_BROWSER_EMULATION注册表设置为9999,因此使用IE9呈现网页.我已经确认这是有效的.此外,我正在使用IE9全新安装Windows 7运行已编译的程序,通过Windows Update完全更新.

缩放:

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  ZoomFac: OLEVariant;
begin
  ZoomFac := 140;
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
Run Code Online (Sandbox Code Playgroud)

这非常有效.

在同一浏览器控件中打开新窗口:

默认情况下,当TWebBrowser遇到要在新窗口中打开的链接集时,会打开一个新的IE.我需要它留在我的程序/ webbrowser中.

我在这里尝试了很多东西.这对我有用:

procedure TFormWeb.WebBrowser1NewWindow3(ASender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal;
  const bstrUrlContext, bstrUrl: WideString);
begin
  Cancel := True;
  WebBrowser1.Navigate(bstrUrl);
end;
Run Code Online (Sandbox Code Playgroud)

我取消了新窗口,而只是导航到同一个URL.

互联网上各种页面上的其他来源表明我不会取消,而是将ppDisp设置为各种各样的东西,例如WebBrowser1.DefaultDispath或者WebBrowser1.Application它们的变体.这对我不起作用.当我单击_BLANK链接时,没有任何反应.这是在两台计算机(Win7和IE9)上测试的.我不知道为什么它不起作用,因为这似乎适用于互联网上的其他人.也许这会解决问题?

现在的问题是:

当我结合这两段代码时,它会破坏!

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://wbm.dk/test.htm');
  // This is a test page, that I created. It just …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010

6
推荐指数
1
解决办法
3390
查看次数

NSIS插件"nsScreenshot"在Windows NT 6.x中不起作用

我添加了一个比原始插件晚3年发布的代码,但它仍然返回错误...

代码是直截了当的......但我仍然很想念一些方面......

看到这段代码:

{
        nsScreenshot NSIS Plugin
        (c) 2003: Leon Zandman (leon@wirwar.com)

        Re-compiled by: Linards Liepins (linards.liepins@gmail.com)
        Code by: http://www.delphitricks.com/source-code/forms/make_a_desktop_screenshot.html
        (e) 2012.
}
library nsScreenshot;

uses
  nsis in './nsis.pas',
  Windows,
  Jpeg,
  graphics,
  types,
  SysUtils;

const
  USER32 = 'user32.dll';

type
  HWND = type LongWord;
  {$EXTERNALSYM HWND}
  HDC = type LongWord;
  {$EXTERNALSYM HDC}
  BOOL = LongBool;
  {$EXTERNALSYM BOOL}

{$EXTERNALSYM GetDesktopWindow}
function GetDesktopWindow: HWND; stdcall; external USER32 name 'GetDesktopWindow';
{$EXTERNALSYM GetWindowDC}
function GetWindowDC(hWnd: HWND): HDC; stdcall; external USER32 name 'GetWindowDC';
{$EXTERNALSYM GetWindowRect}
function …
Run Code Online (Sandbox Code Playgroud)

delphi plugins screenshot nsis delphi-xe

6
推荐指数
1
解决办法
1105
查看次数

如何通过<select>下拉列表中的"value"属性选择<option>项?

在我的Delphi应用程序中,我正在使用一个TWebBrowser控件,我在其中加载了一个HTML文档,其中包含一个<select>元素(下拉列表)和一些<option>项目(下拉列表项).假设我在网络浏览器中加载了以下HTML文档:

<html>
<body>
  <select id="ComboBox">
    <option value="firstvalue">First Value</option>
    <option value="secondvalue">Second Value</option>
    <option value="thirdvalue">Third Value</option>
  </select>  
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我怎样才能以编程方式选择,例如<option>,其value属性是thirdvalue?或者换句话说,当我只知道该项的value属性是thirdvalue什么时,我如何以编程方式选择此下拉列表中的第三项?

delphi dom twebbrowser

6
推荐指数
1
解决办法
6649
查看次数

为什么TDateTimePicker.Checked在Windows 7上总是返回True?

我有一个应用程序,在Delphi 2007中构建,TDateTimePicker在表单上有一个.此日期时间选择器具有ShowCheckbox设置为的属性True,其在日期或时间旁边显示一个复选框,每当用户选择日期时,或者通过代码更改日期或时间时,该复选框将自动选中.此复选框的状态也可由用户手动控制,其状态可由Checked属性确定.

以下代码显示如何确定OnChange事件中此复选框的状态:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DateTimePicker1.ShowCheckbox := True;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  ShowMessage('Checked: ' + BoolToStr(DateTimePicker1.Checked, True));
end;
Run Code Online (Sandbox Code Playgroud)

上面的代码在Windows XP上按预期工作,但在Windows 7上,Checked无论该复选框的实际状态如何,该属性都返回True.

为什么Checked属性返回始终为True,即使取消选中复选框也是如此?有办法以某种方式修复或解决这个问题吗?

PS我的应用程序使用Windows主题

delphi delphi-2007 windows-7 tdatetimepicker

6
推荐指数
1
解决办法
2407
查看次数

当dgRowSelect设置为True时,检测在TDBGrid中单击了哪个单元格?

在Delphi 2010中有什么方法可以检测当dgRowSelect设置为True 时单击了哪个单元格?

通常我会使用OnCellClick(Column: TColumn)事件处理程序,但这不会按预期工作.使用dgRowSelect = False此过程将传递单击的列,但dgRowSelect = True无论单击哪个列,都会将此过程传递给第一列.

我无法解决代码调用参数OnCellClick传递的位置TColumn,如果我能找到我可能能够解决如何修复这种奇怪的行为.

delphi tdbgrid delphi-2010

6
推荐指数
1
解决办法
9724
查看次数

如何更改自定义页面上的下一个/取消按钮标题?

如何更改自定义页面上的下一个/取消按钮标题?

inno-setup

6
推荐指数
1
解决办法
2231
查看次数

如何在指定时间内显示消息框?

有没有办法在指定的时间内显示一个消息框(这意味着,当指定的时间过去时,消息框将自动关闭)?

inno-setup messagebox

6
推荐指数
1
解决办法
1308
查看次数

类实例和指针背后的Delphi设计原则是什么?

来自C++背景,我理解类,指针和内存地址相当不错.然而,对于Delphi,我发现自己很困惑.

我理解当你在var一个函数/过程的部分声明一个特定类型的类的变量时,你真正声明的是该类的指针.例如,以下Delphi和C++大致相同,都分配MyObject了堆上类所需的内存量.

// Delphi
procedure Blah.Something();
var
  o: MyObject;
begin
  o := MyObject.Create;
  o.Free;
end;

// C++
void Blah::Something()
{
    MyObject *o = new MyObject();
    delete o;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,使用指针(和引用)允许对类层次结构使用虚方法.但是,如果您没有类层次结构,则可以在堆栈上声明一个变量(执行速度更快).如果需要将变量作为指针传递,则只需使用&运算符获取其地址即可.

// C++
void Blah::Something()
{
    // This is allocated on the stack.
    MyObject o;
    // This address of this stack-allocated object is being used.
    doSomethingWithAnOhPointer(&o);
}
Run Code Online (Sandbox Code Playgroud)

在这个阶段,我有一些关于Delphi使用类和指针的问题.

  1. 如果o := MyObject.Create在Delphi中使用堆分配创建对象,如何在堆栈上分配对象?
  2. 如果声明为特定类型的类的变量o: MyObject实际上是指针,那么为什么^指针符号从未使用过.这是德尔福的"便利"成语吗?
  3. 你怎么能得到MyObject堆上实际的地址?我试过了:以下.

    WriteLogLine('Address of object: ' …
    Run Code Online (Sandbox Code Playgroud)

c++ delphi pointers class

6
推荐指数
1
解决办法
373
查看次数

如何使用SuperObject序列化包含点(例如IP地址)的JSON密钥?

我正在尝试保存JSON,其中IP是关键.预期的JSON结果是:

{"SnmpManagers":[{"10.112.25.235":162}]}
Run Code Online (Sandbox Code Playgroud)

Delphi SuperObject代码:

const
  IpAddr = '10.112.25.235';
  Port = 162;
var
  tmp: TSuperObject;
begin
  tmp := TSuperObject.Create;
  tmp.I[IpAddr] := Port;
  Json.A['SnmpManagers'].Add(tmp);
end;
Run Code Online (Sandbox Code Playgroud)

SuperObject将点解析为JSON对象的路径分隔符:

{"SnmpManagers":[{"10":{"112":{"25":{"235":162}}}}]}
Run Code Online (Sandbox Code Playgroud)

如何使用SuperObject正确地将IP保存为JSON密钥?

delphi parsing json ip-address superobject

6
推荐指数
1
解决办法
440
查看次数

如何在记录结构内声明并集?

我正在尝试定义TWaveFormatExtensible类型,但是我不确定是否正确声明了Samples联合。这是头文件(Windows SDK 10.0.17763.0)中的原始声明:

typedef struct {
    WAVEFORMATEX    Format;
    union {
        WORD wValidBitsPerSample;       /* bits of precision  */
        WORD wSamplesPerBlock;          /* valid if wBitsPerSample==0 */
        WORD wReserved;                 /* If neither applies, set to zero. */
    } Samples;
    DWORD           dwChannelMask;      /* which channels are */
                                        /* present in stream  */
    GUID            SubFormat;
}
Run Code Online (Sandbox Code Playgroud)

这就是我尝试过的:

type
  TWAVEFORMATEX = record
    wFormatTag: Word;
    nChannels: LongWord;
    nSamplesPerSec: Word;
    nAvgBytesPerSec: LongWord;
    nBlockAlign: Word;
    wBitsPerSample: Word;
    cbSize: Word;
  end;

  TWaveFormatExtensible = record
    Format: TWAVEFORMATEX; …
Run Code Online (Sandbox Code Playgroud)

delphi winapi delphi-7

6
推荐指数
1
解决办法
164
查看次数