小编Lob*_*uno的帖子

Delphi线程死锁

在销毁某些线程时,我遇到了有时遇到死锁的问题.我试图调试问题但是在IDE中调试时似乎永远不存在死锁,可能是因为IDE中事件的速度很慢.

问题:

主线程在应用程序启动时创建多个线程.线程始终处于活动状态并与主线程同步.没问题.当应用程序结束时,线程被销毁(mainform.onclose),如下所示:

thread1.terminate;
thread1.waitfor;
thread1.free;
Run Code Online (Sandbox Code Playgroud)

等等.

但有时其中一个线程(使用synchronize将一些字符串记录到备忘录中)将在关闭时锁定整个应用程序.我怀疑当我调用waitform并且harmaggeddon发生时线程正在同步,但这只是猜测,因为在调试时永远不会发生死锁(或者我从来没有能够重现它).有什么建议?

delphi multithreading

14
推荐指数
2
解决办法
5097
查看次数

最佳图标尺寸,用于在托盘中显示

我正在研究Delphi程序,它将在"托盘"上显示一个图标.我正在"艰难的方式"(使用Shell_NotifyIcon api等,而不是组件,这里的原因除外).它工作正常,但有时似乎某些系统中的图标有点"模糊".现在,我已经尝试使用16x16 bmp,32x32等.似乎系统将其缩小到所需的大小,但结果根据操作系统版本(或者其他可能的东西)而有所不同....

您是否有任何关于BMP的最佳尺寸和颜色深度的经验,使用ShellI上的Shell_NotifyIcon提取并显示在托盘上?

delphi shell winapi system-tray

11
推荐指数
2
解决办法
2万
查看次数

Delphi:使用Critical Sections的首选保护方式

我有一个对象x,需要从几个(5+个线程)访问.对象的结构是

    Tx = class
    private
      Fx: integer;
    public
      property x: integer read Fx read Fx;
   etc;
Run Code Online (Sandbox Code Playgroud)

什么是更好(最优雅)的保护方式:

一个)

Tx = class
 private
   Fx: integer;
 public
   property x: integer read Fx read Fx;
 public
   constructor Create; <--- Create the criticalsection here
   destructor Destroy; <--destroy it here
 etc;

var
   cs: TCriticalSection;
   Obj: Tx;

function GetSafeObject(): Tx;
begin
CS.Enter;
try
Result:= Obj;
finally
CS.Leave;
Run Code Online (Sandbox Code Playgroud)

结束;

并始终将对象作为GetSafeObj()访问.x:= 3;

要么

Tx = class
 private
   Fx: integer;
   FCS: TCriticalSection;
 public
   property x: integer read GerX read …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading

8
推荐指数
3
解决办法
7340
查看次数

本月的第一个[星期一],本月的第二个[星期四]等,德尔福

使用Delphi,我需要一个函数来评估当前日期,看看它是否是,例如,当月的第三个星期日等.

在伪代码中:

function IsFirst(const CurrentDateTime: TDateTime; const Day: Word): Boolean;
/// Day can be 1-7 (monday to sunday)
begin
  Result:= ??
end;
Run Code Online (Sandbox Code Playgroud)

计算本月的第二,第三,第四和最后一个时需要另一个功能.DateUtils似乎没有那样的东西.有任何想法吗?

delphi datetime

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

Indy FTP,大文件和NAT路由器

我多年来一直使用Indy通过FTP传输文件,但未能找到满意的解决方案来解决以下问题.

当用户在路由器后面上传大文件时,有时会发生以下情况:文件上传正常,但同时命令通道因超时而断开连接.通常,直接连接到服务器不会发生这种情况,因为服务器"知道"正在数据通道上进行传输.但是有些路由器并未意识到这一点,并且命令通道已关闭.

许多程序定期发送NOOP命令以保持命令通道处于活动状态,即使这不是标准FTP规范的一部分.我的问题:我该怎么做?我是否在OnWork事件中发送NOOP命令?这是否会以某种方式造成任何附带损害,例如,我是否需要处理某些响应?我该如何最好地解决这个问题?

delphi ftp indy

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

如何将Delphi XE2外观应用于DLL中的表单?

使用Delphi XE2,您可以选择将自定义样式(外观)嵌入到VCL项目中.
一切正常.现在我将一些表单放入一个动态显示的分隔dll中.
当然那些没有剥皮.我该如何纠正?

我想我必须以某种方式打电话给TVisualStyle,但没有运气.

主人:

procedure TForm1.Button1Click(Sender: TObject); 
var   
  l: THandle;   
  p: procedure (const h: THandle); stdcall; 
begin   
 l:= LoadLibrary('project1.dll');   
 if l > 0 then   
 begin
        @p:= GetProcAddress(l,'ShowIt');
        p(Application.Handle);
        FreeLibrary(l);   
  end; 
end;
Run Code Online (Sandbox Code Playgroud)

dll:

procedure ShowIt(const h: THandle);stdcall;
var
  form: TForm;
  b: TButton;
  han: THandle;
begin
  han:= Application.Handle;
  Application.Handle:= h;
  form :=Tform.Create(Application);
  b:= TButton.Create(form);
  b.Parent:= form;
  b.Caption:= 'ytes';
  b.Left:= 2;
  b.Top:= 2;
  form.ShowModal;
  form.Release;
  Application.Handle:= han;
