我正在尝试创建一个自定义组件,当鼠标移到它上面时会显示一个图标。 我正在加载这样的图标:
UNIT Test;
constructor TTestPath.Create(aOwner: TComponent);
VAR myIcon: TIcon;
begin
inherited Create(aOwner);
ImgList:= TImageList.Create(Self);
myicon := TIcon.Create;
TRY
myicon.LoadFromResourceName(HInstance, 'FOLDER'); <------ this becomes application's icon!
ImgList.AddIcon(myicon);
FINALLY
FreeAndNil(myicon);
end;
问题是,只要我将Test.pas添加到我的测试应用程序的使用原因中,应用程序的图标(红色delphi头盔)就会被“FOLDER”替换为“FOLDER&#39;图标。
更新:
EXE文件中的图标按以下顺序排列:&#39; FOLDER&#39;,Default_Delphi_icon
因此,TTestPath的图标被添加到exe BEFORE应用程序的图标中。
这里有什么问题:TTestPath的图标在EXE文件中以这种方式出现,或者它是在应用程序(默认)图标之前放置的事实?
以下控制代码:
UNIT test;
INTERFACE
USES
System.SysUtils, Winapi.Windows, System.Classes, Vcl.StdCtrls, Vcl.Controls, Vcl.Graphics, vcl.imglist, Vcl.ExtCtrls; {$WARN GARBAGE OFF} {Silent the: 'W1011 Text after final END' warning }
TYPE
TValidity= (vaNone, vaValid, vaInvalid); { Normal / Green / Red color }
TInputType= (itFile, itFolder); { What kind of path will the user type in this control: folder or file }
TTestPath = class(TCustomGroupBox)
private
edtPath : TButtonedEdit;
btnApply : TButton;
btnExplore : TButton;
FInputType : TInputType;
imgList : TImageList;
FShowApplyBtn: Boolean;
protected
public
constructor Create(aOwner: TComponent); override;
published
property Align;
property Anchors;
property BiDiMode;
property Caption;
property Color;
property Constraints;
property Ctl3D;
property DockSite;
property DoubleBuffered;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property Padding;
property ParentBackground default True;
property ParentBiDiMode;
property ParentColor;
property ParentCtl3D;
property ParentDoubleBuffered;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Touch;
property Visible;
property StyleElements;
property OnAlignInsertBefore;
property OnAlignPosition;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDockDrop;
property OnDockOver;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGesture;
property OnGetSiteInfo;
property OnMouseActivate;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
property OnUnDock;
end;
procedure Register;
IMPLEMENTATION {$R cPathEdit.res}
USES cIO;
constructor TTestPath.Create(aOwner: TComponent);
VAR myIcon: TIcon;
begin
inherited Create(aOwner);
Caption := 'Folder';
Height:= 41;
FShowApplyBtn:= TRUE;
ImgList:= TImageList.Create(Self); { Freed by Self }
myicon := TIcon.Create;
TRY
myicon.LoadFromResourceName(HInstance, 'FOLDER');
ImgList.AddIcon(myicon);
myicon.LoadFromResourceName(HInstance, 'FOLDER_OPEN');
ImgList.AddIcon(myicon);
FINALLY
FreeAndNil(myicon);
end;
edtPath:= TButtonedEdit.Create(Self);
WITH edtPath DO
begin
Parent := Self;
Align := alClient;
Margins.Left := 1;
Margins.Top := 2;
Margins.Right := 1;
Margins.Bottom := 1;
AlignWithMargins := TRUE;
Images := imgList;
TabOrder := 0 ;
OnChange := nil;
RightButton.Hint := 'Browse for a folder';
RightButton.ImageIndex:= 0;
RightButton.HotImageIndex:= 1;
RightButton.Visible := TRUE;
OnRightButtonClick := nil;
OnKeyPress := nil;
end;
btnExplore:= TButton.Create(Self);
WITH btnExplore DO
begin
Parent := Self;
Align := alRight;
Width := 22;
Margins.Left := 1;
Margins.Top := 1;
Margins.Right := 1;
Margins.Bottom := 1;
AlignWithMargins := TRUE;
Caption := '^';
TabOrder := 1;
Hint := 'Open this folder in Windows Explorer';
OnClick := nil;
end;
btnApply:= TButton.Create(Self);
WITH btnApply DO
begin
Parent := Self;
Align := alRight;
Width := 38;
Margins.Left := 1;
Margins.Top := 1;
Margins.Right := 1;
Margins.Bottom := 1;
AlignWithMargins := TRUE;
Hint := 'Create folder if necessary';
Caption := 'Apply';
TabOrder := 2;
OnClick := nil;
end;
FInputType:= itFolder;
end;
procedure Register;
begin
RegisterComponents('xxx', [TTestPath]);
end;
end.
测试应用:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, Forms,
test; <-------- this
type
TForm1 = class(TForm)
private
public
end;
var
Form1: TForm1;
IMPLEMENTATION
{$R *.dfm}
end.
答案 0 :(得分:7)
由于Embarcadero的相当混乱的决定,图标资源在链接时按字母顺序排序。 Windows规则是shell用于可执行文件的图标是第一个图标。 Delphi VCL代码假定应用程序图标名为'MAINICON'
。
将这些要求放在一起,您可以推断出所有图标必须具有按字母顺序排在'MAINICON'
之后的名称。
这很令人沮丧,但很容易解决。为您的图标采用合适的命名约定,一切都将按照您的意图行事。
为什么Embarcadero不会更改他们的代码以确保首先发出名为'MAINICON'
的图标超出我的原因。或者安排应用程序图标被定义为第一个,因此遵循平台的规则。但是我们无能为力。