小编And*_*rew的帖子

如何将我发布的属性放入Object Inspector的指定类别?

我有自己的视觉组件.它有许多已发布的属性和事件.我希望它们在设计时显示在Object Inspector的指定标准类别中(Visual,Layout,Drag Drop/Docking,Linkage等).

现在我的所有属性都在杂项类别中.

delphi properties categories delphi-2010

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

InnoSetup:是否可以打开我的自定义Delphi表单(来自DLL)而不是标准设置向导

我需要使用自己的组件(有点OneClick安装程序)创建一个复杂的表单,并将其用作标准InnoSetup向导的替代品.可能吗?

我的表单被放入DLL,这个DLL将可用于InnoSetup进程.

这就是我试图这样做的方式:

Delphi DLL代码

library OneClickWizard;

uses
  SysUtils,
  Classes,
  Wizard in 'Wizard.pas' {FormWizard};

{$R *.res}

exports
  CreateWizardForm,
  DestroyWizardForm;

begin
end.
Run Code Online (Sandbox Code Playgroud)

德尔福形式

unit Wizard;

interface

type
  TFormWizard = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormWizard: TFormWizard;

procedure CreateWizardForm(AppHandle: THandle); stdcall;
procedure DestroyWizardForm; stdcall;

implementation

{$R *.dfm}

procedure CreateWizardForm(AppHandle: THandle);
begin
  Application.Handle := AppHandle;
  FormWizard := TFormWizard.Create(Application);
  FormWizard.Show;
  FormWizard.Refresh;
end;

procedure DestroyWizardForm;
begin
  FormWizard.Free;
end;
Run Code Online (Sandbox Code Playgroud)

InnoSetup脚本(iss)

[Setup]
;Disable all of the default wizard pages …
Run Code Online (Sandbox Code Playgroud)

forms delphi dll inno-setup wizard

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

我可以以编程方式设置ComboBox下拉列表的位置吗?

普通的Windows ComboBox(csDropDowncsDropDownList样式)将在其下方打开其下拉列表,如果下方没有空格,则在组合上方打开.我可以控制此列表的位置(至少按Y坐标)吗?

delphi combobox position drop-down-menu

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

Delphi:如何以请求的宽度和行数绘制一些文本,并以省略号结尾?

我需要在具有固定宽度(以像素为单位)和固定数量的文本行的表格单元格中绘制一些文本。如果文本被单元格矩形剪裁,则它必须以省略号结尾。问题是我无法正确计算文本矩形(或者 TextRect/DrawText 过程无法正常工作,我不确定)。

我尝试使用这种计算文本矩形的方法:

var
  TextRect: TRect;
  tm: TEXTMETRIC;
...
GetTextMetrics(Canvas.Handle, tm);
TextLineHeight := tm.tmHeight + tm.tmExternalLeading;

TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines;
Canvas.TextRect(TextRect, 'some long long long text',
  [tfTop, tfLeft, tfEndEllipsis, tfWordBreak]);
Run Code Online (Sandbox Code Playgroud)

裁剪矩形已正确计算,但省略号未出现。

当我将剪切矩形的高度减少 1 个像素时出现省略号:

TextRect.Bottom := TextRect.Top + TextLineHeight * NumberOfLines - 1;
Run Code Online (Sandbox Code Playgroud)

但是我的文本底线的一些像素被剪掉了。

如何正确地做到这一点?

delphi drawing text ellipsis drawtext

4
推荐指数
1
解决办法
6538
查看次数

在TFrame表面上绘制最安全,最正确的方法是什么?

我的项目(TFrame后代)有一个框架,想在上面画一些东西.

正如我在论坛上看到的那样,常见的方法是覆盖PaintWindow方法.

我在一个干净的项目上试过这个:

type
  TMyFrame = class(TFrame)
  private
    FCanvas: TCanvas;
  protected
    procedure PaintWindow(DC: HDC); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy(); override;
  end;

implementation

{$R *.dfm}

constructor TMyFrame.Create(AOwner: TComponent);
begin
  inherited;
  FCanvas := TCanvas.Create();
end;

destructor TMyFrame.Destroy();
begin
  FCanvas.Free();
  inherited;
end;

procedure TMyFrame.PaintWindow(DC: HDC);
begin
  inherited;
  FCanvas.Handle := DC;
  FCanvas.Pen.Width := 3;
  FCanvas.Pen.Color := clRed;
  FCanvas.MoveTo(0, 0);
  FCanvas.LineTo(ClientWidth, ClientHeight);
  FCanvas.Pen.Color := clGreen;
  FCanvas.MoveTo(ClientWidth, 0);
  FCanvas.LineTo(0, ClientHeight);
