我正在使用Delphi 2009 VCL TProgressBar作为一种"空/满"仪表.
在Vista上,启用Aero主题后,会有一个与之关联的动画,这对于测量仪来说很烦人且不合适.
是否有任何方法可以禁用此功能(不是通过调整用户的主题设置!)来阻止此控件上的动画?
为了澄清,我想要的东西基本上与Windows资源管理器中的"磁盘空间使用"仪表完全相同.没有动画,但仍然有漂亮的边框和阴影效果.
更新:
我知道我需要一个"米",而不是一个真正的进度条.如何使用标准的Windows进度条控件实现主题仪表?
我想做一些我想做的事情.我有一些很大的形式,需要一些时间来创建.为了使应用程序加载速度更快,我想让表单在主窗体的OnCreate事件中创建的线程中创建.该线程有一个TApplication类型的FApplication字段,它显然是Application变量.我用它来创建线程上的表单,但即使我尝试过
FApplication.CreateForm (TfrmXXX, frmXXX)
Run Code Online (Sandbox Code Playgroud)
和
frmXXX := TFrmXXX.Create(FApplication)
Run Code Online (Sandbox Code Playgroud)
表格仍未创建.这有什么解决方法吗?
提前致谢.
有没有办法从列表框中删除项目的名称而不是索引值?我想删除名为"Mouse"的项目(索引#一直在变化).
我需要组件将我的应用程序集成到Windows 7.我在谈论任务栏能够拥有进度条,按钮,文本等.
你知道的最好的是什么?
有一些程序工具,如WinSpy ++,它允许您将鼠标悬停在任何控件/组件的句柄上,并返回该句柄的类名.因此,例如,如果我在Delphi表单上删除TMemo并编译应用程序,如果我使用WinSpy ++并在应用程序上方(在备忘录上方),它将显示编辑器的类名称为TMemo.
现在,假设我不希望任何人使用这样的程序来确定我在我的应用程序中使用的组件,我如何防止类名显示在工具中,例如WinSpy ++?
我问,因为我不希望任何人轻易创建我可能创建和发布的任何应用程序的克隆,如果我正在使用的组件的类名被发现,它将使他们的任务更容易,因为他们知道要使用什么.
简单地说,如何从外部查看器工具(如WinSpy ++)隐藏我在Delphi应用程序中使用的VCL的类名.
WinSpy ++可以在这里找到:http://www.catch22.net/software/winspy
要添加,我知道我可以自定义派生这些组件来将类名更改为我自己的,但它们必须是一种更简单的方法.
一些背景(TLabel和TGroupbox Captions Flicker on Resize的延续):
对于这种"插件"类型的应用程序,我似乎遇到了很多新问题(但很棒的学习经历).
因此,我目前的努力是尝试使用一个插件,该插件不会插入到TTabSheet中,但会在表单上直接调整大小并对齐.
由于这可以更容易用图片解释:
现在我可以手动进行对齐和调整大小,但我宁愿让VCL对齐程序(alClient,alTop等)为我做.这样我就不必考虑在其表单上设置插件对齐.
在查看VCL源代码后,我开始逐步调整对齐代码及其调用方式.基本上,当TControl获得WM_RESIZE时,它将:
所以我的思维过程是,如果我创建一个新的TWinControl,将它的句柄设置为插件窗体(窗口)句柄,并将其插入FControls列表中,并正确对齐它应该为我工作.
我当然在这里,所以它失败了.我甚至在退出应用程序时获得了一个关于无效窗口句柄的AV.我的猜测是我创建的TWinControl试图释放不再存在的插件窗体(窗口)的句柄.
我尝试过的:
procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
NewWinControl : TWinControl;
begin
NewWinControl := TWinControl.Create(frmMain);
NewWinControl.WindowHandle := AHandle;
NewWinControl.Align := Align;
NewWinControl.Width := frmMain.ClientWidth;
NewWinControl.Height := 30;
NewWinControl.Parent := frmMain;
end;
procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
NewWinControl : TWinControl;
begin
NewWinControl := TWinControl.Create(frmMain);
NewWinControl.WindowHandle …Run Code Online (Sandbox Code Playgroud) 我想要一个按钮上方的弹出菜单:

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) 不久,我的问题是,当有大量内存空闲时,为什么WinAPI RegisterClass会失败ERROR_NOT_ENOUGH_MEMORY,我该怎么做才能阻止它呢?
背景: 我正在开发一个应用程序(WinSCP FTP/SFTP客户端),许多人使用它来自动执行文件传输.有些是从Windows Scheduler每天每分钟运行一次.
我收到很多报告,经过一定数量的运行后,应用程序停止工作.触发问题的运行次数似乎并不准确,但它在数万甚至数十万的范围内.此外,似乎只有在Windows Scheduler下运行时才会出现问题,而不是在常规Windows会话中运行时.虽然我无法100%确认这一点.
此外,所有报告似乎都适用于Windows 2008 R2 +一些适用于Windows 7.同样,这可能只是巧合.
我自己能够在Windows 7上重现该问题.一旦系统进入此状态,我的应用程序就不再在Scheduler的会话中启动.但它在正常的常规会话中开始很好.而且一些其他应用程序(不一定全部)甚至在Scheduler的会话中启动.同样在这种状态下我无法调试应用程序,因为它甚至在调试器(或Process Monitor等工具)运行时都没有加载.
该应用程序使用Embarcadero(前Borland)C++ Builder VCL库.它在VCL初始化代码中崩溃(我WinMain甚至没有启动)并退出代码3.检查初始化代码正在做什么,我可能能够识别触发崩溃的代码(尽管它可能只是众多可能的代码之一)原因).
罪魁祸首似乎是RegisterClass返回8(ERROR_NOT_ENOUGH_MEMORY)的WinAPI函数.发生这种情况时,VCL代码会抛出异常; 并且因为还没有异常处理程序,它会崩溃应用程序.
我使用在VS 2012中开发的非常简单的C++控制台应用程序验证了这一点(将问题与C++ Builder和VCL隔离开来).核心代码是:
SetLastError(ERROR_SUCCESS);
fout << L"Registering class" << std::endl;
WNDCLASS WndClass;
memset(&WndClass, 0, sizeof(WndClass));
WndClass.lpfnWndProc = &DefWindowProc;
WndClass.lpszClassName = L"TestClass";
WndClass.hInstance = GetModuleHandle(NULL);
ATOM Atom = RegisterClass(&WndClass);
DWORD Error = GetLastError();
// The Atom is NULL and Error is ERROR_NOT_ENOUGH_MEMORY here
Run Code Online (Sandbox Code Playgroud)
(测试应用程序的完整代码在最后)
尽管有错误,但它似乎不是内存问题.通过在RegisterClass调用之前和之后分配10 MB内存来验证的内容(可以在最后的完整测试代码中看到).
绝望,我甚至偷看了Wine的实施 …
在Firemonkey中,我们可以使用TShadowEffect来绘制漂亮的阴影.
此阴影还会调整其不透明度和半透明度,以便在控件重叠时显示其下方的正确组件.
没有TShadowEffect:

使用TShadowEffect:

有没有办法在VCL表单中绘制相同的阴影效果而不嵌入FMX表单?
我正在使用C++ Builder XE7并遇到一个奇怪的问题.我需要一个大约1500像素的表格高度.问题是对象检查器不允许我指定大于1096像素的值.如果我设置任何更大的值,它将自动设置为1096 ..任何现有或新的表单上都存在问题.我使用的是Windows 7,屏幕分辨率为1920x1080.
vcl ×10
delphi ×9
winapi ×2
aero ×1
c++ ×1
c++builder ×1
class ×1
delphi-2007 ×1
delphi-xe ×1
delphi-xe7 ×1
firemonkey ×1
forms ×1
handle ×1
listbox ×1
popupmenu ×1
progress-bar ×1
spy ×1
windows ×1
windows-7 ×1