小编Moj*_*jik的帖子

如何在Delphi中合并2个字符串数组

我有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)

但是对于庞大的数据来说速度很慢,复制阵列内存数据有更快的方式吗?

arrays delphi

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

如何让我的控制台应用程序接收窗口消息?

我需要在我的控制台应用程序中编写一个处理收到消息的消息处理程序.例如,我注册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吗?

我知道我可以使用管道来完成这项工作,但我想知道我是否可以使用窗口消息执行此操作.

delphi winapi windows-messages

6
推荐指数
1
解决办法
1388
查看次数

如何快速清零文件内容?

我想终止用户从我的程序中选择的文件.我写了这个示例代码:

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

6
推荐指数
1
解决办法
2009
查看次数

使用中的问题不推荐使用或实验指令

正如您在Delphi中所知,我们可以使用Deprecated指令来表示方法或...已过时或仅支持向后兼容性,我们可以使用Experimental指令来说当前单元处于不稳定的开发状态.

不推荐使用和实验指令在表单,单位中正常工作,但是当我们在我们添加到应用程序的单元上使用它们时,他们不工作,当编译应用程序时,在消息窗口中显示任何警告消息.

我可以在该单元中启用任何指令,如{$ HINTS ON}或{$ WARNINGS ON}吗?任何人都可以帮助我吗?

非常感谢 .

delphi

6
推荐指数
1
解决办法
576
查看次数

当变量未初始化时,会产生简单的代码

今天有一位朋友问我下面的代码:

var
  a: Integer;
begin
  ShowMessage(IntToStr(a));
end;
Run Code Online (Sandbox Code Playgroud)

这是局部变量,尚未初始化,好吗?

将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:

  1. 单击按钮,查看结果,结果= 1635841
  2. 按Enter键,查看结果,结果= 1
  3. 按Space键查看结果,reuslt = 1636097

我在两台不同的计算机上测试代码并看到相同的结果,对此有何看法?

delphi

6
推荐指数
1
解决办法
493
查看次数

检查是当前活动窗口桌面还是否

我尝试检查当前活动窗口是否是桌面做了什么,我在下面的代码中写了一个计时器,但GetDektopWindow和GetForegroundWindow返回的句柄值不是同一个值:

  if GetForegroundWindow = GetDesktopWindow then
    // Do something
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

delphi winapi

3
推荐指数
1
解决办法
3039
查看次数

EnumWindow上的Windows 7 x64错误?

在这里看到简单的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.

delphi

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

标签 统计

delphi ×7

winapi ×2

arrays ×1

windows-messages ×1