小编sta*_*005的帖子

将接口传递给其他进程

我使用WM_COPYDATA来启用我的两个进程A和B之间的通信.与基本数据类型交换数据没有问题.

现在我有一个问题,在某些情况下我想从我的进程A传递一个接口(IDispatch)到我的进程B.是否可能?

delphi com ipc interface idispatch

5
推荐指数
2
解决办法
797
查看次数

有没有什么方法可以将TArray <string>转换成TStringDynArray?

相当大一部分代码(delphi-dutil等)使用TStringDynArray.现在我想将所有键a转换TDictionary<string, string>为a TStringDynArray.不幸的是我才发现TDictionary.Keys.ToArray,这是TArray<T>.

我知道我可以编写一个简单的复制函数来进行原始内容复制,但我TStringDynArray通常非常大(大约10000个条目),所以我正在寻找一种有效的转换TArray<string>方式TStringDynArray.

function ConvertToStringDynArray(const A: TArray<string>): TStringDynArray;
var
  I: Integer;
begin
  assert(A <> nil);
  SetLength(Result, Length(A));
  for I := 0 to Length(A) - 1 do
    Result[I] := A[I];
end;
Run Code Online (Sandbox Code Playgroud)

arrays delphi generics collections dynamic

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

Delphi:如何调整 TEdit 的文本垂直位置

a TEdit(或 TCombo、TButtonedEdit)中的文本始终与顶部对齐。我还没有找到任何属性来改变对齐方式。通常这不是问题,除非我想设置更大的高度。

我用谷歌搜索了一下。有一些解决方案可以通过发送 Windows 消息来调整左右边距。但我不知道如何调整垂直对齐。

我不想使用更大的字体。有任何想法吗?

delphi controls vcl edit

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

对wcf服务发出https请求:根据验证程序,远程证书无效

我在本地计算机上通过http/https托管服务.当我通过http使用服务时,它工作得很好.当我在ajax上发出https请求时,它也有效.但是,当我尝试从客户端应用程序后面的代码中使用它时,它不起作用.它显示如下错误消息:

"The remote certificate is invalid according to the validation procedure"
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

c# asp.net wcf iis-7

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

使用QT平滑文本动画(Marquee文本效果)

我有一个关于如何在非强大的硬件(Atom N270 + Intel 945GSM)上使字幕文本流畅(使用Qt 4.5.3)的问题.我的方法如下:

  1. 我将文本(36px Arial粗体)绘制到QPixmap(离屏绘制设备)上
  2. 我设置了一个计时器,每30ms将1px内容移到左边.
  3. 当触发onTimer事件时,我选择QPixmap并将此部件打印到窗口画布上.

一般来说,它移动顺畅.但是,我创建的字幕越多,其使用的CPU使用率就越高.当文本可以填充50%的屏幕(1920x1680)时,CPU使用率约为70-80%.文本动画变得有点闪烁.如果我将定时器间隔设置为50ms或更大,它将是平滑的.但文字移动太慢了.

我的方法无效吗?我要用OpenGL吗?任何提示都是受欢迎的,并提前谢谢^^)

performance qt qt4 marquee

4
推荐指数
1
解决办法
5495
查看次数

如何更改 python (2.7) untitest 的测试描述

看来Python 2.7中的unittest模块已经改变了很多

我有一个测试用例:

class DemoTest(unittest.TestCase):
  def test_foo(self):
      """Test foo"""
      pass
Run Code Online (Sandbox Code Playgroud)

控制台输出为:

测试 foo ... 好的

升级到 Python 2.7 后,控制台输出现在为:

test_foo (testcase.demotest.DemoTest)

测试 foo ... 好的

第一行描述是没有用的。我想隐藏它,但不知道如何隐藏。

python unit-testing docstring

4
推荐指数
1
解决办法
1793
查看次数

命名线程的最佳实践

最近我研究了一个高并发事件驱动框架(Java Akka),它将创建大量Actor线程.当我调试Akka应用程序时,线程具有非常有意义的名称.真的很棒.当我切换回Delphi时,我感到不安的是所有线程都没有命名,尽管它们在过去的20年里都没有命名.

对于我自己设计的所有线程类,我遵循这样一种模式,即我定义了一个setter SetThreadNameNameThreadForDebuggingExecute方法中调用.这到目前为止工作正常.

type
  TMyThread = class(TThread)
  private
    FThreadName: string;
  protected
    procedure Execute; override;
  public
    procedure SetThreadName(const ThreadName: string);
  end;

procedure TMyThread.SetThreadName(const ThreadName: string);
begin
  FThreadName := ThreadName;
