我在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中最好地实现三值逻辑?
我在想
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 2006应用程序,可以最小化到托盘图标,并通过托盘图标上的气球提示显示各种警报消息.
在某些情况下 - 我不知道什么时候 - 之前显示的气球提示不断弹出并且不会消失.它显示编程的时间长度,关闭,然后立即重新出现.
它始终是这个应用程序的气球提示.
如果应用程序显示另一个气球提示,那个显示编程时间,那么幻像提示将重新开始.
就好像提示卡在某个队列中并且不会被删除.没有任何人有一些灵感(我意识到这是一个长镜头......),有没有人知道如何清除气球提示?
我有许多线程(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) 一台旧应用程序在服务器更新后开始大量消耗内存.在程序挂起之前,内存使用似乎会超出限制.
根据FastMM4和EurekaLog,没有内存泄漏(28字节除外),所以我假设应用程序关闭时释放所有内存.
是否有适合跟踪此类内存问题的工具或策略?
当用户在模态对话框外单击时,是否可以触发事件?
好的,Windows通过发出"bonk"声音或闪烁应用程序的任务栏按钮提供了自己的线索,但我想为声音不可用的情况和/或用户提供某种额外的线索无法识别任务栏闪烁的原因.此外,我想尝试使用此方法将模式对话框置于前面,如果它已隐藏在主窗体后面.
我想制作一个基于TFramewith TLMDShapeControl(用于绘制圆角背景)和TEdit控件(也可以是a TComboBox或a TDBEdit等)的组件.之后,我将使用"添加到调色板"命令将其转换为可重用的组件控件.
问题在于我需要宽度灵活,因此我有想法将所有内容都转动到Frame内部alClient并TEdit使用5像素边距,这样用户就可以看到圆角.
这太糟糕了,因为我无法使用Align并将组件设置在另一个的顶部.现在我每次必须使用它时都要复制和粘贴组件!: - (((
我看到正确的事情的唯一方法是只使用TEditwith alClient和5px边距而不是TShape.相反,我可以使TFrame透明度为圆角,因此不会看起来不同颜色或丑陋TImages.
但是我该怎么做?
有没有人有任何代码示例?

对于类的每个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重复所有这些行?
我最近修改了我的一个组件,它发生了它不再使用它之前使用的属性之一.
但是,这些属性在整个项目中以多个.dfm文件编写.现在,当我尝试编译项目时,我得到"错误读取.:属性<...>不存在"
复杂的部分是属性值是二进制数据(存储在多行中),我不能用Delphi替换或notepad ++ regexp删除它(因为它们是基于单行的).
所以我的问题是:
是否有任何第三方工具或方法可以轻松地从多个.dfm文件中删除属性?
我正在尝试创建一个框架,其中包含DBGrid超过10个表,其中一半字段为默认值,其他字段为每个表独占.
由于列的空间有限,我不想手动配置每个表的每一列,因为它是非常差的质量工作,我想知道一种方法来计算每列内部最大内容的宽度.列,由自己的组件或数据集测量.
有谁知道的方式?世界上有一些具有这种力量的定制组件吗? 根据网格所有可见列中的可见数据,我需要一个实现大小增加和减少的解决方案. 到目前为止,我的解决方案是绘制所选单元格的问题,从所选数据集行中跳出.

注意:请不要关闭我的问题.它与网格的宽度或形状的宽度无关.它是关于所有列宽度以最小化水平滚动条,但不一定隐藏它.
delphi ×10
delphi-2006 ×10
database ×1
dfm ×1
frame ×1
hints ×1
logic ×1
pascal ×1
properties ×1
regex ×1
sleep ×1
tdbgrid ×1
thread-sleep ×1
trayicon ×1