我一直试图让我的应用程序中的一些无模式窗体出现在任务栏上 - 利用Windows 7中新的有用任务栏.
在任务栏上存在表单之前,VCL有许多问题需要撤消.
但最后一个问题是,最小化VCL指定主窗体的形式会导致应用程序中的所有窗口消失.
十年前,Peter Below(TeamB)记录了这些问题,并尝试解决这些问题.但是有些问题无法解决.这些问题在VCL本身内部如此深入,实际上不可能使Delphi应用程序正常运行.
这一切都源于您在工具栏上看到的按钮不代表应用程序窗口的事实; 它代表了TApplications窗口,它是隐藏的,从未见过.然后是应用程序MainForm,然后充满了特殊的能力,如果它被最小化,那么它指示应用程序隐藏自己.
在我看来,如果我能做到的话
Application.MainForm := nil;
Run Code Online (Sandbox Code Playgroud)
然后所有这些错误都会消失.应用程序可以有其隐藏的窗口,同时我将覆盖应用程序中的所有其他表单,包括我的主窗体,其中:
procedure TForm2.CreateParams(var params: TCreateParams );
begin
inherited CreateParams(params);
params.ExStyle := params.ExStyle or WS_EX_APPWINDOW;
end;
Run Code Online (Sandbox Code Playgroud)
但在Delphi中,该Application.MainForm属性是只读的.
我怎么能MainForm在Delphi中没有?
我有一个旧应用程序(Delphi 5),我想给它一些更改.
我为它设置了一个清单,但是速度按钮不遵循Windows主题.我该怎么办?
继续上一个问题 我希望即使主线程被阻止也能显示一些活动指示.(基于这篇文章).
基于附加代码的问题:
Synchronize(PaintTargetWindow);不会绘制窗口Canvas does not allow drawing.在行中:{FBitmap.}StretchDraw(Rect(Left, ImageRect.Top, Right, ImageRect.Bottom), FfgPattern)这是我用来创建指标线程的代码:
unit AniThread;
interface
uses Windows, Classes, Graphics, Controls, Math;
const
ANI_GRAD_FG_COLOR_BAGIN = $00CDFFCD;
ANI_GRAD_FG_COLOR_END = $0024B105;
ANI_GRAD_BK_COLOR_BAGIN = $00F5F5F5;
ANI_GRAD_BK_COLOR_END = $00BDBDBD;
type
TAnimationThread = class(TThread)
private
FWnd: HWND;
FPaintRect: TRect;
FInterval: Integer;
FfgPattern, FbkPattern: TBitmap;
FBitmap: TBitmap;
FImageRect: TRect;
procedure UpdatePattern(Pattern: TBitmap; ColorBegin, ColorEnd: TColor);
function CreatePatternBitmap(AColorBegin, AColorEnd: TColor): TBitmap;
procedure PaintTargetWindow;
protected
procedure Execute; …Run Code Online (Sandbox Code Playgroud) 我试图在Delphi中定义一个常量:
const
FNV_offset_basis = 14695981039346656037;
Run Code Online (Sandbox Code Playgroud)
我得到错误:整数常数太大
注意:
14,695,981,039,346,656,037十进制等于0x14650FB0739D0383十六进制.
我怎样才能宣布这个Int64常数?
我尝试过的其他一些事情:
const
FNV_offset_basis: Int64 = 14695981039346656037;
FNV_offset_basis = Int64(14695981039346656037);
FNV_offset_basis: Int64 = Int64(14695981039346656037);
var
offset: LARGE_INTEGER;
begin
//recalculate constant every function call
offset.LowPart = $739D0383;
offset.HighPart = $14650FB0;
Run Code Online (Sandbox Code Playgroud)
更正
我的基本假设是错误的.
粘贴14695981039346656037到Windows 7计算器,并转换为十六进制,使我相信,hex等值的14695981039346656037是0x14650FB0739D0383:

那是不对的.
因此,当我看到一个16位十六进制值,未设置高位时,我认为它可以适合64位有符号整数.
实际上,十六进制等价物14695981039346656037是......别的东西.罗布,你是对的!(大概)
我怎样才能获得正在运行的应用程序的版本?
我一直在使用GetFileVersionInfo(ParamStr(0), ...):
filename := PChar(ExtractShortPathName(ParamStr(0)));
//Get the number of bytes he have to allocate for the file information structure
dwInfoLength := GetFileVersionInfoSize(lptstrFilename, {var}dwHandle);
//Get version info
GetMem(pInfoData, dwInfoLength);
GetFileVersionInfo(lptstrFilename, dwHandle, dwInfoLength, pInfoData);
//Set what information we want to extract from pInfoData
lpSubBlock := PChar(Chr(92)+Chr(0));
//Extract the desired data from pInfoData into the FileInformation structure
VerQueryValue(pInfoData, lpSubBlock, PFileInformation, LengthOfReturned);
Run Code Online (Sandbox Code Playgroud)
这种技术的问题在于它需要Windows加载器在可以读取资源之前加载图像.我使用IMAGE_FILE_NET_RUN_FROM_SWAPimage标志构建我的应用程序(以避免在繁琐的网络上出现页面内异常).
这会导致Windows加载程序再次通过网络加载整个图像,而不是仅仅查看"我".由于我在启动时检查并保存了我自己的版本,因此6秒的应用程序启动变成了10秒的应用程序启动.
我如何阅读我的版本,我正在运行的应用程序?
我会假设Windows没有API来读取正在运行的进程的版本,只有我加载的文件(如果文件不再存在,那么它无法读取任何版本信息).
但我也假设有可能从我的进程自己的内存中读取版本资源(当然不是Administrators或Debuggers组的成员). …
我正在尝试使用DCC32通过命令行首次构建我的Delphi应用程序。我对我的项目的配置文件毫不怀疑。通过IDE进行编译时,必须在项目中添加一些搜索路径。当我删除它们时,编译失败。
现在,如果我通过命令行编译它,是否需要指定配置文件详细信息或搜索路径参数?
没有任何参数:
dcc32.exe project1.dpr
Run Code Online (Sandbox Code Playgroud)
有一些参数:
dcc32.exe -u%Shared% -ND:\out project1.dpr
Run Code Online (Sandbox Code Playgroud)
我有以下疑问:
请提供一些帮助解决我的疑问。任何与dcc32编译选项有关的信息将不胜感激。
Delphi中的条件定义限制为255个字符.这意味着如果您有超过255个字符的定义,它们将被忽略.例如

