我正在编写一个Delphi 7应用程序,它需要同时从许多不同的线程访问同一个SQL Server数据库.
我可以使用单个共享TADOConnection,还是每个线程都必须创建自己的?
我正在使用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)上运行此应用程序.
我怎样才能做到这一点 ?
感谢帮助:)
我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.
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中的过程和字符串时遇到了问题.事实是我希望看到输出字符串"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 7),以下检查位于特定对象的每个方法调用的顶部:
if not Assigned(self) then
raise Exception.CreateRes(@sAbstractError);
{ Real code for this method}
Run Code Online (Sandbox Code Playgroud)
我想这会阻止我尝试在空对象指针上调用方法.但是,一旦我尝试访问该情况下的成员数据,我会得到一个例外,对吗?
这是我以前从未见过的某种标准吗?有问题的对象来自TPersistent.
我正在寻找工作(显然)Delphi 7代码,所以我可以检查我的程序是否以管理员权限启动.
提前致谢
[---重要更新---]
到目前为止已经回答了答案中的代码,我意识到我的问题可能不是那么清楚,或者至少是不完整的:
我想知道我的Delphi 7程序是否以"运行管理员"复选框设置启动.
换句话说:我想知道我的Delphi 7程序是否可以在c:\ Program Files ...文件夹中创建/更新文件.
只是检查你是否拥有管理员权限是不够的.
我正在使用下面的代码在Delphi 7中创建一个消息框.但是我在屏幕上还有另一个表单FormStyle设置为fsStayOnTop,并且消息框出现在此表单后面.
有没有办法强制消息框出现在前面?
if Application.MessageBox('Amessage here','Title', +MB_APPLMODAL + MB_ICONQUESTION + MB_YESNO) = IDNO then
Run Code Online (Sandbox Code Playgroud) 我正在制作与渐变相关的一小部分类型/功能,以备将来使用.我想确保至少有两个过程:ColorBetween和ColorsBetween.我可能想要在任意两种颜色(ColorsBetween)之间获得一个TColor数组,我可能只需要知道两种颜色之间百分比的一个颜色值(ColorBetween).
我已经在下面完成了它.除此之外,我有两个核心问题:
[???])这是代码:
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) 我的应用程序(main.exe)正在执行子进程(child.exe)使用ShellExecuteEx.
但是当我关闭或杀死(通过Process-Explorer)main.exe时,子进程仍然处于活动状态.
当main.exe终止child.exe终止时,如何优雅地处理它?
我注意到在编译的exe中有第三方组件单元的硬编码路径.例如,如果我在编译的可执行文件中使用VirtualTrees组件TVirtualStringTree,我可以多次找到此路径:
C:\Program Files\Borland\Delphi7\Source\Virtual Treeview\Source\VirtualTrees.pas
Run Code Online (Sandbox Code Playgroud)
这适用于我使用的几乎所有第三方组件,exe中组件单元的路径.我认为这些信息不应该是可执行的,但是不知道我需要在Delphi 7设置或项目设置中更改什么来摆脱它.有人有解决方案吗?