我有2个或更多的动态字符串数组,填充了一些巨大的数据,我想将这个2数组合并到一个数组,我知道我可以用这样的for循环:
var
Arr1, Arr2, MergedArr: Array of string;
I: Integer;
begin
// Arr1:= 5000000 records
// Arr2:= 5000000 records
// Fill MergedArr by Arr1
MergedArr:= Arr1;
// Set length of MergedArr to length of ( Arra1 + Arr2 )+ 2
SetLength(MergedArr, High(Arr1)+ High(Arr2)+2);
// Add Arr2 to MergedArr
for I := Low(Arr2)+1 to High(Arr2)+1 do
MergedArr[High(Arr1)+ i]:= Arr2[i-1];
end;
Run Code Online (Sandbox Code Playgroud)
但是对于庞大的数据来说速度很慢,复制阵列内存数据有更快的方式吗?
我需要在我的控制台应用程序中编写一个处理收到消息的消息处理程序.例如,我注册WM_Test并将其发送到我的控制台应用程序,如下所示:
var
H: THandle;
begin
H:= FindWindow('ConsoleWindowClass', nil);
PostMessage(H, WM_Test, 0, 0);
end;
Run Code Online (Sandbox Code Playgroud)
现在我想在我的控制台应用程序中收到此消息时显示一个消息框.
我可以在控制台程序中使用PeekMessage或AllocateHWND吗?
我知道我可以使用管道来完成这项工作,但我想知道我是否可以使用窗口消息执行此操作.
我想终止用户从我的程序中选择的文件.我写了这个示例代码:
var
aFile: TFileStream;
Const
FileAddr: String = 'H:\Akon.mp3';
Buf: Byte = 0;
begin
if FileExists(FileAddr) then
begin
// Open given file in file stream & rewrite it
aFile:= TFileStream.Create(FileAddr, fmOpenReadWrite);
try
aFile.Seek(0, soFromBeginning);
while aFile.Position <> aFile.Size do
aFile.Write(Buf, 1);
finally
aFile.Free;
ShowMessage('Finish');
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如您所见,我用0(null)值覆盖给定文件.此代码可以正常工作,但在大文件中速度非常低.我想在多线程代码中执行此过程,但我尝试了一些测试代码而无法执行此操作.例如,我创建了4个执行此操作的线程来加速此过程.
有没有办法加快这个过程?
正如您在Delphi中所知,我们可以使用Deprecated指令来表示方法或...已过时或仅支持向后兼容性,我们可以使用Experimental指令来说当前单元处于不稳定的开发状态.
不推荐使用和实验指令在表单,单位中正常工作,但是当我们在我们添加到应用程序的单元上使用它们时,他们不工作,当编译应用程序时,在消息窗口中显示任何警告消息.
我可以在该单元中启用任何指令,如{$ HINTS ON}或{$ WARNINGS ON}吗?任何人都可以帮助我吗?
非常感谢 .
今天有一位朋友问我下面的代码:
var
a: Integer;
begin
ShowMessage(IntToStr(a));
end;
Run Code Online (Sandbox Code Playgroud)
这是局部变量,尚未初始化,好吗?
将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:
我在两台不同的计算机上测试代码并看到相同的结果,对此有何看法?
我尝试检查当前活动窗口是否是桌面做了什么,我在下面的代码中写了一个计时器,但GetDektopWindow和GetForegroundWindow返回的句柄值不是同一个值:
if GetForegroundWindow = GetDesktopWindow then
// Do something
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
在这里看到简单的Delphi代码:
function EnumProc(Handle: THandle; Lparam: LPARAM): Bool; stdcall;
begin
TMemo(Lparam).Lines.Add(IntToStr(Handle));
end;
Run Code Online (Sandbox Code Playgroud)
叫它 :
procedure TForm1.FormCreate(Sender: TObject);
begin
EnumWindows(@EnumProc, Lparam(Memo1))
end;
Run Code Online (Sandbox Code Playgroud)
此代码在Windows XP,Window 7 x86和Windows 8中成功运行.
现在测试Windows 7 x64中的代码,它只返回一个项目,这意味着Windows只调用一次EnumProc,这意味着EnumProc的结果为false,没有更多的窗口可用于枚举...
现在将我们的EnumProc更改为:
function EnumProc(Handle: THandle; Lparam: LPARAM): Bool; stdcall;
begin
TMemo(Lparam).Lines.Add(IntToStr(Handle));
result:= True;
end;
Run Code Online (Sandbox Code Playgroud)
好的,这个怎么样?!它适用于任何版本的Windows,包括Windows 7 x64!
任何的想法 ?它是Windows中的错误还是我的代码中的错误?
关心Mojtaba.