2016-10-09 64 views
5

Fare üzerine taşındığında bir simge gösteren özel bir bileşen oluşturmaya çalışıyorum. böyle simgeleri yükleme ediyorum:Hatalı simge, bir RES dosyasından simgeleri yükledikten sonra varsayılan simge olarak kullanıldı

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; 

şey en kısa sürede benim test uygulaması, uygulamanın simgesi (kırmızı Delphi kask) ait KULLANIMLARI nedenine Test.pas ekledikçe 'KLASÖR yerini olmasıdır 'simgesi.

Güncelleme:
EXE dosyasına simgeleri şu sırada şunlardır: 'KLASÖR', Default_Delphi_icon Yani, TTestPath simgesini uygulamanın simgesine ÖNCE exe eklenir.

Burada sorun nedir: TTestPath'in simgesi EXE dosyasında bu şekilde mevcut olması veya uygulamanın (varsayılan) simgesinden önce yerleştirilmiş olması gerçeği? Aşağıda


denetimin kodu:

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. 

Testi uygulaması: bağlandığında ne

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. 
+3

Delphi, ana simgeyi ilk simge olan bir "MAINICON" kaynak adından kullanır. Simge adları alfabeye göre sıralanır. Diğer simgenizi ör. X_FOLDER işe yaramalı. – kobik

+0

Tekil tüm simgeleri 'N' (ya da daha yüksek bir karakter) ile başlamalıdır ZORUNLU :) Ama bunu deneyeceğim. Teşekkürler. – Ampere

+0

Ancak 'FOLDER', EXE'de erişilebilir bir simge olarak mevcut olmalı? – Ampere

cevap

7

nedeniyle Embarcadero dan oldukça berbat kararı, simge kaynakları alfabetik olarak sıralanır. Windows kuralı, bir yürütülebilir dosya için kabuk tarafından kullanılan simgenin ilk simgedir. Delphi VCL kodu, uygulama simgesinin 'MAINICON' olarak adlandırıldığını varsayar.

Bu gereksinimleri bir araya getirdiğinizde, tüm simgelerinizin alfabetik sırada 'MAINICON''dan sonra görünen adlara sahip olması gerekir.

Oldukça sinir bozucu ama etrafta çalışmak için yeterince kolay. Simgeleriniz için uygun bir adlandırma kuralı benimseyin ve her şey niyetiniz gibi davranacaktır.

Embarcadero'nun neden kodu ilk önce 'MAINICON' adlı simgenin yayımlandığından emin olmak için değiştirilmemesinden ötürü, tam olarak benim için değil. Ya da uygulama ikonunun ilk olanı tanımlamasını ve böylece platformun kurallarını takip etmesini sağlayın. Ama yapabileceğimiz bir şey yok.

+0

Sanırım bir seçenek seçeneği Delphi'nin ana simgesini kullanmamaktır. ve kendi kaynak dosyama bağlantı verin. – kobik

+0

@kobik Bence Delphi linker, sağladığınız tüm simgeleri alır ve isimlerine göre sıralar. Delphi ana ikonunu kendim kullanmıyorum ve tüm ikonlarımı bir res dosyasına gönderiyorum. Ancak Delphi bunları çalıştırılabilir IIRC'de sipariş ediyor. –

+0

@kobik - Yönetilmesi zor bir problem değil. Çözümler mevcuttur (simgelerinizi yeniden adlandırın, delphi'nin ana simgesini kullanmayın). Sorun, bu konu hakkında bilgidir. Bilgi sahibi olduktan sonra ...... :) :) – Ampere