end;

procedure TMyThread.Execute;
begin
  NameThreadForDebugging(FThreadName);
  // Put normal thread execution code here
end;
Run Code Online (Sandbox Code Playgroud)

但是,除非我创建了一个下降线程类,否则第三方线程的这些实例将保持未命名状态.是否有Delphi Magic设置SetThreadName为基类Thread类?我可以Detour.pas用来强制NameThreadForDebugging(FThreadName)Execute方法的第一个地方调用.

有任何想法吗?


更新1 感谢David的亲切帮助.为了帮助其他读者更好地理解我的问题,这个问题已被重新改写.

  1. 我的代码出了什么问题?

    NameThreadForDebugging方法实际上是一种静态方法.第二个参数ThreadId是可选的,默认情况下它等于当前的线程ID.如果我ThreadId不清楚,我可能很可能命名当前的线程,而不是我真正想要命名的线程.

  2. 解决办法是什么?

    MyThread.NameThreadForDebugging('a_name', MyThread.ThreadId);在任何地方打电话或NameThreadForDebugging('a_name');在开始时打电话TMyThread.Execute. …

ide delphi debugging multithreading delphi-xe

4
推荐指数
1
解决办法
414
查看次数

为不同的Delphi IDE创建Delphi包的最佳实践

我维护一个开源的Delphi库.我想为所有Delphi XE系列编译器提供一个最小的项目文件.理想情况下,有这样一个工具,所以我只需要为XE6创建一个项目文件,它将删除所有冗余信息并自动为XE-XE5创建相应的项目文件.存档有什么聪明的方法吗?

这是我当前的项目文件,其中包含许多冗余信息.例如,它包含Android/iOS等的虚拟配置,但我的项目是传统Windows应用程序的目标.如果我手动删除这些信息,它将在项目更改时返回.我也知道,DebugInformationXE4中的值是boolean,而XE5 中是整数.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>{1118D87C-9E72-4D93-9098-E70AD237493A}</ProjectGuid>
        <MainSource>dutil_rtl.dpk</MainSource>
        <ProjectVersion>15.1</ProjectVersion>
        <FrameworkType>None</FrameworkType>
        <Base>True</Base>
        <Config Condition="'$(Config)'==''">Release</Config>
        <Platform Condition="'$(Platform)'==''">Win32</Platform>
        <TargetedPlatforms>3</TargetedPlatforms>
        <AppType>Package</AppType>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
        <Base_Win32>true</Base_Win32>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
        <Base_Win64>true</Base_Win64>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
        <Cfg_1>true</Cfg_1>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
        <Cfg_1_Win32>true</Cfg_1_Win32>
        <CfgParent>Cfg_1</CfgParent>
        <Cfg_1>true</Cfg_1>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
        <Cfg_1_Win64>true</Cfg_1_Win64>
        <CfgParent>Cfg_1</CfgParent>
        <Cfg_1>true</Cfg_1>
        <Base>true</Base> …
Run Code Online (Sandbox Code Playgroud)

delphi project-files

4
推荐指数
1
解决办法
968
查看次数

对D2010的更新真的很有意义

我正在尝试将我自己的项目迁移到delphi 2010.但它似乎非常困难.

  1. 我将TntControls用于旧项目.如果我删除这个库,我必须重新实现一些运行时函数.例如:将UnicodeString转换为指定的代码页.
  2. "SizeOf","Length",FillChar()仍然让我困惑.如果SizeOf()应替换为Length(),编译器将发出警告.但是我还没有找到任何安全的教程.
  3. 尝试将AnsiString强制转换为UnicodeString时出现令人困惑的警告.这次谈话不会导致数据丢失,不是吗?
  4. 必须重新测试许多代码(zip,string utils等).

太多令人头疼的问题......有人可以分享将现有项目从一个非常老的delphi迁移到delphi 2010的经验吗?

migration delphi unicode

3
推荐指数
2
解决办法
442
查看次数

如何在FastcodeAddressPatch之后访问替换过程

我尝试用我自己的版本即时替换Delphi内置函数.

function ShortCutToTextOverride(ShortCut: TShortCut): string;
begin
  if SomeCondition then
    Result := Menus.ShortCutToText // after patching the pointer equals ShortCutToTextOverride
  else
  begin
    // My own code goes here
  end;
end;

FastcodeAddressPatch(@Menus.ShortCutToText, @ShortCutToTextOverride);
Run Code Online (Sandbox Code Playgroud)

修补后,无法再访问原始功能.无论如何都可以访问它?

delphi

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