小编jpf*_*ius的帖子

如何更改侦听器线程优先级

我使用Indy 10的TIdCmdTCPServer组件来实现我的客户端 - 服务器应用程序.问题是来自客户端的请求可能相当复杂,并且我的服务器应用程序的GUI部分立即失去响应能力.从Indy文档中,我得到了Indy:

使用线程优先级tpHighest为Bindings创建和启动侦听器线程.

我可以改变这种行为吗?

delphi multithreading indy thread-priority

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

用户可调整的数据结构

假设一个数据结构的人用于联系人数据库.结构的字段应该是可配置的,以便用户可以将用户定义的字段添加到结构中,甚至可以更改现有字段.所以基本上应该有一个配置文件

FieldNo  FieldName          DataType           DefaultValue
 0        Name               String             ""
 1        Age                Integer            "0"
 ...
Run Code Online (Sandbox Code Playgroud)

然后程序应加载此文件,管理动态数据结构(动态不在"运行时更改"方式,但在"用户可以通过配置文件更改"方式)并允许轻松和类型安全地访问数据字段.

我已经实现了这一点,将有关每个数据字段的信息存储在静态数组中,并仅在对象中存储更改的值.

我的问题:有没有描述这种情况的模式?我想我不是第一个遇到创建用户可调类的问题的人吗?

提前致谢.如果问题不够明确,请告诉我.

delphi design-patterns dynamic

2
推荐指数
1
解决办法
290
查看次数

接口和泛型

我有问题要在以下场景中使用泛型:

Delphi提供的IComparable接口:

IComparable <T> = interface
  function CompareTo (Value : T) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)

我添加另一个接口IPersistent:

IPersistent = interface
  function  ToString : String;
  procedure FromString (const Str : String);
end;
Run Code Online (Sandbox Code Playgroud)

实现两个接口的类的一个示例:

TComparableString = class (TInterfacedObject, IComparable <String>, IPersistent)
strict private
  FValue : String;
public
  function  CompareTo (Value : String) : Integer;
  function  ToString : String;
  procedure FromString (const Str : String);
end;
Run Code Online (Sandbox Code Playgroud)

现在为另一个具有两个接口约束的泛型类:

ISortIndex <VALUE_TYPE : IPersistent, IComparable> = interface
  ...
end;
Run Code Online (Sandbox Code Playgroud)

最后是该接口的一个实现:

TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable> = class (TInterfacedObject, …
Run Code Online (Sandbox Code Playgroud)

delphi generics interface delphi-2009

2
推荐指数
1
解决办法
1980
查看次数

类类型和构造函数调用

如果我写

type
  MyClass = class of TMyClass;
...
Obj := MyClass.Create;
Run Code Online (Sandbox Code Playgroud)

调用正确的构造函数(TMyClass中的构造函数).

如果我写

var
  ClassVar : TClass;
...
ClassVar := TMyClass;
Obj := ClassVar.Create;
Run Code Online (Sandbox Code Playgroud)

只调用TObject构造函数.

为什么?这两个版本有什么区别?我可以在第二种情况下强制执行TMyClass构造函数调用吗?

delphi delphi-2009

2
推荐指数
1
解决办法
363
查看次数

如何使控件不可见但对鼠标事件有响应?

我想创建一个不可见的控件(从TCustomControl派生)但对正常事件做出反应(我想用它来显示在自定义元素上移动鼠标时的提示).我认为重写paint方法并将其留空将完成这项工作但不幸的是在组件所在的位置绘制了一个矩形.

如何使控件完全不可见?

delphi controls delphi-2009

2
推荐指数
1
解决办法
430
查看次数

将泛型类型的成员转换为TObject?

我目前正在考虑一个场景,我想要一个调用Free其项目的泛型类,如果它们是一个对象类型.所以我尝试了以下方法:

if (PTypeInfo (TypeInfo (T)).Kind = tkClass) then
  begin
  RttiType := RttiContext.GetType (TypeInfo (T));
  FreeMethod := RttiType.GetMethod ('Free');
  if (FreeMethod <> nil) then
    FreeMethod.Invoke (FInstance, []);
  end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,最后一行没有编译,这并不奇怪,因为类型不匹配.问题是:我可以编译吗?我尝试了转换Pointer然后转到TObject但是这给了我一个无效的类型转换错误.有没有办法FInstance : T进入TObject我可以传递给的参考Invoke

或者有没有其他方法来实现我想要的?请注意,重点是获取此类中的所有内容,因此我不想创建TObjectMyClass只接受对象的内容.

谢谢你的帮助.

delphi generics casting delphi-2010

2
推荐指数
1
解决办法
1929
查看次数

CodeSite类别和线程

我正在尝试捆绑到Delphi XE中的CodeSite Express.我想使用这样的Category功能:

CodeSite.Category := 'SomeCategory';
CodeSite.EnterMethod ('SomeMethod');
try
  DoSomething;
finally
  CodeSite.ExitMethod ('SomeMethod');
end;
Run Code Online (Sandbox Code Playgroud)

问题是,如果DoSomething包含设置类别的日志记录代码,那么结果ExitMethod将以不同的类别结束,并将在查看器中炸毁整个层次结构.

更糟糕的是,如果线程插入:设置Category然后调用日志命令显然不是原子操作,因此使用CodeSite日志记录的两个线程无法真正使用Category.至少这就是我在日志中的样子.我原本期望它Category是线程局部的,但似乎不是.

在嵌套日志记录和线程的上下文中处理类别的正确模式是什么?

谢谢!

delphi logging multithreading codesite delphi-xe

2
推荐指数
1
解决办法
619
查看次数

FastMM报告记录线程变量的内存泄漏

FastMM报告以下代码片段的内存泄漏(UnicodeString),该代码片段使用带有字符串的记录线程变量:

program Project10;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  FastMM4,
  System.SysUtils;

type
  TContext = record
    Value : String;
  end;

threadvar
  Context : TContext;

begin
Context.Value := 'asdfsdfasfdsa';
end.
Run Code Online (Sandbox Code Playgroud)

这是真正的内存泄漏还是在FastMM检查内存泄漏后才发生线程变量的清理?

更重要的是:我怎样才能抑制这些"内存泄漏",因为它们会混淆可能发现的任何其他内存泄漏?

delphi memory-leaks fastmm delphi-xe2

2
推荐指数
1
解决办法
1038
查看次数

快速查找字符串列表中的重复项

什么是在Tstringlist中查找重复项的最快方法.我获得了在Stringlist中搜索重复项所需的数据.我目前的想法是这样的:

    var  TestStringList, DataStringList  : TstringList;


    for i := 0 to  DataStringList.Items-1 do
    begin
        if TestStringList.Indexof(DataStringList[i])< 0 < 0 then
        begin
          TestStringList.Add(DataStringList[i])
        end
        else
        begin
           memo1.ines.add('duplicate item found');
        end;

    end;
   ....
Run Code Online (Sandbox Code Playgroud)

delphi

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

计划任务是否收到WM_QUERYENDSESSION消息?

我有一个程序响应WM_QUERYENDSESSION执行一些清理作为计划任务运行.记录表明未执行清理代码.作为计划任务运行的应用程序是否接收WM_QUERYENDSESSION消息,或者是否有其他方法来检测Window关闭?

windows delphi winapi

2
推荐指数
1
解决办法
238
查看次数