标签: delphi-5

如何在Delphi中没有MainForm?

我一直试图让我的应用程序中的一些无模式窗体出现在任务栏上 - 利用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 taskbar delphi-5 windows-7

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

如何让TSpeedButton荣耀Windows主题?

我有一个旧应用程序(Delphi 5),我想给它一些更改.

我为它设置了一个清单,但是速度按钮不遵循Windows主题.我该怎么办?

delphi delphi-5 windows-themes

5
推荐指数
3
解决办法
664
查看次数

主线程被阻止时显示活动指示符(继续)

继续上一个问题 我希望即使主线程被阻止也能显示一些活动指示.(基于这篇文章).

基于附加代码的问题:

  • 使用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 multithreading thread-safety delphi-5

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

如何声明Int64常量?

我试图在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等值的146959810393466560370x14650FB0739D0383:

在此输入图像描述

那是不对的.

因此,当我看到一个16位十六进制值,未设置高位时,我认为它可以适合64位有符号整数.

实际上,十六进制等价物14695981039346656037是......别的东西.罗布,你是对的!(大概)

delphi constants delphi-7 delphi-5 int64

5
推荐指数
3
解决办法
3938
查看次数

如何获得运行可执行文件的版本?

我怎样才能获得正在运行的应用程序的版本?


我一直在使用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组的成员). …

versioning delphi resources winapi delphi-5

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

DCC32编译器配置文件和命令行参数优先级

我正在尝试使用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)

我有以下疑问:

  1. 如果未提及配置文件的详细信息,则它将从project.cfg(由IDE创建)中自动进行设置?
  2. 如果是,那么如果我在命令行中提到了-U,-N选项,那么它将覆盖.cfg ile中的所有设置?
  3. 这个问题听起来很愚蠢,但想知道在IDE上通过命令行进行编译有什么用?

请提供一些帮助解决我的疑问。任何与dcc32编译选项有关的信息将不胜感激。

delphi delphi-5 dcc32

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

如何克服条件定义的255个字符限制?

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个字符限制?


当然,问题是如何拥有项目级别定义,同时拥有共享源代码文件(共享文件位于项目文件夹之外的自己的目录中).

delphi delphi-5

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

Delphi 5组件会自动将"db.pas"单元添加到uses子句中吗?

我正在编写自己的组件,我希望它"db"interface使用子句时将其添加到表单中,因为它有一个已发布的事件,如:

TMyDBEvent = procedure(Sender: TObject; DataSet: TDataSet) of object;
Run Code Online (Sandbox Code Playgroud)

TDataSet声明db.pas,我需要手动添加此单位,我想避免.

我见过这个解决方案:

将组件添加到表单时,如何自动添加Delphi单元?

还有这个:

我可以制作一个自定义Delphi组件,将多个单元添加到uses子句中吗?

这个用途RegisterSelectionEditor,但Delphi 5(我知道......)似乎没有这个单元.

我有什么选择?

delphi delphi-5 toolsapi

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

Delphi:构造不调用重写的虚拟构造函数

我有一个例子的后代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)

delphi virtual constructor delphi-5

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

如何在D5/D7中处理PByte指针操作(运算符不适用于此操作数类型)

我正在尝试将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)

delphi delphi-7 delphi-5

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