是否有Delphi实现的MREW(多次读取,独占写入)锁定,有利于读取写入?
以下情况:
type
TRec = record
Member : Integer;
end;
TMyClass = class
private
FRec : TRec;
public
property Rec : TRec read FRec write FRec;
end;
Run Code Online (Sandbox Code Playgroud)
以下不起作用(左侧不能分配),这是可以的,因为它TRec是一个值类型:
MyClass.Rec.Member := 0;
Run Code Online (Sandbox Code Playgroud)
在D2007中,虽然以下内容有效:
with MyClass.Rec do
Member := 0;
Run Code Online (Sandbox Code Playgroud)
不幸的是,它在D2010中不起作用(我认为它在D2009中也不起作用).第一个问题:为什么?故意改变了吗?或者它只是其他一些变化的副作用?D2007的解决方法只是一个"错误"吗?
第二个问题:您如何看待以下解决方法?使用安全吗?
with PRec (@MyClass.Rec)^ do
Member := 0;
Run Code Online (Sandbox Code Playgroud)
我在这里谈论现有代码,因此必须进行的更改才能使其工作应该是最小的.
谢谢!
我在DLL中有一个Delphi表单(我知道这限制了DLL对Delphi的使用,但在这种情况下这不是问题).
DLL导出一个ShowForm看起来大致如下的函数:
procedure ShowForm (App : TApplication);
begin
OldApp := Application;
try
Application := App;
MyForm := TMyForm.Create (nil);
try
MyForm.ShowModal;
finally
FreeAndNil (MyForm);
end;
finally
Application := OldApp;
end;
end;
Run Code Online (Sandbox Code Playgroud)
现在我在表格上使用了一个TAdvOfficeHint(来自TMS组件包).不幸的是,这些提示没有显示出来.
我在这里错过了什么吗?如何使表单的行为完全像我从主应用程序中显示的那样?
谢谢!
这个问题涉及到
它编译了一个很棒的(在可读,优雅,......的意义上)源代码列表.
阅读源代码时的部分学习经验肯定与语言无关,但每种语言都有自己的方法来完成某些事情.所以在这个问题中,我正在寻找优秀的Delphi代码.
什么是一些伟大的Delphi源代码来阅读和学习?有什么建议?
我遇到以下代码问题:
var
FileSize : Int64;
...
FileSize := Info.nFileSizeLow or (Info.nFileSizeHigh shl 32);
Run Code Online (Sandbox Code Playgroud)
我期望它能够工作,因为Int64任务的左侧类型.但事实并非如此.包含shl似乎产生溢出的部分计算.
所以我改成了:
FileSize := Info.nFileSizeLow or (Int64 (Info.nFileSizeHigh) shl 32);
Run Code Online (Sandbox Code Playgroud)
它适用于我的32位操作系统,但不适用于Vista 64位!
最后,
FileSize := Info.nFileSizeHigh;
FileSize := FileSize shl 32;
FileSize := Info.nFileSizeLow or FileSize;
Run Code Online (Sandbox Code Playgroud)
适用于两个系统.
有人可以解释这三个版本的差异吗?
我想执行一个应该只在Windows系统启动时触发的过程,这里的启动并不意味着程序启动.我能做些什么来触发我的手术.如果可能的话,我想避免搞乱注册表.我正在使用delphi 2010.
这里有很多类似的问题,但我找不到我的问题的答案.
我有一个TRichEdit并且想要在用户按下时实现一些自定义行为Tab.我将富编辑的WantTabs属性设置为True并尝试添加我的自定义行为OnKeyDown,这可以正常工作,但不幸的是,之后执行"正常"选项卡行为(在编辑中插入制表符).我尝试在事件处理程序中设置Key,0但这没有帮助.
如何防止"正常"选项卡行为被执行?
我可以依赖这样一个事实,即记录中的接口字段是否始终初始化为nil?
TMyRec = record
FGuard : IInterface;
FObject : TObject;
procedure CheckCreated;
end;
Run Code Online (Sandbox Code Playgroud)
这将允许我写:
procedure TMyCheck.CheckCreated;
begin
if (FGuard = nil) then
begin
FObject := TObject.Create;
FGuard := TGuard.Create (FObject);
end;
end;
Run Code Online (Sandbox Code Playgroud)
(用于自动终身管理)
我知道接口字段已初始化为,nil但是当包含在记录中时也是如此?
我尝试GOOGLE_APPLICATION_CREDENTIALS在 Netlify 上配置环境变量以便使用firebase-admin,但如何在那里获取实际的 JSON 文件?
显然我不能将它包含在 git 中。
我回来了另一个关于线程和同步的问题.想象一下,服务器应用程序必须执行冗长的操作,并且客户端希望他的GUI在等待服务器的响应时保持响应.我想到了以下模式:
TMonitor.Enter (FTCPClient);
try
WorkerThread := TWorkerThread.Create (SomeLengthyServerOperation);
while (not WorkerThread.Ready) do
Application.ProcessMessages;
DoSometingWithResults (WorkerThread.Result);
WorkerThread.Free;
finally
TMonitor.Exit (FTCPClient);
end;
Run Code Online (Sandbox Code Playgroud)
WorkerThread是一个派生自TThread的简单类,它执行传递给其构造函数的函数,然后终止(使用Ready = True,结果为Result).只要单击按钮,就会执行显示的代码.
现在我的问题:如果我非常快地点击按钮两次,我会得到一些奇怪的错误,看起来很像服务器和客户端之间的通信以某种方式被误解,我想通过锁定FTCPClient对象来避免.Application.ProcessMessages执行后的事件处理程序是什么线程?是每个线程的TMonitor锁吗?这是否意味着如果我使用Application.ProcessMessages,锁不起作用?
我现在无法更好地解释它.我希望有人明白我的观点.如果没有,请随时提问.
编辑:对于按钮的禁用和启用:我对客户端代码一无所知.可能是一个按钮事件处理程序,可能是其他东西.基本上我想隐藏客户端代码的锁定.
delphi ×9
delphi-2010 ×3
delphi-xe ×2
delphi-2007 ×1
delphi-2009 ×1
dll ×1
netlify ×1
records ×1
sveltekit ×1
tmonitor ×1
vcl ×1
windows ×1