首先,我要说我在Windows Vista和Windows 7中憎恶这个功能.其次,我想这样做. 这是一个问题,询问如何在WPF中执行我想要的操作.
我想做同样的事情,但在Delphi中,使用VCL库存组件,TMainMenu或Action Manager菜单,或一些可用的第三方组件,甚至Toolbar2000或其他一些库.
Windows Vista/Windows 7资源管理器主菜单的功能:
(*Windows资源管理器热键示例:Microsoft Windows资源管理器中的Ctrl + A即使菜单不可见也会选择所有菜单,Alt + T =调出工具弹出菜单,即使隐藏整个菜单也是如此).

更新:可以在此处下载使用已接受答案的演示.(HiddenMenu.zip)
我一直认为所有者负责销毁视觉控制,如果我nil作为所有者传递,我可以手动控制销毁.
请考虑以下示例:
TMyForm = class (TForm)
private
FButton : TButton;
end;
...
FButton := TButton.Create(nil); // no owner!!
FButton.Parent := Self;
Run Code Online (Sandbox Code Playgroud)
我希望这个按钮产生内存泄漏,但它没有,实际上是析构函数TButton被调用.
进一步调查显示TWinControl析构函数包含以下代码片段:
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
Run Code Online (Sandbox Code Playgroud)
看起来它正在摧毁子组件(Parent设置为控件本身的组件).
我没想到父控件会破坏控件.任何人都可以解释为什么会这样吗?如果我通过一个所有者,谁在摧毁这个物体?
我前段时间已经看到人们在Delphi XE中讨论新的多线程,以及由于Delphi实现多线程的方式,Delphi存在一些"原生"问题.他们建议使用一些外部库来替换默认的Delphi多线程.
你能指点我一些文档和Delphi XE最流行的多线程库吗?谢谢
是否有一种快速有效的方法来应用在项目中使用的全局字体?
我的意思是我想设置,在我的项目中的所有控件都将使用如特定的字体名称TButton,TEdit,TLabel等.
通常为表单而不是特定控件设置字体会将该表单上的所有控件更改为指定的字体.
但是,如果您在特定控件上手动更改了字体,那么通过表单设置字体将不再更新先前已手动更改的控件.
想法1
我正在考虑使用For循环并迭代我的Forms上的每个组件并以这种方式设置Font,例如:
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
with TForm(Self) do
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i] is TButton then
begin
TButton(Components[i]).Font.Name := 'MS Sans Serif';
TButton(Components[i]).Font.Size := 8;
TButton(Components[i]).Font.Style := [fsBold];
end;
if Components[i] is TLabel then
begin
TLabel(Components[i]).Font.Name := 'MS Sans Serif';
TLabel(Components[i]).Font.Size := 8;
TLabel(Components[i]).Font.Style := [fsBold];
end;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
但这样做看起来非常混乱,对于一个简单的任务来说,它也将是相当多的代码.
想法2
我知道我可以在设计时手动为每个控件逐个手动更改字体,但有几种形式要经过这可能需要时间,即使这样我也可能错过了一个控件.
想法3
与Idea 2类似,另一种方法可以是将表单视为文本(DFM)以及查找和替换该方式的字体.
基本上我要在我的应用程序中保持一致性,并且始终使用一个Font是我想要实现的.
我在这里错过了一些完全明显的东西,我正在尝试为这样的任务做些过分吗?
我一直想知道是否有更好的方法来编写我的一些程序,特别是那些需要很长时间才能完成的程序.
我总是运行主GUI线程中的所有东西,我现在理解并意识到这很糟糕,因为它会使应用程序无响应,Application.ProcessMessages在这里不会真正有用.
这让我觉得我需要使用TThreads进行冗长的操作,例如复制文件.这也让我想知道一些应用程序如何为您提供完全控制,例如允许您暂停,恢复或停止操作.
我正在处理的个人项目中有大约3个冗长的操作,我在其上显示一个带有TProgressBar的对话框.虽然这确实有效,但我觉得它可以做得更好.这些进度对话框可能会显示很长时间,您可能希望取消操作,然后再完成作业.
正如我所说,目前我正在运行Main Gui Thread,我是否需要使用TThreads?我不知道如何或在何处开始实施它们,因为我之前没有使用它们.如果我确实需要线程,他们提供我需要的东西,如暂停,恢复,停止操作等?
基本上我正在寻找一种更好的处理和管理冗长操作的方法.
我对Delphi代码有一些意外的访问冲突,我认为是正确的,但似乎是错误编译的.我可以减少它
procedure Run(Proc: TProc);
begin
Proc;
end;
procedure Test;
begin
Run(
procedure
var
S: PChar;
procedure Nested;
begin
Run(
procedure
begin
end);
S := 'Hello, world!';
end;
begin
Run(
procedure
begin
S := 'Hello';
end);
Nested;
ShowMessage(S);
end);
end;
Run Code Online (Sandbox Code Playgroud)
对我来说发生的S := 'Hello, world!'是存储在错误的位置.因此,会引发访问冲突,或者ShowMessage(S)显示"Hello"(有时,在释放用于实现匿名过程的对象时会引发访问冲突).
我正在使用Delphi XE,安装了所有更新.
我怎么知道这会导致问题?我知道如何重写我的代码以避免匿名程序,但我很难弄清楚它们在哪些情况下会导致错误的代码,所以我不知道在哪里避免它们.
我很有兴趣知道这是否在Delphi的更高版本中得到修复,但仅仅是有趣的,此时升级不是一个选项.
在QC上,最新的报告我可以找到类似的#91876,但这在Delphi XE中得到了解决.
更新:
基于AlexSC的评论,稍作修改:
...
procedure Nested;
begin
Run(
procedure
begin
S := S;
end);
S := 'Hello, world!';
end;
...
Run Code Online (Sandbox Code Playgroud)
确实有效.
生成的机器代码
S := 'Hello, …Run Code Online (Sandbox Code Playgroud) 在寻找替代GDI的替代方案时,我试图在Windows 7中测试Delphi的2010 TDirect2DCanvas性能.
我通过使用Direct2D绘制一条巨大的折线来测试它,结果非常慢,即使数据量少于我使用GDI进行相同测试的数量少500倍(我甚至没有在GDI中使用位图作为后备缓冲,我只是直接绘制到表单画布).
所以我想:
a) Direct2D比GDI慢;
b) TDirect2DCanvas很慢;
c)我做错了什么
,希望它是c).
我写的测试代码是:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Direct2D, D2D1;
type
TForm2 = class(TForm)
private
{ Private declarations }
FD2DCanvas: TDirect2DCanvas;
FData: array[0..50000] of TPoint;
public
procedure CreateWnd; override;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses utils;
{$R *.dfm}
procedure TForm2.CreateWnd;
var
i: Integer; …Run Code Online (Sandbox Code Playgroud) 我正在使用DUnit来测试Delphi库.我有时会遇到一些情况,我会编写几个非常相似的测试来检查函数的多个输入.
有没有办法在DUnit中编写(类似的东西)参数化测试?例如,为适当的测试程序指定输入和预期输出,然后运行测试套件并获得有关多次运行测试失败的反馈?
(编辑:一个例子)
例如,假设我有两个这样的测试:
procedure TestMyCode_WithInput2_Returns4();
var
Sut: TMyClass;
Result: Integer;
begin
// Arrange:
Sut := TMyClass.Create;
// Act:
Result := sut.DoStuff(2);
// Assert
CheckEquals(4, Result);
end;
procedure TestMyCode_WithInput3_Returns9();
var
Sut: TMyClass;
Result: Integer;
begin
// Arrange:
Sut := TMyClass.Create;
// Act:
Result := sut.DoStuff(3);
// Assert
CheckEquals(9, Result);
end;
Run Code Online (Sandbox Code Playgroud)
我可能会有更多的这些测试做同样的事情,但有不同的输入和期望.我不想将它们合并到一个测试中,因为我希望它们能够独立通过或失败.
我已经做了大约18个月的裸机TCP/IP,所以我想知道目前的技术水平是多少.
我正在寻找正面和负面两个方面,开发服务器和客户端软件.
我将做一个需要坚如磐石的TCP/IP层的项目,所以对我来说这是一个重要的方面:)
为了成为一个社区维基,我正在寻找更广泛的答案,而不仅仅是'坚如磐石'.因此,例如关于特征宽度的信息也是值得赞赏的.
我将使用答案中的相关方面更新问题,以获得具有这些库的平衡概述的Wiki条目.
例如,请参阅下面我的回答以及我过去与Indy的经历我对Indy中的异常处理和反冻结感到矛盾,虽然我已经习惯了它,但仍感觉有点不自然.
现在我用Delphi 2007(非Unicode)和XE(Unicode)开发,所以我考虑的库应该至少支持那两个Delphi版本.
在Delphi 7中,包含一个图像编辑器程序,它可以读取和写入.dcr 文件,这些文件只是.res具有不同扩展名的二进制资源文件(文件),按照惯例,它表示.dcr文件包含具有命名位图资源的编译资源.具有与组件名称对应的名称(名为TMyComponent的组件的名为TMYCOMPONENT的位图资源).这些位图是用于在delphi组件面板上放置图标的"图标",以及当您在其上放置非可视组件时,在您的表单或数据模块上放置的图标.
快进10年到Delphi XE,我正在尝试使用位图文件和RC文件制作组件图标,并将其构建到.DCR文件,作为Delphi IDE的一部分.
它应该只是在.dpk(包源)文件中添加.Rc文件和这样的声明,如下所示:
{$R mypackageicons.rc mypackageicons.dcr}
Run Code Online (Sandbox Code Playgroud)
包含组件图标的示例.rc文件:
// COMPONENT ICON RESOURCES
TMYCOMPONENT BMP "TMYCOMPONENT.BMP"
Run Code Online (Sandbox Code Playgroud)
但是,我不能让这个工作.当我尝试它时,似乎你得到了一些奇怪的RLINK32错误,并且在borlandmm.dll中崩溃了IDE:
[DCC Error] E2161 Error: RLINK32: Unsupported 16bit resource in file "C:\temp\compicon\COMPONENTICONS.rc"
[DCC Fatal Error] F2084 Internal Error: AV21515155-W06000D07-1
Run Code Online (Sandbox Code Playgroud)
有问题的位图文件是一个简单的256色bmp文件大小24x24像素,我也尝试了16色位图,没有运气.在我看来,ImageEdit程序是我所知道的唯一可用于创建Delphi组件图标的方法.
我错过了什么?
更新:对于那些无法访问Delphi 7图像编辑器的人来说,外部工具是一个不错的解决方案,实际上可能是优秀的,但我更愿意只使用Delphi附带的东西,因为它似乎是应该只使用一个{$ R}声明,一个文本文件和一个用画笔制作的bmp文件.当然,他们并没有省略制作组件图标的方法,这个非常棒的1.5千兆字节开发工具!.. update2:还有一种方法; Rudy V.发现了它.
delphi ×10
delphi-xe ×10
components ×2
delphi-2007 ×1
delphi-2010 ×1
direct2d ×1
dunit ×1
gdi ×1
menu ×1
ownership ×1
tcp ×1
wiki ×1