标签: delphi-7

Delphi的TADOConnection线程安全吗?

我正在编写一个Delphi 7应用程序,它需要同时从许多不同的线程访问同一个SQL Server数据库.

我可以使用单个共享TADOConnection,还是每个线程都必须创建自己的?

delphi ado delphi-7 thread-safety adoconnection

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

delphi获取文件夹路径

我正在使用Delphi 7,我想找出我的../所有用户/文档目录的路径.
我遇到了以下代码

uses shlobj, ...

function GetMyDocuments: string;
 var
  r: Bool;
  path: array[0..Max_Path] of Char;
 begin
  r := ShGetSpecialFolderPath(0, path, CSIDL_Personal, False) ;
  if not r then 
    raise Exception.Create('Could not find MyDocuments folder location.') ;
  Result := Path;
 end;
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它不支持CSIDL_COMMON_DOCUMENTS返回所需的路径.

此外,根据MS CSIDL不应再使用KNOWNFOLDERID.
我确实需要在多个操作系统(仅限Windows)上运行此应用程序.

我怎样才能做到这一点 ?
感谢帮助:)

delphi directory delphi-7

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

如何处理WM_ERASEBKGND以避免闪烁?

我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.

TMyProgressBar = class(TCustomControl)
Run Code Online (Sandbox Code Playgroud)

我继承了控件TCustomControl,因为我需要Handle和一些TWinControl事件.控件(最多64个项目)是动态创建的,并放在ScrollBox上.当进度更新时,我先打电话InvalidateRect.

所有的绘画工作(一组矩形,DrawText等等 - 从这里启发)都在存储器DC中执行,然后BitBlt在控制器的DC上执行.它无论如何都在闪烁,似乎组件消失并重新出现.恕我直言,它是由背景擦除引起的.

这个无闪烁的绘图建议中,它是WM_ERASEBKGND按以下方式编写的:

type
  TMyProgressBar = class(TCustomControl)
    procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;

procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
  Message.Result := 1;
end;
Run Code Online (Sandbox Code Playgroud)

但是在另一个组件中,通过TMS(TAdvProgressBar),Result设置0为相同的消息.

现在Windows文档说明:

如果应用程序删除背景,则应返回非零值; 否则,它应该返回零.

我测试了两种变体(结果= 0,1),令我惊讶的是都避免了闪烁.

那么现在,我需要在Delphi代码中加入什么?什么是正确的方法?

delphi winapi gdi flicker delphi-7

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

Delphi程序带字符串参数

我在使用Delphi中的过程和字符串时遇到了问题.事实是我希望看到输出字符串"1S2S3S4S5S6S",但实际输出是"1234S5S6".在调试过程中,它表示S1,S2,S3和S6字符串变量未初始化(S1,S2,S3,S6为''字符串,S4和S5为值'S').有人可以向我解释一下吗?这是代码:

program StringTest;

{$APPTYPE CONSOLE}

procedure MyProcedure(S1: String; const S2: String; var S3: String;
                      S4: String; const S5: String; var S6: String;
                      out S7: String);
begin
  S7 := '1' + S1 + '2' + S2 + '3' + S3 + '4' + S4 + '5' + S5 + '6' + S6;
end;

procedure Work;
var
  S: String;
begin
  S := 'S';
  MyProcedure(S, S, S, S, S, S, S);
  writeln(S);
end;

begin
  Work;
  readln;
end.
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

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

为什么要检查对象方法中的Assigned(self)?

我正在查看一些代码(Delphi 7),以下检查位于特定对象的每个方法调用的顶部:

if not Assigned(self) then
  raise Exception.CreateRes(@sAbstractError);

  { Real code for this method}
Run Code Online (Sandbox Code Playgroud)

我想这会阻止我尝试在空对象指针上调用方法.但是,一旦我尝试访问该情况下的成员数据,我会得到一个例外,对吗?

这是我以前从未见过的某种标准吗?有问题的对象来自TPersistent.

delphi delphi-7

8
推荐指数
2
解决办法
1368
查看次数

寻找Delphi 7代码来检测程序是否以管理员权限启动?

我正在寻找工作(显然)Delphi 7代码,所以我可以检查我的程序是否以管理员权限启动.

提前致谢

[---重要更新---]

到目前为止已经回答了答案中的代码,我意识到我的问题可能不是那么清楚,或者至少是不完整的:

  • 我想知道我的Delphi 7程序是否以"运行管理员"复选框设置启动.

  • 换句话说:我想知道我的Delphi 7程序是否可以在c:\ Program Files ...文件夹中创建/更新文件.

只是检查你是否拥有管理员权限是不够的.

delphi uac elevation delphi-7

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

Delphi messagebox出现在其他表单后面

我正在使用下面的代码在Delphi 7中创建一个消息框.但是我在屏幕上还有另一个表单FormStyle设置为fsStayOnTop,并且消息框出现在此表单后面.

有没有办法强制消息框出现在前面?

    if Application.MessageBox('Amessage here','Title', +MB_APPLMODAL + MB_ICONQUESTION + MB_YESNO) = IDNO then
Run Code Online (Sandbox Code Playgroud)

delphi messagebox delphi-7

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

计算渐变颜色的最快方法?

我正在制作与渐变相关的一小部分类型/功能,以备将来使用.我想确保至少有两个过程:ColorBetween和ColorsBetween.我可能想要在任意两种颜色(ColorsBetween)之间获得一个TColor数组,我可能只需要知道两种颜色之间百分比的一个颜色值(ColorBetween).

我已经在下面完成了它.除此之外,我有两个核心问题:

  1. 如何按给定百分比计算每个RGB通道的中间颜色?(见下文所示[???])
  2. 什么是最快的方法来完成我正在做的事情(同时保持两个不同的功能)?

这是代码:

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  StrUtils, StdCtrls, Math;

type
  TColorArray = array of TColor;

implementation

function ColorsBetween(const ColorA, ColorB: TColor; const Count: Integer): TColorArray;
var
  X: Integer; //Loop counter
begin
  SetLength(Result, Count);
  for X:= 0 to Count - 1 do 
    Result[X]:= ColorBetween(ColorA, ColorB, Round((X / Count) * 100)); //Correct?
end;

function ColorBetween(const ColorA, ColorB: TColor; const Percent: Single): TColor;
var
  R1, G1, B1: Byte;
  R2, G2, B2: Byte;
begin
  R1:= …
Run Code Online (Sandbox Code Playgroud)

delphi graphics gradient colors delphi-7

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

如何创建一个Child进程取决于它的父进程?

我的应用程序(main.exe)正在执行子进程(child.exe)使用ShellExecuteEx.

但是当我关闭或杀死(通过Process-Explorer)main.exe时,子进程仍然处于活动状态.

main.exe终止child.exe终止时,如何优雅地处理它?

delphi delphi-7

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

单元路径编译为可执行文件

我注意到在编译的exe中有第三方组件单元的硬编码路径.例如,如果我在编译的可执行文件中使用VirtualTrees组件TVirtualStringTree,我可以多次找到此路径:

C:\Program Files\Borland\Delphi7\Source\Virtual Treeview\Source\VirtualTrees.pas
Run Code Online (Sandbox Code Playgroud)

这适用于我使用的几乎所有第三方组件,exe中组件单元的路径.我认为这些信息不应该是可执行的,但是不知道我需要在Delphi 7设置或项目设置中更改什么来摆脱它.有人有解决方案吗?

delphi delphi-7

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