小编Eri*_*tel的帖子

为什么Screen返回的分辨率低于我的Windows 8平板电脑设置为?

我有一台Windows 8平板电脑,全高清分辨率为1920x1080像素.

但是当我使用Delphi的Screen对象,以获得Screen.WidthScreen.Height它将返回的Windows 8平板电脑上运行的1280×720的分辨率.

问题根源在哪里?在Windows(平板电脑)方面还是在Delphi方面?我使用Delphi 7到XE2的结果相同.这似乎是一个平板电脑问题,而不是一般的Windows 8问题,因为我在Windows 8.1台式机上没有这样的行为.


结论

我只是想强调我的问题的原因,因为它有点隐藏在评论中.
默认情况下,我的平板电脑上的Windows 8使用150%DPI.1080px是720px的150%.因此应用程序可以使用720px.将DPI百分比降低到100%会产生预期的1080px分辨率.

delphi dpi tablet windows-8

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

如何在自动调整大小时调整Virtual TreeView列的缩进?

我想在VirtualStringTree中使我的列在自动调整列大小时在内容的左侧和右侧具有相同的缩进.

看一下我的样本VST,打开Header Option hoDblClickResize.

VST样本图像

在这张图片中,我双击列标题以自动调整"时间"列的大小.我强调了列的左侧和右侧之间的缩进差异.

如何调整VST,使右缩进与左缩进的大小相同?我是否必须破解VST源代码?如果是这样,有人能指出我在代码中的正确位置吗?

delphi virtualtreeview

5
推荐指数
1
解决办法
948
查看次数

如何使用Synapse for Delphi中止SMTP发送操作?

目前我正在测试Ararat Synapse在Delphi发送电子邮件.

本地函数创建TSMTPSend并发送电子邮件.
我怎样才能中止这个操作? 我已经设置了一个分配给SMTP.Sock.OnStatus的回调函数来执行一些状态输出.
当我想中止发送进度时,我想我可以在回调函数中使用TSMTPSend的TTCPBlockSocket,因为在这个函数中我无法直接访问TSMTPSend.

我想做的事情看起来基本上就像

MyCallBack(Sender: TObject; Reason: THookSocketReason; const Value: string);
begin
  if FCancelWasClicked then
  begin
    if Sender is TTCPBlockSocket then
      TTCPBlockSocket(Sender).StopFlag := True;
      // or TTCPBlockSocket(Sender).AbortSocket or CloseSocket
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但StopFlag显示没有效果,AbortSocket/CloseSocket导致StackOverFlow,因为套接字将无休止地抽取HR_CloseSocket消息.

我做错了吗?还有其他选择吗?

delphi email

5
推荐指数
1
解决办法
698
查看次数

如何防止 Windows 会话解锁后表单位置大小发生变化?

描述

我有一个 Delphi XE2 应用程序,其窗体之一横跨两个显示器。当我锁定 Windows 时,等到屏幕保护程序被激活然后解锁窗口,我的应用程序的所有窗体都将调整大小/重新定位以适合每个显示器(这显然是默认的 Windows 行为并适用于大多数应用程序)。

意图

每当发生这种锁定情况时,我要么想要恢复表单位置,要么阻止预先调整表单大小。

重现步骤

这些步骤适用于 Windows 7 x64。
我正在设置 1 分钟后激活空白屏幕保护程序。我打开我的应用程序和适当的拉伸表格。我lock的帐户并等待屏幕保护程序弹出。登录后我可以看到表单大小已调整。

在其他机器上锁定足以重现该行为。在某些机器上,激活的屏幕保护程序就足够了。

附加信息

到目前为止我所做的和观察到的:

  • 使用Spy++我看到我的应用程序收到一条带有=WM_SETTINGCHANGE的消息。此时我的表单已经有了新的尺寸。WParamSPI_SETWORKAREA
  • 我已经注册了会话通知来对会话锁定、解锁、注销等做出反应
    。锁定时收到会话更改,我的表单大小似乎没问题。当收到WM_SETTINGCHANGE后者时,表格大小已经改变并缩小到一个显示器。
  • 当我收到解锁事件时,尝试将表单大小调整为以前的大小未成功(尽管其属性已更改,但表单仍保持缩小状态)。我使用了表单的位置和大小属性以及SetWindowPos.
  • 受影响窗体的窗口状态为wsNormal。我以编程方式将表单拉伸到两个监视器上方,但不触及其窗口状态。
  • 尝试恢复WM_WTSSession_Change解锁消息上的旧(内部保存)位置/大小,我尝试
    SetWindowPos(Handle, HWND_NOTOPMOST, FFormSizePos.Left, FFormSizePos.Top, FFormSizePos.Width, FFormSizePos.Height, SWP_NOACTIVATE or SWP_NOMOVE);
    手动调用或设置大小属性,例如Self.Left := FFormSizePos.Left;

有人可以帮助解决我的意图吗?

windows delphi multiple-monitors

5
推荐指数
1
解决办法
2181
查看次数

在Delphi中存储配置数据有哪些选择?

我想在Delphi项目中存储和加载各种程序数据.此数据范围从简单字符串到更复杂的重复配置对象数据.

众所周知,ini文件提供了一种快速简便的方法来存储程序数据,但仅限于键值表示.

当涉及到这样的需求时,XML通常是首选的武器,但我想知道是否有XML的替代品.

最近我发现了Delphi的superobject,它似乎比XML更容易处理.对于使用JSON进行这种"非网络任务"有什么可说的吗?

你知道在Delphi中支持数据存储和加载纯文本(如ini,xml,json)的其他选项吗?

delphi storage

3
推荐指数
1
解决办法
1304
查看次数

如何使用字符串参数在Delphi中调用C++ DLL?

我的Delphi应用程序从一个C++ DLL调用一个函数,它应该返回这样的字符串.

C++ DLL

__declspec( dllexport ) void sample(char* str1, char* str2)
{
    strcpy(str1, "123");
    strcpy(str2, "abc");
}
Run Code Online (Sandbox Code Playgroud)

德尔福

procedure sample(Str1, Str2: pchar); cdecl; external 'cpp.dll';
var
  buf1 : Pchar;
  buf2 : Pchar;
begin
  sample(@buf1, @buf2);
  //display buf1 and buf2
  //ShowMessage(buf1); //it display random ascii characters 
end;
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

c++ delphi

3
推荐指数
1
解决办法
1300
查看次数