在项目中使用DataModule的目的是什么?与普通类或模块相比,它是否具有任何特殊属性?通常用于什么的惯例是什么?
我正在网上阅读Nick Hodges,我发现了Queue,但它并没有像我预期的那样表现,我无法理解他和文档所说的内容.看看这段代码:
TThread.CreateAnonymousThread(
procedure
begin
TThread.Queue(TThread.Current, procedure
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('start');
end);
Sleep(2000);
TThread.Synchronize(TThread.Current, procedure
begin
Memo1.Lines.Add('end');
end);
end
).Start;
Run Code Online (Sandbox Code Playgroud)
我总是使用,Synchronize但这次我尝试过,Queue因为根据尼克,在多个请求的情况下更好,因为它们不会被"序列化"并逐个执行.上面的代码工作正常.为什么这不起作用呢?
TThread.CreateAnonymousThread(
procedure
begin
TThread.Queue(TThread.Current, procedure
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('start');
end);
Sleep(2000);
TThread.Queue(TThread.Current, procedure
begin
Memo1.Lines.Add('end');
end);
end
).Start;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,备注输出start但不是结束.我打电话的时候:
start备忘录中的内容只要 Delphi LSP 实现存在缺陷,如果我们能够通过易于访问的快捷方式重新启动 LSP 进程,那么它就会派上用场。如何添加这样的快捷方式呢?
当我发现像这样的构造实际编译并产生所需结果时,这只是偶然的机会:
var
Arr: TArray<Integer>;
begin
Arr := TArray<Integer>.Create(100, 101, 102);
end;
Run Code Online (Sandbox Code Playgroud)
我只在Delphi XE中测试过它,但它也可以在旧版本中使用.这是在某处记录的吗?
我有一个Delphi程序,在午夜运行时会出现错误行为.为了制作可重现的测试用例,我必须在午夜之前将系统的本地时间更改为某个时间,运行程序一段时间,检查错误并切换回来.虽然这肯定可以手动完成,但我有问题要自动进行测试.
是否有可能在不改变系统时间的情况下为应用程序提供特殊时间?这可以来自程序外部甚至内部.
虽然这可能是一般的Windows问题,但我使用Delphi标记它,因为使用Delphi的任何解决方案都很好,而在这种情况下,其他一些编程环境也没用.
面对在纯Mac环境中工作的公司开发数据库应用程序的任务,Delphi FMX应用程序使用的中央数据库服务器有哪些选择(除了显而易见的设置Windows或Linux框)?
我有一个调用,GetDIBits它在32位完美工作,但在64位上失败.尽管手柄的值不同,但bitmapinfo结构的内容是相同的.
这是我可以用来重现错误的最小(至少是结构稍微)代码示例.我使用Delphi 10 Seattle Update 1进行了测试,但是即使使用其他Delphi版本,也会出现错误.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Winapi.Windows,
System.SysUtils,
Vcl.Graphics;
type
TRGBALine = array[Word] of TRGBQuad;
PRGBALine = ^TRGBALine;
type
{ same structure as TBitmapInfo, but adds space for two more entries in bmiColors }
TMyBitmapInfo = record
bmiHeader: TBitmapInfoHeader;
bmiColors: array[0..2] of TRGBQuad;
public
constructor Create(AWidth, AHeight: Integer);
end;
constructor TMyBitmapInfo.Create(AWidth, AHeight: Integer);
begin
FillChar(bmiHeader, Sizeof(bmiHeader), 0);
bmiHeader.biSize := SizeOf(bmiHeader);
bmiHeader.biWidth := AWidth;
bmiHeader.biHeight := -AHeight; //Otherwise …Run Code Online (Sandbox Code Playgroud) 我需要向TDataSet添加其他字段,这些字段在底层数据库中不存在,但可以从现有字段派生.我可以轻松地使用caclulated字段做到这一点,并且完美无缺.
现在我想编辑这些字段并将更改的数据写回.我可以反转计算以将数据写回现有字段,但DB控件只是不允许我编辑计算字段.
是否有任何方法可以让我这样做?
更新: 好的,有关背景的更多细节.
数据集有一个blob字段,它是一个TBytes表示.一些字节被识别为包含可以用现有DB编辑字段以方便的方式表示的信息.但是,并非所有字节都是已知的,因此TBytes表示必须保持原样,以便通过另一个了解它的应用程序进行处理.此应用程序还修改现有和插入新记录.
数据集中不同记录的TByte经常映射到不同的字段表示,尽管在数据集上设置过滤器或范围将确保它们具有相同的映射.
正如我所说,提取已知字节并通过计算字段将其转换为字符串,日期,数字等是没有问题的.将这些值重新转换为TBytes也是可能的.问题是使这些额外的字段可编辑,同时保持数据集导航不变.
如果它有帮助:我们有类进行双向映射,将字段公开为已发布的属性.
我有一个只包含一个简单的表单TTouchKeyboard.表单BorderStyle设置为bsToolWindow.为了避免在单击触摸键盘时获得焦点,我WM_MOUSEACTIVATE使用此实现处理消息:
procedure TKeyboardForm.WMMouseActivate(var Message: TWMMouseActivate);
begin
Message.Result := MA_NOACTIVATE;
end;
Run Code Online (Sandbox Code Playgroud)
该BorderStyle设置允许使用标题栏拖动表单,但在这种情况下,表单仍然获得焦点.有办法避免这种情况吗?
更新:我尝试在CreateParams中将WS_EX_NOACTIVATE添加到ExStyle,但不幸的是,这不会阻止表单在拖动时获得焦点.
procedure TKeyboardForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE;
end;
Run Code Online (Sandbox Code Playgroud) 我将部署一个用Delphi编写的64位版本的OCX.OCX要求stdvcl40.dll可用并在目标系统中注册.据我所知,我的Delphi安装中只有32位版本,但由于源代码可用,我应该能够自己创建64位版本.
是否需要或有优势这样做,还是应该坚持使用所包含的版本并仅部署该版本?
编辑 只是为了给出一点背景知识:StdVCL40.dll主要包含一个类型库,它暴露了在System.Win.StdVCL.pas中声明的三个接口.此dll的更高版本还实现了一些处理这些接口的属性页.
删除对stdvcl40.dll的依赖性的结果是这些接口(在我的情况下为IStrings)在我的类型库中不再可用,并且任何引用都被IDispatch替换.
stdvcl40.dll不是一个设计时包,它必须与以前的Delphi版本中的大多数ActiveX库一起部署.我必须部署它,因为否则OCX首先拒绝注册.
它实际上似乎也适用于我的OCX的64位版本,可能是因为Windows COM非常聪明,可以发现没有64位版本,因此需要32位版本.虽然我不确定这是否可行.因此我的问题.
delphi ×10
64-bit ×1
arrays ×1
database ×1
dataset ×1
delphi-xe2 ×1
delphi-xe3 ×1
delphi-xe6 ×1
firemonkey ×1
focus ×1
generics ×1
getdibits ×1
macos ×1
time ×1
window ×1
windows ×1