标签: delphi-2006

如何为相互依赖的记录定义隐式转换运算符?

我在Delphi 2006中使用运算符重载记录.(请不要告诉我不要回答这个问题.)

我有两个记录类型,隐式运算符重载.它们都只是在模块的实现中,而不是通过接口公开.

我的问题是,既然它们是相互依赖的,我不知道如何将第二种类型转发给编译器.我知道如何使用函数,过程和类来执行此操作,但不知道如何使用记录.

这是我想要做的简化示例:

implementation

type
  TMyRec1 = record
    Field1 : Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;  // <---- Undeclared Identifier here.
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

class operator TMyRec1.Implicit(a:TMyRec2): TMyRec1;
begin
  Result.Field1 := a.Field2;
end;

class operator TMyRec2.Implicit(a:TMyRec2): TMyRec2;
begin
  Result.Field2 := a.Field1;
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2006

13
推荐指数
1
解决办法
2445
查看次数

Delphi中三重逻辑

如何在Delphi中最好地实现三值逻辑

我在想

type
  TExtBoolean = (ebTrue, ebFalse, ebUnknown);
Run Code Online (Sandbox Code Playgroud)

function ExtOr(A: TExtBoolean; B: TExtBoolean): TExtBoolean;
begin
  if (A = ebTrue) or (B = ebTrue) then
    Result := ebTrue
  else if (A = ebFalse) and (B = ebFalse) then
    Result := ebFalse
  else
    Result := ebUnknown;
end;
Run Code Online (Sandbox Code Playgroud)

等等.

但这似乎并不是很优雅.有更好的方法吗?

编辑:优雅我的意思是易于使用.实现越优雅越好.CPU效率对我来说并不重要.

delphi logic delphi-2006

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

Delphi app tray图标上的气球提示会无限期地弹出

我有一个Delphi 2006应用程序,可以最小化到托盘图标,并通过托盘图标上的气球提示显示各种警报消息.

在某些情况下 - 我不知道什么时候 - 之前显示的气球提示不断弹出并且不会消失.它显示编程的时间长度,关闭,然后立即重新出现.

它始终是这个应用程序的气球提示.

如果应用程序显示另一个气球提示,那个显示编程时间,那么幻像提示将重新开始.

就好像提示卡在某个队列中并且不会被删除.没有任何人有一些灵感(我意识到这是一个长镜头......),有没有人知道如何清除气球提示?

delphi trayicon delphi-2006 hints popup-balloons

11
推荐指数
1
解决办法
3090
查看次数

在线程中"浪费时间"的CPU效率最高的方法是什么?

我有许多线程(100),每次执行几秒钟.当它们执行时,它们花费大量时间等待来自另一个系统(串行设备)的响应.我注意到一次执行100个线程可能是资源占用,所以我实际上限制了任何时候都可以启动的线程数.

虽然在线程中等待外部事件必须有好的和坏的方法,但我想到了这一点.这种方法是CPU密集型的吗?:

send command ;
repeat
until response arrived ;
process response ;    
Run Code Online (Sandbox Code Playgroud)

这种方法是否会提高效率?:

send command ;
repeat
    Sleep (20) ;
until response arrived ;
process response ;  
Run Code Online (Sandbox Code Playgroud)

*附加信息*

环境是x86 Windows XP.线程代码是一个长期的和涉及一系列与串行设备,但在一般的相互作用,它由写入字符到COM端口(使用AsyncFree串行库)并等待字符由驻留在传入字符缓冲器被返回的和他们到达时处理它们.我想这个串行库会让设备读写.只要在线程的时间可以是一分钟,或短则几秒钟,但大部分时间都花在等待字符离开港口,或等待响应字符(波特率为慢),因此我的问题是关于线程在等待时表现的最佳方式.目前我Sleep在循环中调用等待CharactersInBuffer变为非零,在它到达时处理每个字符,并在我有完整响应时退出线程.所以代码看起来更像(忽略超时处理等):

send command ;
Packet = '' ;
repeat

    repeat
        Sleep (20) ;
    until response character arrived ;
    build Packet

until complete packet arrived
process response ;  
Run Code Online (Sandbox Code Playgroud)

