我有自己的视觉组件.它有许多已发布的属性和事件.我希望它们在设计时显示在Object Inspector的指定标准类别中(Visual,Layout,Drag Drop/Docking,Linkage等).
现在我的所有属性都在杂项类别中.
我需要使用自己的组件(有点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) 普通的Windows ComboBox(csDropDown或csDropDownList样式)将在其下方打开其下拉列表,如果下方没有空格,则在组合上方打开.我可以控制此列表的位置(至少按Y坐标)吗?
我需要在具有固定宽度(以像素为单位)和固定数量的文本行的表格单元格中绘制一些文本。如果文本被单元格矩形剪裁,则它必须以省略号结尾。问题是我无法正确计算文本矩形(或者 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)
但是我的文本底线的一些像素被剪掉了。
如何正确地做到这一点?
我的项目(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不会影响结果.
覆盖 …
获取任意Windows区域的最快方法是什么?
我知道我可以枚举边界矩形的所有点并调用PtInRegion()函数但看起来不是很快.也许你知道一些更快的方法?
是否有可能以某种方式监控管道任务?我试图像这样为每个任务添加监视器
FPipeline := Parallel.Pipeline()
.Stage(StageWorker1, Parallel.TaskConfig.MonitorWith(MyMonitor))
.NumTasks(MaxReadThreadCount)
.Stage(StageWorker2, Parallel.TaskConfig.MonitorWith(MyMonitor))
.Run();
Run Code Online (Sandbox Code Playgroud)
但获得异常"任务只能用一个监视器监视"(据我所知,这是因为已经为管道阶段安装了内部隐藏监视器).
我在单个.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) 我有一个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?
我在我的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 ×10
delphi-xe4 ×2
dll ×2
area ×1
categories ×1
combobox ×1
components ×1
delphi-2010 ×1
delphi-xe ×1
drawing ×1
drawtext ×1
ellipsis ×1
forms ×1
frame ×1
gdi ×1
image ×1
inno-setup ×1
paint ×1
position ×1
properties ×1
region ×1
resources ×1
tbitmap ×1
text ×1
timage ×1
winapi ×1
wizard ×1