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

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 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下,代码类似,它们都编译得很好.
编辑:谢谢你的帮助.更改可分配的类型化常量指令后,我可以在两个项目中获得一致的行为.我今天学了些新东西...
如何检测我的应用程序是否在IDE"Delphi 2007 .Net"下运行,有类似DebugHook的东西吗?
再见.
我们目前正在将Delphi 2007项目转换为Delphi 2010.我们已经在使用Unicode(通过WideStrings和TNT Unicode控件).
我期望将所有Wide函数(例如WideUpperCase)替换为等效的,例如UpperCase,但它们的工作方式不同.例如,WideUpperCase与UpperCase的工作方式不同.WideUpperCase正确地改变了Campañas,但是UpperCase以小写形式留下了ñ.
我应该注意哪些其他差异?例如,WideFormat和Format的工作原理是一样的吗?
谢谢
我应该用什么列表类型来存储枚举值?我已尝试使用TObjectList,我强制转换为TObject以添加值,但在从列表中读取时无法将其强制转换为枚举.
你用什么列表来存储枚举?
如果我理解正确,请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) 我试图找到一种安全/确定的方法来释放封装在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)
这个解决方案是安全的还是我忽略了一个更好的解决方案?
我正在使用CodeGear RAD Studio IDE.
为了使用命令行参数测试我的应用程序,我在"运行 - >参数"菜单中使用了几次"参数"字段.
但每次我提供新值时,都无法从"下拉框"中删除它.
我需要清理这个字段(擦除所有值),因为在某些情况下有关于它们的信息,我不想与偶尔可能使用我的机器的人分享.
我该如何清理这个字段?
对于我在Stack Overflow上的第一个问题,我不得不问你关于我在Delphi 2007上遇到的这个问题(我知道它已经老了,但我们不能总是选择我们编写的代码;)).
在我的项目启动时,IDE总是从我的项目中打开一组表单.
例如,让我们进行一个项目,其中有50个表单.每次打开项目时,IDE都会打开其中一些表单(它们总是相同的).我的问题是:在选项中是否有一个列表,您可以在启动时将表单列表自动在Delphi中打开?我一直在寻找关于这个的5个不同的论坛,我从来没有找到任何东西.这是某种配置吗?
我在使用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 ×10
delphi-2007 ×10
com ×1
delphi-2010 ×1
delphi.net ×1
detect ×1
enums ×1
finalization ×1
ide ×1
list ×1
popupmenu ×1
stream ×1
timage ×1
unicode ×1
vcl ×1
widestring ×1