小编Mar*_*ner的帖子

在工作线程中使用SHFileOperation是否安全?

我想拥有

  • 一个后台线程将通过该SHFileOperation函数复制文件,当时总是只有一个SHFileOperation(但我希望它在线程中)
  • 我需要UI输出,所以我需要使用FOF_SIMPLEPROGRESS标志并将一些东西传递给Wnd成员

我有两个问题

  1. 从main以外的线程调用SHFileOperationwith FOF_SIMPLEPROGRESS标志(用于用户交互)是否安全?
  2. 如果是的话,我应该把什么句柄传递给Wnd会员?我已经尝试了主窗体的句柄,但是当例如弹出覆盖确认对话框并确认它时,主窗体被发送到后台,真的很奇怪

注意:我有一个队列用于这些操作,因此SHFileOperation当时只执行一个操作(完成后,线程继续执行另一个操作,可能是下一个操作SHFileOperation)

非常感谢

delphi winapi windows-shell thread-safety shfileoperation

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

是否可以在没有*.dfm和*.pas文件的情况下动态创建表单?

是否可以创建和显示TForm而无需源文件?我想在运行时创建我的表单,并且空的*.dfm和*.pas文件对我来说似乎没用.

谢谢

delphi dynamic createinstance tform delphi-xe2

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

如何从Delphi中的绝对路径获取文件URL?

我正在寻找一个Delphi函数,它返回Windows路径中的文件URL路径.在Delphi中有内置的东西吗?

例:

Input
C:\Users\Documents\File.txt

Output
file:///C:/Users/Documents/File.txt
Run Code Online (Sandbox Code Playgroud)

谢谢

delphi url file path delphi-2009

5
推荐指数
2
解决办法
2090
查看次数

如何在TRichEdit中设置EM_AUTOURLDETECT后检测URL链接?

我正在尝试使用EM_AUTOURLDETECT消息为TRichEdit组件实现URL检测.
我有以下代码的问题

procedure TForm1.Button1Click(Sender: TObject);
var Mask: Word;
begin
  Mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(Handle, EM_SETEVENTMASK, 0, Mask or ENM_LINK);
  SendMessage(Handle, EM_AUTOURLDETECT, Integer(True), 0);
end;
Run Code Online (Sandbox Code Playgroud)

它虽然有效,但我必须在这些设置之后更改TRichEdit的文本,以使其检测已写入文本中的URL.这就是问题,因为我的TRichEdit在应用此功能时处于ReadOnly模式.

执行此代码后,如何强制TRichEdit检测已写入文本中的URL,我该怎么办?
我正在查看文档,但没有提到这样的事情.

谢谢

delphi url winapi detection trichedit

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

如何检测特定的Delphi IDE是否正在运行?

我正在研究组件安装程序(仅适用于Delphi XE2),我想检测Delphi XE2 IDE是否正在运行.你怎么会发现它?

PS我知道TAppBuilder窗口类名,但我还需要检测IDE版本.

ide delphi version-detection delphi-xe2

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

将事件从主线程传递给工作线程并等待它是否安全?

我正在研究这种动作队列线程,我想等待某个动作执行.我想在主线程中创建操作,然后将其传递给队列线程函数(到队列的末尾)并等待执行此操作.所以我需要区分刚刚查询过的动作并等待它.

我有一个以下(伪)代码,我想知道

  • 它是否与Windows事件对象线程安全?
  • 如果是的话,这个概念会有效吗?

type
  TMyThread = class(TThread);
  private
    FEvent: THandle;
  protected
    procedure Execute; override;
  public
    procedure DoSomething(const AEvent: THandle);
  end;

procedure TMyThread.Execute;
begin
  //  is it working with events thread safe ?
  SetEvent(FEvent);
  //  the thread will continue, so I can't use WaitFor
  //  but it won't set this specific FEvent handle again
  //  I'm working on such kind of an action queue, so once the action with ID,
  //  here represented by the FEvent will be processed, it's …
Run Code Online (Sandbox Code Playgroud)

delphi events multithreading thread-safety delphi-xe2

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

Synopse SQLite为1:N关系选择行