end;
Run Code Online (Sandbox Code Playgroud)

但是,在将我的框架放在主窗体上之后,调试器从未进入此方法,直到我启用DoubleBuffered了框架的属性.任何值都ParentBackground不会影响结果.

覆盖 …

delphi paint frame delphi-xe

4
推荐指数
1
解决办法
3097
查看次数

如何计算Windows区域(HRGN)的面积(以像素为单位)?

获取任意Windows区域的最快方法是什么?

我知道我可以枚举边界矩形的所有点并调用PtInRegion()函数但看起来不是很快.也许你知道一些更快的方法?

delphi winapi area region

4
推荐指数
1
解决办法
1459
查看次数

如何监控OmniThreadLibrary中的Pipeline阶段?

是否有可能以某种方式监控管道任务?我试图像这样为每个任务添加监视器

FPipeline := Parallel.Pipeline()
  .Stage(StageWorker1, Parallel.TaskConfig.MonitorWith(MyMonitor))
     .NumTasks(MaxReadThreadCount)
  .Stage(StageWorker2, Parallel.TaskConfig.MonitorWith(MyMonitor))
  .Run();
Run Code Online (Sandbox Code Playgroud)

但获得异常"任务只能用一个监视器监视"(据我所知,这是因为已经为管道阶段安装了内部隐藏监视器).

delphi omnithreadlibrary delphi-xe4

4
推荐指数
1
解决办法
328
查看次数

如何正确地将资源(*.res)文件添加到包中?

我在单个.dpk文件中设置了自己的Delphi组件.我的一个组件需要一些图像随其一起分发.我创建了RES文件(让它成为"MyImages.RES"),我希望我的可视组件在创建时加载其内容.

如何正确地将此RES文件添加到DPK?

当我将{$ R'MyImages.RES'}放入我的.dpk文件时,TResourceStream在创建时失败,因为它无法按资源名称找到我的图片:

constructor TMyComponent.Create(AOwner: TComponent);
begin
  S := TResourceStream.Create(HInstance, 'MY_PICTURE1', RT_RCDATA);
Run Code Online (Sandbox Code Playgroud)

RES文件由此RC创建:

MY_PICTURE1 RCDATA "my_picture1.png"
Run Code Online (Sandbox Code Playgroud)

delphi resources components image

3
推荐指数
1
解决办法
3298
查看次数

如何在TImage上正确显示带alpha通道的TBitmap?

我有一个TBitmap,其中包含带alpha通道的半透明图像(在本例中我是从TPngImage获得的).

var
  SourceBitmap: TBitmap;
  PngImage: TPngImage;
begin
  PngImage := TPngImage.Create();
  SourceBitmap := TBitmap.Create();
  try
    PngImage.LoadFromFile('ImgSmallTransparent.png');
    SourceBitmap.Assign(PngImage);
    SourceBitmap.SaveToFile('TestIn.bmp');
    imgSource.Picture.Assign(SourceBitmap);
  finally
    PngImage.Free();
    SourceBitmap.Free();
  end;
Run Code Online (Sandbox Code Playgroud)

当我将此TBitmap保存到TestIn.bmp文件并使用任何图像查看器打开它时,我可以看到透明度.但是当我将它分配给TImage时,透明像素显示为黑色(TImage有Transparent = True).

如何在TImage上正确显示具有透明度的TBitmap?

delphi gdi timage tbitmap

3
推荐指数
1
解决办法
6043
查看次数

将监视器设置为dll中的任务时出现错误"只能使用单个监视器监视任务"

我在我的dll中使用OmniThreadLibrary 2.09,主应用程序和dll使用相同的SimpleShareMem内存管理器.

我用这段代码创建了自己的监视器:

  FMonitor: TOmniEventMonitor;
  ...
  FMonitor := TOmniEventMonitor.Create(nil);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此监视器创建新任务时,我收到错误"只能使用单个监视器监视任务"

FTask := OtlTaskControl.CreateTask(TaskWorker)
  .OnMessage(
    procedure(const ATaskControl: IOmniTaskControl; const AMsg: TOmniMessage)
    begin
      ...
    end)
  .MonitorWith(FMonitor)  //  <----- Error
  .OnTerminated(
    procedure (const ATaskControl: IOmniTaskControl)
    begin
      ...
    end)
  .Run();
Run Code Online (Sandbox Code Playgroud)

如何使用自己的显示器监控我的任务?

delphi dll omnithreadlibrary delphi-xe4

3
推荐指数
1
解决办法
153
查看次数