end;

exports ShowIt ;
begin
end.
Run Code Online (Sandbox Code Playgroud)

很标准的东西.现在,要使dll表单使用主机的样式主题,究竟必须做些什么?

delphi skinning vcl-styles

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

将数据存储到 SQL,编码与否?

最佳实践是什么?我正在创建一个ASP.NET网站,用户可以在其中输入要存储在 SQL 数据库中的文本数据。我用来HttpUtility.HTNLEncode()存储数据并HTMLDecode显示它。

这很有效,但搜索(选择或自由文本)要困难得多。用户应该能够输入包含 <、"、' 和任何其他有问题的字符的文本。

最佳实践是什么?存储未编码的数据?那么如何降低注射风险呢?

c# sql asp.net

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

Delphi Indy:无法第一次加载SSL库.重试有效

我正在使用最新的indy快照(昨天安装)和最新的SSL库.

当尝试使用idSMTP发送邮件时,组件第一次连接时,我得到一个例外:

无法加载SSL库

.有趣的是,重试总是有效.调试我发现问题出在IsSSLOpenSSLHeader,函数Loaad:boolean,line

@OpenSSL_add_all_algorithms := LoadFunctionCLib('OpenSSL_add_all_algorithms');
Run Code Online (Sandbox Code Playgroud)

为什么它第一次失败而不是第二次对我来说仍然是一个谜,但在我继续调查之前,我想好像有人知道这个问题的解决方案.

delphi ssl indy

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

当掩码包含"["时,如何使用TMask?

我在Delphi 2010中一直在试验TMask,它似乎按预期工作,除了在一种情况下:当掩码名称包含[或]时,掩码似乎总是返回false.例如:

var
  MaskObj : TMask;
begin
  MaskObj:= TMask.Create('c:\[test]\*');
  try
    Result:= MaskObj.Matches('c:\[test]\text');
  finally
    FreeAndNil(MaskObj);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

返回false....

是的,[和]是文件名中的合法字符.因此,如果我想排除例如c:[test]*中的所有文件,我该怎么办?我唯一的解决方案是在检测到[但是这对于大量文件来说会很慢时执行StringReplace :

if (pos('[', Mask)>0) then
begin
  mask:= ReplaceString(Mask, '[','_', etc...
  // and do the same for the file name---
end;
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?

delphi wildcard

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

Delphi:将表单放在dll中

我在dll中创建一个表单.没有包裹.使用导出的过程调用dll中的表单:

procedure ShowAbout(const AppHandle: THandle); stdcall;
  var
    aHandle: THandle;
    form:  TfrmAbout;  / my form in some other unit in the dll
  begin

    aHandle:= Application.Handle;
    Application.Handle:= AppHandle;

    form :=TfrmAbout.Create(Application);
    form.ShowModal;
    form.Free;
    Application.Handle:= aHandle;
  end;
Run Code Online (Sandbox Code Playgroud)

表格显示良好,没有问题.现在,我唯一希望它做的是将行为定位为poMainFormCenter(我希望它始终显示在主窗体上(调用dll的窗体).

我尝试过使用form:= TfrmAbout.Create(Application.MainForm); 等但没有运气.

任何有助于此的技巧?

forms delphi dll

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

在UnicodeChar和Integer之间输入强制转换是否安全?

在2009年之前的Delphi(ANSI land)中,您可以使用OrdChr将字符转换为字节,反之亦然.这很好,例如当你需要将char作为一个字节操作时:

var
  ch: char;
begin
  ch:= chr(ord(ch1) xor ord(ch2));
end;
Run Code Online (Sandbox Code Playgroud)

显然,在较新的Delphis中,字符不再是一个字节而是两个字节.那么进行类型转换是否安全:

var
  ch: char;
begin
  ch:= Char(integer(ch1) xor integer(ch2));
end;
Run Code Online (Sandbox Code Playgroud)

获得相同的结果?到目前为止我所做的测试即使使用西里尔字母和阿拉伯字符也能正常工作,但你永远都不会知道.

delphi unicode casting

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

Sql join,2个表,相同的字段

我有2张桌子.简化:

表1,用户:


userId int,userName nvarchar(50)


表2,消息:


msgId int,msgFrom int,msgTo int ...


msg1和msg2都包含userId.现在我想获取所有消息,但我想要用户名而不是msgFrom.我知道该怎么做:

    select tabMessages.*, tabUsers.userName as Sender 
      from tabMessages 
inner join tabUsers on msgFrom=userId 
where msgId = @someParameter;
Run Code Online (Sandbox Code Playgroud)

一切都很好,花花公子.获取用户名而不是msgTo是一样的.现在的问题是,如何在同一个呼叫中获取两个字段?我想得到这张桌子


msgId,msgFrom,msgTo,发件人,收件人.我试过:

    select tabMessages.*, tabUsers.userName as Sender, 
           tabUsers.userName as Recipient 
      from tabMessages 
inner join tabUsers on msgFrom=userId and msgTo=userId 
     where msgId = @someParameter;
Run Code Online (Sandbox Code Playgroud)

但这不起作用.顺便说一下,我正在使用Ms sql2000.

sql sql-server

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