标签: delphi-2007

你如何排列TPopupMenu,使其准确定位在按钮上方?

我想要一个按钮上方的弹出菜单:

在此输入图像描述

Delphi包装Win32菜单系统的方式似乎排除了基础Win32 API提供的当天不在VCL作者大脑中的每个模式或标志.一个这样的例子似乎是TPM_BOTTOMALIGN可以传递到的TrackPopupMenu但是,Delphi包装似乎使得这不仅不能在库存VCL中,而且通过不明智地使用私有和受保护的方法,是不可能的(至少在我看来是不可能的) )在运行时或通过覆盖准确地执行.VCL组件TPopupMenu的设计也不是很好,因为它应该有一个调用的虚拟方法PrepareForTrackPopupMenu除了调用TrackPopupMenuor 之外还执行其他操作TrackPopupMenuEx,然后允许某人覆盖实际调用该Win32方法的方法.但现在已经太晚了.也许Delphi XE5将完成对Win32 API的基本覆盖.

我试过的方法:

方法A:使用METRICS或字体:

准确地确定弹出菜单的高度,以便在调用popupmenu.Popup(x,y)之前减去Y值.结果:必须处理Windows主题的所有变体,并做出我似乎无法确定的假设.似乎不太可能在现实世界中取得好成绩.以下是基本字体度量方法的示例:

   height := aPopupMenu.items.count * (abs(font.height) + 6) + 34;
Run Code Online (Sandbox Code Playgroud)

您可以考虑隐藏的项目,对于单个主题模式设置的单个版本的窗口,您可能会接近这样,但不完全正确.

方法B:让Windows执行:

尝试传入TPM_BOTTOMALIGN最终到达Win32 API调用TrackPopupMenu.

到目前为止,我想我可以做到,如果我修改VCL菜单.我在这个项目中使用Delphi 2007.尽管如此,我对这个想法并不是那么开心.

这是我正在尝试的那种代码:

procedure TMyForm.ButtonClick(Sender: TObject);
var
  pt:TPoint;
  popupMenuHeightEstimate:Integer;
begin
   // alas, how to do this accurately, what with themes, and the OnMeasureItem event
   // changing things at runtime.
      popupMenuHeightEstimate := PopupMenuHeight(BookingsPopupMenu); 

      pt.X := 0;
      pt.Y := -1*popupMenuHeightEstimate;
      pt := aButton.ClientToScreen(pt);  // do …
Run Code Online (Sandbox Code Playgroud)

delphi vcl popupmenu delphi-2007

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

*有时*在Delphi中分配常量时会出错

我正在使用Delphi 2007包含所有补丁和更新.

我有一个文件,由两个不同的项目使用.在该文件中是一个过程,我将简化如下:

procedure MyProcedure;
const
  UniqueValue: integer = 0;
begin
  //some code
  Inc(UniqueValue);
  //some more code
end;
Run Code Online (Sandbox Code Playgroud)

Inc()命令应该失败,因为您无法分配常量.在一个项目中,我得到了一个错误(我将该项目称为"准确").在另一个项目中,我没有任何错误(我称之为"Bogus").我也没有收到任何警告.我无法弄清楚为什么编译器会通过这个错误的代码.

这是我在项目Bogus中尝试的内容:

1 - 引入一个明显的错误,比如在一行中键入"slkdjflskdjf"

结果:我收到一个错误,证明它确实正在尝试编译此文件.

2 - 删除.DCU,然后重建项目

结果:重新生成.DCU,再次证明项目真正编译了这个错误的代码.

有没有人想过为什么会发生这种行为?更具体地说,为什么它会出现在一个项目而不是另一个项目?是否有一些模糊的编译器选项允许分配常量?

最后一点说明:这两个项目都是从Delphi 5转换而来的.在Delphi 5下,代码类似,它们都编译得很好.

编辑:谢谢你的帮助.更改可分配的类型化常量指令后,我可以在两个项目中获得一致的行为.我今天学了些新东西...

delphi delphi-2007

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

检测我的应用程序是否在IDE"Delphi 2007 .Net"下运行

如何检测我的应用程序是否在IDE"Delphi 2007 .Net"下运行,有类似DebugHook的东西吗?

再见.

delphi delphi.net delphi-2007

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

Delphi 2010广泛的功能与字符串功能

我们目前正在将Delphi 2007项目转换为Delphi 2010.我们已经在使用Unicode(通过WideStrings和TNT Unicode控件).

我期望将所有Wide函数(例如WideUpperCase)替换为等效的,例如UpperCase,但它们的工作方式不同.例如,WideUpperCase与UpperCase的工作方式不同.WideUpperCase正确地改变了Campañas,但是UpperCase以小写形式留下了ñ.