所以条件定义的集合:
Win32API;AlarmServerEngineVersion27;ImNotUsingOlderSimpleThread;EnableJclExceptionTracking;SaveExceptionsToDatabase;ShowExceptionForm;SNAPIN_NEEDS_NODE_DESCRIPTOR;VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST;UseSQLServerLocking;SnapInFactoryFormClassIsOptional;Strict;SIFFCIO;Sqm
Run Code Online (Sandbox Code Playgroud)
最后3个定义被忽略.
我需要的是一种在项目中定义条件定义的方法,而不限于255个字符.
我想可能将条件定义移动到项目源文件,可能包含在include文件中:
program ConsotoManager;
{$R *.RES}
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'}
{$DEFINE Win32API}
...
{$DEFINE Sqm}
{$DEFINE Strict}
uses
FastMM4,
Windows,
SysUtils,
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用.它不起作用的原因是你不能用条件定义替换定义; 仅定义直到文件结尾的最后一个.
那么,我如何克服Delphi中条件定义的255个字符限制?
当然,问题是如何拥有项目级别定义,同时拥有共享源代码文件(共享文件位于项目文件夹之外的自己的目录中).
我正在编写自己的组件,我希望它"db"在interface使用子句时将其添加到表单中,因为它有一个已发布的事件,如:
TMyDBEvent = procedure(Sender: TObject; DataSet: TDataSet) of object;
Run Code Online (Sandbox Code Playgroud)
TDataSet声明db.pas,我需要手动添加此单位,我想避免.
我见过这个解决方案:
还有这个:
我可以制作一个自定义Delphi组件,将多个单元添加到uses子句中吗?
这个用途RegisterSelectionEditor,但Delphi 5(我知道......)似乎没有这个单元.
我有什么选择?
我有一个例子的后代TBitmap:
TMyBitmap = class(TBitmap)
public
constructor Create; override;
end;
constructor TMyBitmap.Create;
begin
inherited;
Beep;
end;
Run Code Online (Sandbox Code Playgroud)
在运行时,我构造其中一个TMyBitmap对象,将图像加载到其中,并将其放置TImage在窗体上:
procedure TForm1.Button1Click(Sender: TObject);
var
g1: TGraphic;
begin
g1 := TMyBitmap.Create;
g1.LoadFromFile('C:\...\example.bmp');
Image1.Picture.Graphic := g1;
end;
Run Code Online (Sandbox Code Playgroud)
在里面TPicture.SetGraphic你可以看到它通过构造一个新的,并调用.Assign新构建的克隆来制作图形的副本:
procedure TPicture.SetGraphic(Value: TGraphic);
var
NewGraphic: TGraphic;
begin
...
NewGraphic := TGraphicClass(Value.ClassType).Create;
NewGraphic.Assign(Value);
...
end;
Run Code Online (Sandbox Code Playgroud)
构造新图形类的行:
NewGraphic := TGraphicClass(Value.ClassType).Create;
Run Code Online (Sandbox Code Playgroud)
正确调用我的构造函数,一切都很好.
我想做类似的事情,我想克隆一个TGraphic:
procedure TForm1.Button1Click(Sender: TObject);
var
g1: TGraphic;
g2: TGraphic;
begin
g1 := TMyBitmap.Create;
g1.LoadFromFile('C:\...\example.bmp');
//Image1.Picture.Graphic := g1; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将DDetourslib 移植到Delphi 5/7.不会编译的行具有以下模式:
procedure Decode_J(PInst: PInstruction; Size: Byte);
var
Value: Int64;
VA: PByte;
begin
...
VA := PInst^.VirtualAddr + (PInst^.NextInst - PInst^.Addr) // <- compiler error
Run Code Online (Sandbox Code Playgroud)
编译错误:
[Error] InstDecode.pas(882):运算符不适用于此操作数类型
PInst^.VirtualAddr, PInst^.NextInst, PInst^.Addr都被声明为PByte(PByte = ^Byte)
我该怎么做才能解决这个问题?
编辑:
PInstruction 定义为:
TInstruction = record
Archi: Byte; { CPUX32 or CPUX64 ! }
AddrMode: Byte; { Address Mode }
Addr: PByte;
VirtualAddr: PByte;
NextInst: PByte; { Pointer to the Next Instruction }
OpCode: Byte; { OpCode Value …Run Code Online (Sandbox Code Playgroud)