我正在使用Synopse的SQLite实现,但我仍然坚持使用以下代码.在窗体的构造我创造一个有两个表的数据库模型Task,并Comment与一个表TaskComments有关系的1:N的任务的意见.我可以将行添加到TaskComments表中(Button1.OnClick事件为它添加一个任务和两个注释)但我不知道如何获取此任务的注释.

任何人都可以建议我如何获得某一行的N行(在这种情况下如何获得任务的评论)?

unit SynopseSQLiteTestUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SynCommons, SQLite3, SQLite3Commons, StdCtrls;

type
  TTask = class(TSQLRecord)
  private
    FTaskName: RawUTF8;
    FTaskCreated: TDateTime;
  published
    property TaskName: RawUTF8 read FTaskName write FTaskName;
    property TaskCreated: TDateTime read FTaskCreated write FTaskCreated;
  end;

  TComment = class(TSQLRecord)
  private
    FCommentText: RawUTF8;
    FCommentCreated: TDateTime;
  published
    property CommentText: RawUTF8 read FCommentText write FCommentText;
    property CommentCreated: TDateTime read FCommentCreated write FCommentCreated;
  end;

  TTaskComments = class(TSQLRecordMany)
  private …
Run Code Online (Sandbox Code Playgroud)

delphi sqlite table-relationships

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

更改TCreateParams.WinClassName或如何查找另一个自己的应用程序的表单句柄是否安全?

我有两个应用程序,其中第一个需要找到第二个(也是我自己),但不同的应用程序(不实例,但不同的应用程序)形式的手柄.我已经看过一些技巧,但我想知道我想做什么或者有效的方法是否安全.

我正在考虑使用FindWindow你可以传递类名的函数,所以如果我将表单中的WinClassName成员更改CreateParams为某个唯一值(例如GUID),那么我很容易找到一个大的窗口很有可能它是我申请的那个.

需要找到其形式的应用程序:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WinClassName := '{1EE65C52-2F4B-4600-AAE2-079C29AD2220}';
end;
Run Code Online (Sandbox Code Playgroud)

另一个需要找到前一个表单的应用程序:

procedure TForm1.Button1Click(Sender: TObject);
var
  FormHandle: HWND;
begin
  FormHandle := FindWindow('{1EE65C52-2F4B-4600-AAE2-079C29AD2220}', nil);
  ShowMessage(IntToStr(FormHandle));
end;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

将这个成员更改TCreateParams为我想要的或者在某些事情上是不安全的是否安全?或者,您如何从自己的另一个应用程序(不是应用程序实例,而是您自己的另一个应用程序)中查找表单的句柄?

非常感谢!

delphi winapi classname findwindow createparams

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

是否有文件名排序的比较功能?

可能重复:
如何在Windows资源管理器中获取Delphi中的排序顺序?

我正在寻找一个与Windows资源管理器完全相同的功能(文件排序).现在我正在使用CompareText函数,但它导致以下结果:

---------  /\  ---------
 AFile
 BFile
 _XFile
-----------------------
Run Code Online (Sandbox Code Playgroud)

Windows资源管理器以这种方式对相同的项目进行排序(这就是我想要的):

---------  /\  ---------
 _XFile
 AFile
 BFile
-----------------------
Run Code Online (Sandbox Code Playgroud)

是否有这种比较的功能或我应该由我自己处理?

谢谢!

delphi sorting file windows-explorer delphi-xe2

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

如何在构造函数中中断组件?

我想在组件无法加载时向条件状态添加条件状态,并告知其用户(开发人员)该组件无法在设计时加载并在运行时以目标用户加载(如果可能的话,安全地以某种方式安全).

如何防止组件在其构造函数中加载以及如何在设计时和运行时安全地显示构造函数中的消息(异常)?

constructor TSomeComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  if csDesigning in ComponentState then
    if SomeIncompatibleCondition then
      begin
        // how to display message (exception) about the wrong 
        // condition and interrupt the loading of the component ?
      end;

  // is it possible to do the same at runtime ?
end;
Run Code Online (Sandbox Code Playgroud)

谢谢

delphi constructor components delphi-2009

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