可以在Delphi 5中用自定义值声明枚举吗?
type
MyEnum = (meVal1 = 1, meVal2 = 3); // compiler error
Run Code Online (Sandbox Code Playgroud)
谢谢!
我一直试图让我的应用程序中的一些无模式窗体出现在任务栏上 - 利用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中没有?
我有一个使用的自定义组件ParentFont.
在构建组件的过程中,我可以看到组件的字体最初设置为默认值MS Sans Serif:
constructor TCustomWidget.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
end;
Run Code Online (Sandbox Code Playgroud)
检查节目 Self.Font.Name: 'MS Sans Serif'
一段时间后,我的组件的字体被更新以反映父母的字体:
TReader.ReadComponent(nil)
SetCompName
TControl.SetParentComponent
TControl.SetParent
TWinControl.InsertControl
AControl.Perform(CM_PARENTFONTCHANGED, 0, 0);
Run Code Online (Sandbox Code Playgroud)
之后一切都很棒,我的组件字体已经更改为父级字体(例如`MS Shell Dlg 2').
问题是我的孩子控件没有与父母的字体(即我的组件)保持同步.
在我的组件构造函数中,我创建了子控件:
constructor TCustomWidget.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
CreateComponents;
end;
procedure TCustomWidget.CreateComponents;
begin
...
FpnlBottom := TPanel.Create(Self);
FpnlBottom.Caption := '';
FpnlBottom.Parent := Self;
FpnlBottom.Align := alBottom;
FpnlBottom.Height := 46;
FpnlBottom.ParentFont := True;
...
end;
Run Code Online (Sandbox Code Playgroud)
最初我FpnlBottom的默认字体也是MS Sans Serif.
后来,当我的组件的字体已经更新到其父母的字体(如MS …
这是我的代码:
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
implementation
uses ActiveX;
procedure TForm1.Button1Click(Sender: TObject); // method 1
var
HtmlFile: string;
begin
HtmlFile := ExtractFilePath(Application.ExeName) + 'test.html';
WebBrowser1.Navigate(HtmlFile);
end;
procedure LoadHtml(wb: TWebBrowser; HTMLStr: string);
var
aStream: TMemoryStream;
begin
wb.Navigate('about:blank'); // reset the webbrowser
while wb.ReadyState < READYSTATE_INTERACTIVE do // wait to load the empty page
Application.ProcessMessages;
if Assigned(wb.Document) then
begin
aStream := TMemoryStream.Create;
try
aStream.WriteBuffer(Pointer(HTMLStr)^, Length(HTMLStr));
aStream.Seek(0, soFromBeginning);
(wb.Document as IPersistStreamInit).Load(TStreamAdapter.Create(aStream)); …Run Code Online (Sandbox Code Playgroud) delphi webbrowser-control delphi-5 flashplayer-10 twebbrowser
这里(或多或少)是一个相关的问题:Delphi - 在运行时使用图标填充图像列表'破坏'透明度.
我测试了@TOndrej的答案.但似乎我需要启用视觉样式(XP Manifest)才能工作(将使用版本6.0的Windows常用控件 - 我现在不想要).我通过ExtractIconEx和运行时添加图标ImageList_AddIcon.
显然,设置ImageList.Handle使用系统图像列表手柄,并不需要XP清单.因此,当我使用系统图像列表显示文件列表(带有a TListView)时,即使是我在D3中写回的旧程序也正确显示alpha混合图标.
我在徘徊系统图像列表有什么特别之处以及它是如何创建的,所以它在所有情况下都支持alpha混合?我无法弄明白.以下是一些示例代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ImgList, StdCtrls, ShellAPI, ExtCtrls, Commctrl;
type
TForm1 = class(TForm)
ImageList1: TImageList;
PopupMenu1: TPopupMenu;
MenuItem1: TMenuItem;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FileName: string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// {$R WindowsXP.res} …Run Code Online (Sandbox Code Playgroud) Delphi是否在对象完全构造之前分配了一个实例变量?
换句话说,给定一个变量:
var
customer: TCustomer = nil;
Run Code Online (Sandbox Code Playgroud)
然后我们构建一个客户并将其分配给变量:
customer := TCustomer.Create;
Run Code Online (Sandbox Code Playgroud)
是否可能customer不是nil,但不是指向完全构造TCustomer?
执行延迟初始化时,这会成为一个问题:
function SacrifialCustomer: TCustomer;
begin
if (customer = nil) then
begin
criticalSection.Enter;
try
customer := TCustomer.Create;
finally
criticalSection.Leave;
end;
end;
Result := customer;
end;
Run Code Online (Sandbox Code Playgroud)
错误在于:
if (customer = nil)
Run Code Online (Sandbox Code Playgroud)
另一个线程可能会调用:
customer := TCustomer.Create;
Run Code Online (Sandbox Code Playgroud)
并且在构造发生之前为变量赋值.这会导致线程假定这customer是一个有效的对象,因为该变量已分配.
这个多线程单例错误可以在Delphi(5)中发生吗?
奖金问题
Delphi 是否有可接受的,线程安全的一次性初始化设计模式?许多人通过覆盖而在德尔福实施了单身人士 ; 他们的实现将在多个线程中失败.NewInstanceFreeInstance
严格来说,我不是在回答如何实现和单例,而是懒惰初始化.虽然单例可以使用延迟初始化,但是懒惰初始化不限于单例.
更新 …
我正在修复一个ZIP库类.在内部,几乎所有ZIP实现都使用DEFLATE压缩(RFC1951).
问题是,在Delphi中,我无法访问任何DEFLATE压缩库.但我们做的一件事就是ZLIB压缩代码(RFC1950).它甚至还附带Delphi,还有其他六种实现方式.
在内部,ZLIB也使用DEFLATE进行压缩.所以我想做每个人都做过的事情 - 使用Delphi zlib库来实现其DEFLATE压缩功能.
问题是ZLIB在DEFLATED数据中添加了一个2字节的前缀和4字节的尾部:
[CMF] 1 byte
[FLG] 1 byte
[...deflate compressed data...]
[Adler-32 checksum] 4 bytes
Run Code Online (Sandbox Code Playgroud)
所以我需要的是一种使用标准TCompressionStream(或者TZCompressionStream,或者,TZCompressionStreamEx取决于您使用的源代码)流来压缩数据的方法:
procedure CompressDataToTargetStream(sourceStream: TStream; targetStream: TStream);
var
compressor: TCompressionStream;
begin
compressor := TCompressionStream.Create(clDefault, targetStream); //clDefault = CompressionLevel
try
compressor.CopyFrom(sourceStream, sourceStream.Length)
finally
compressor.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这是有效的,除了它写出前导2字节和尾随4字节; 我需要去除那些.
所以我写了一篇TByteEaterStream:
TByteEaterStream = class(TStream)
public
constructor Create(TargetStream: TStream;
LeadingBytesToEat, TrailingBytesToEat: Integer); …Run Code Online (Sandbox Code Playgroud) 在我的课堂上,我需要使用静态变量(static int next_id在C ++中;
我用
private
class var next_id: Integer;
Run Code Online (Sandbox Code Playgroud)
我得到错误:PROCEDURE or FUNCTION expected。如何用Delphi 5声明一些变量?
我有这个代码,有一个使用重载和默认参数的过程:
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
procedure Foo; overload; // not actually needed to reproduce
begin
end;
procedure Foo(const a: array of string; b: Boolean=False); overload;
begin
Writeln(Length(a));
end;
begin
Foo(['1', '2', '3']); // => 1 ???
Foo(['1', '2', '3'], False); // => 3 OK
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
输出是:
1
3
Run Code Online (Sandbox Code Playgroud)
请注意,第一次调用 Foo不提供默认值。为什么会这样?这个问题只与非常旧的编译器有关吗?
这仅在使用overload密钥时发生。
procedure Foo2(const a: array of string; b: Boolean=False);
begin
Writeln(Length(a));
end;
Foo2(['1', '2', '3']);
Run Code Online (Sandbox Code Playgroud)
工作正常。
delphi ×10
delphi-5 ×10
bde ×1
components ×1
deflate ×1
delphi-7 ×1
enums ×1
fonts ×1
imagelist ×1
lazy-loading ×1
static ×1
stream ×1
taskbar ×1
twebbrowser ×1
windows-10 ×1
windows-7 ×1
zlib ×1