delphi multithreading sleep delphi-2006 thread-sleep

11
推荐指数
1
解决办法
2400
查看次数

在Delphi中找到"非泄漏"内存使用问题的策略或工具?

一台旧应用程序在服务器更新后开始大量消耗内存.在程序挂起之前,内存使用似乎会超出限制.

根据FastMM4和EurekaLog,没有内存泄漏(28字节除外),所以我假设应用程序关闭时释放所有内存.

是否有适合跟踪此类内存问题的工具或策略?

delphi memory-management delphi-2006

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

Delphi - 当用户点击外部模态对话框时,如何生成事件?

当用户在模态对话框外单击时,是否可以触发事件?

好的,Windows通过发出"bonk"声音或闪烁应用程序的任务栏按钮提供了自己的线索,但我想为声音不可用的情况和/或用户提供某种额外的线索无法识别任务栏闪烁的原因.此外,我想尝试使用此方法将模式对话框置于前面,如果它已隐藏在主窗体后面.

delphi delphi-2006

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

如何制作圆角的TFrame?

我想制作一个基于TFramewith TLMDShapeControl(用于绘制圆角背景)和TEdit控件(也可以是a TComboBox或a TDBEdit等)的组件.之后,我将使用"添加到调色板"命令将其转换为可重用的组件控件.

问题在于我需要宽度灵活,因此我有想法将所有内容都转动到Frame内部alClientTEdit使用5像素边距,这样用户就可以看到圆角.

这太糟糕了,因为我无法使用Align并将组件设置在另一个的顶部.现在我每次必须使用它时都要复制和粘贴组件!: - (((

我看到正确的事情的唯一方法是只使用TEditwith alClient和5px边距而不是TShape.相反,我可以使TFrame透明度为圆角,因此不会看起来不同颜色或丑陋TImages.

但是我该怎么做?

有没有人有任何代码示例?

这是目标:透明的圆角

delphi user-interface frame delphi-2006

10
推荐指数
1
解决办法
3902
查看次数

Delphi中重复的setter逻辑

对于类的每个setter,我必须实现一些事件逻辑(OnChanging,OnChanged):

procedure TBlock.SetWeightIn(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightIn;
  DoOnChanging(OldValue, Value);
  FWeightIn := Value;
  DoOnChanged(OldValue, Value);
end;

procedure TBlock.SetWeightOut(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightOut;
  DoOnChanging(OldValue, Value);
  FWeightOut := Value;
  DoOnChanged(OldValue, Value);
end;
Run Code Online (Sandbox Code Playgroud)

你能否建议一种方法来实现这一点,而不必为每个setter重复所有这些行?

delphi pascal delphi-2006

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

在Delphi中从.dfm文件中删除属性的快速方法

我最近修改了我的一个组件,它发生了它不再使用它之前使用的属性之一.

但是,这些属性在整个项目中以多个.dfm文件编写.现在,当我尝试编译项目时,我得到"错误读取.:属性<...>不存在"

复杂的部分是属性值是二进制数据(存储在多行中),我不能用Delphi替换或notepad ++ regexp删除它(因为它们是基于单行的).

所以我的问题是:

是否有任何第三方工具或方法可以轻松地从多个.dfm文件中删除属性?

regex delphi properties delphi-2006 dfm

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

如何根据其内容自动调整/缩放DBGrid(或其他类似的)列宽?

我正在尝试创建一个框架,其中包含DBGrid超过10个表,其中一半字段为默认值,其他字段为每个表独占.

由于列的空间有限,我不想手动配置每个表的每一列,因为它是非常差的质量工作,我想知道一种方法来计算每列内部最大内容的宽度.列,由自己的组件或数据集测量.

有谁知道的方式?世界上有一些具有这种力量的定制组件吗? 根据网格所有可见列中的可见数据,我需要一个实现大小增加和减少的解决方案. 到目前为止,我的解决方案是绘制所选单元格的问题,从所选数据集行中跳出.

在此输入图像描述


注意:请不要关闭我的问题.它与网格的宽度或形状的宽度无关.它是关于所有列宽度以最小化水平滚动条,但不一定隐藏它.

database delphi delphi-2006 tdbgrid

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