delphi – 从RES文件加载图标后用作默认图标的错误图标
发布时间:2020-12-15 09:32:50 所属栏目:大数据 来源:网络整理
导读:我正在尝试创建一个自定义组件,当鼠标移过它时显示一个图标. 我正在加载这样的图标: UNIT Test;constructor TTestPath.Create(aOwner: TComponent);VAR myIcon: TIcon;begin inherited Create(aOwner); ImgList:= TImageList.Create(Self); myicon := TIcon
我正在尝试创建一个自定义组件,当鼠标移过它时显示一个图标.
我正在加载这样的图标: 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添加到我的测试应用程序的USES原因中,应用程序的图标(红色delphi头盔)就会被“FOLDER”图标替换. 更新: 这里有什么问题: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. 解决方法
由于Embarcadero的相当混乱的决定,图标资源在链接时按字母顺序排序. Windows规则是shell用于可执行文件的图标是第一个图标. Delphi VCL代码假定应用程序图标名为“MAINICON”.
将这些要求放在一起,您可以推断出所有图标必须具有按字母顺序出现在“MAINICON”之后的名称. 这很令人沮丧,但很容易解决.为您的图标采用合适的命名约定,一切都将按照您的意图行事. 为什么Embarcadero不改变他们的代码以确保首先发出名为’MAINICON’的图标超出我的原因.或者安排应用程序图标被定义为第一个,因此遵循平台的规则.但是我们无能为力. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |