标签: delphi-5

在Delphi中使用自定义值进行枚举

可以在Delphi 5中用自定义值声明枚举吗?

type
  MyEnum = (meVal1 = 1, meVal2 = 3); // compiler error
Run Code Online (Sandbox Code Playgroud)

谢谢!

delphi enums delphi-5

5
推荐指数
2
解决办法
2290
查看次数

如何在Delphi中没有MainForm?

我一直试图让我的应用程序中的一些无模式窗体出现在任务栏上 - 利用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中没有?

也可以看看

delphi taskbar delphi-5 windows-7

5
推荐指数
2
解决办法
6256
查看次数

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 …

delphi fonts components delphi-5

5
推荐指数
1
解决办法
4141
查看次数

TWebBrowser与嵌入式Youtube剪辑崩溃

这是我的代码:

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

5
推荐指数
2
解决办法
3185
查看次数

带有alpha混合图标的图像列表失去透明度

这里(或多或少)是一个相关的问题: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 imagelist delphi-7 delphi-5 common-controls

5
推荐指数
1
解决办法
3667
查看次数

Delphi是否在构造对象之前分配变量?

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

严格来说,我不是在回答如何实现和单例,而是懒惰初始化.虽然单例可以使用延迟初始化,但是懒惰初始化不限于单例.

更新 …

delphi lazy-loading delphi-5

5
推荐指数
3
解决办法
1395
查看次数

如何吃流出流的字节?

我正在修复一个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)

delphi zlib stream deflate delphi-5

5
推荐指数
2
解决办法
977
查看次数

安装Windows 10的Delphi 5

我试图在Windows 10上安装Delphi 5,但是在配置BDE时挂起。

我在具有管理员权限的其他目录中尝试过。

我也尝试过兼容模式。

如果有人知道,我非常感谢!

此图片是错误的

delphi bde delphi-5 windows-10

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

Delphi静态变量

在我的课堂上,我需要使用静态变量(static int next_id在C ++中;

我用

private
    class var next_id: Integer;
Run Code Online (Sandbox Code Playgroud)

我得到错误:PROCEDURE or FUNCTION expected。如何用Delphi 5声明一些变量?

delphi static delphi-5

5
推荐指数
2
解决办法
3921
查看次数

使用带有默认参数和重载过程的字符串数组

我有这个代码,有一个使用重载和默认参数的过程:

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 delphi-5

5
推荐指数
1
解决办法
1201
查看次数