我应该注意哪些其他差异?例如,WideFormat和Format的工作原理是一样的吗?

谢谢

delphi unicode delphi-2007 widestring delphi-2010

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

用于存储枚举的列表类?

我应该用什么列表类型来存储枚举值?我已尝试使用TObjectList,我强制转换为TObject以添加值,但在从列表中读取时无法将其强制转换为枚举.

你用什么列表来存储枚举?

delphi enums list delphi-2007

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

如何将BLOB流中的任意图像加载到TImage中?

如果我理解正确,请TImage.LoadFromFile从文件扩展名确定图片类型.

有没有办法从TBlobStream原始图像中自动检测图像类型?

我目前的代码:

procedure LoadImageFromStream(AImage: TImage; ADataSet: TDataSet);
var
  Stream: TStream;
begin
  Stream := ADataSet.CreateBlobStream(Field, bmRead);
  try
    AImage.Picture.Graphic.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end
Run Code Online (Sandbox Code Playgroud)

delphi timage stream detect delphi-2007

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

在OleVariant后面释放界面的正确方法是什么?

我试图找到一种安全/确定的方法来释放封装在OleVariant中的接口.

AFAICS Delphi在程序结束时发布接口引用,但在我的情况下我必须提前完成,因为我必须关闭COM.

procedure Test;
var
  LLibrary: OleVariant;
begin
  CoInitialize(nil);
  try
    LLibrary := Null;
    try
      LLibrary := CreateOleObject(LibraryName);
    finally
      LLibrary := Unassigned; // <-- I would like to release the interface here
    end;
  finally
    CoUninitialize; // <-- Shutdown of COM
  end;
end; // <-- The compiler releases the interface here
Run Code Online (Sandbox Code Playgroud)

我把OleVariant放在一个额外的类实例中,我可以在调用之前释放它CoUninitialize.

procedure Test;
var
  Container: TLibraryContainer; // Holds the OleVariant
begin
  CoInitialize(nil);
  try
    Container := TLibraryContainer.Create;
    try
      {...}
    finally
      Container.Free;
    end;
  finally
    CoUninitialize;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这个解决方案是安全的还是我忽略了一个更好的解决方案?

delphi com finalization delphi-2007

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

如何清除"运行" - >"参数"菜单中的"参数"字段?

我正在使用CodeGear RAD Studio IDE.

为了使用命令行参数测试我的应用程序,我在"运行 - >参数"菜单中使用了几次"参数"字段.

但每次我提供新值时,都无法从"下拉框"中删除它.

我需要清理这个字段(擦除所有值),因为在某些情况下有关于它们的信息,我不想与偶尔可能使用我的机器的人分享.

我该如何清理这个字段?

ide delphi delphi-2007

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

如何在Delphi IDE启动时停止打开表单

对于我在Stack Overflow上的第一个问题,我不得不问你关于我在Delphi 2007上遇到的这个问题(我知道它已经老了,但我们不能总是选择我们编写的代码;)).

在我的项目启动时,IDE总是从我的项目中打开一组表单.

例如,让我们进行一个项目,其中有50个表单.每次打开项目时,IDE都会打开其中一些表单(它们总是相同的).我的问题是:在选项中是否有一个列表,您可以在启动时将表单列表自动在Delphi中打开?我一直在寻找关于这个的5个不同的论坛,我从来没有找到任何东西.这是某种配置吗?

delphi delphi-2007

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

在创建/恢复表单时,重叠的TCustomControl对象不按顺序绘制

我在使用Delust 2007中获得TCustomControl处理透明度时遇到了问题.我目前已将问题减少到下面的代码中.问题是,在最初创建表单时,控件的绘制顺序与它们添加到表单的顺序相反.调整表单大小后,它们会以正确的顺序绘制.我究竟做错了什么?排除第三方解决方案是否有更合适的路径?

调整窗口大小后,示例程序的屏幕截图

这是我的示例项目,展示了Delphi 2007中的问题.

unit Main;

interface

uses
  Forms, Classes, Controls, StdCtrls, Messages,
  ExtCtrls;

type
  // Example of a TWinControl derived control
  TMyCustomControl = class(TCustomControl)
  protected
    procedure CreateParams(var params: TCreateParams); override;
    procedure WMEraseBkGnd(var msg: TWMEraseBkGnd);
      message WM_ERASEBKGND;
    procedure Paint; override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    YellowBox: TMyCustomControl;
    GreenBox: TMyCustomControl;
  end;

var
  Form1: TForm1;

implementation

uses
  Windows, Graphics;

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  self.OnPaint := FormPaint;

  GreenBox := TMyCustomControl.Create(self);
  GreenBox.Parent …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007

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