2016-10-09 9 views
5

मुझे लगता है कि एक आइकन जब माउस इस पर ले जाया जाता है पता चलता एक कस्टम घटक बनाने के लिए कोशिश कर रहा हूँ से प्रतीक लोड करने के बाद डिफ़ॉल्ट आइकन के रूप में इस्तेमाल किया। मैं इस तरह प्रतीक लोड हो रहा हूँ:गलत आइकन एक आरईएस फ़ाइल

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 जोड़ने के रूप में 'फ़ोल्डर की जगह है 'आइकन।

अद्यतन:
EXE फ़ाइल में माउस इस क्रम में हैं: 'फ़ोल्डर', Default_Delphi_icon तो, TTestPath के आइकन एप्लिकेशन का आइकन से पहले exe में जोड़ा जाता है।

यहाँ क्या गलत है: तथ्य यह है कि 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. 
+3

डेल्फी एक 'MAINICON' संसाधन नाम जो पहले आइकन है से मुख्य आइकन का उपयोग करता है। चिह्न नाम वर्णमाला द्वारा क्रमबद्ध हैं। यदि आप अपना अन्य आइकन उदा। 'X_FOLDER' इसे काम करना चाहिए। – kobik

+0

अजीब है कि exe में सभी चिह्न 'एन' (या उच्च चरित्र) के साथ शुरू किया जाना चाहिए :) लेकिन मुझे लगता है कि कोशिश करेंगे। धन्यवाद। – Ampere

+0

लेकिन क्या 'फ़ोल्डर' EXE में एक सुलभ आइकन के रूप में मौजूद होना चाहिए? – Ampere

उत्तर

7

Embarcadero से एक नहीं बल्कि में गड़बड़ निर्णय के कारण, आइकन संसाधनों वर्णानुक्रम जब जुड़ा हुआ हल कर रहे हैं। विंडोज नियम यह है कि निष्पादन योग्य के लिए खोल द्वारा उपयोग किया जाने वाला आइकन पहला आइकन है। डेल्फी वीसीएल कोड मानता है कि एप्लिकेशन आइकन का नाम 'MAINICON' है।

एक साथ इन आवश्यकताओं को रखो और आप अपने सभी प्रतीक मान सकते हैं ऐसे नाम हैं जो वर्णमाला के क्रम में 'MAINICON' के बाद प्रकट होना आवश्यक है।

यह बल्कि निराशा होती है, लेकिन आसान हल करने के लिए काफी है। अपने आइकन के लिए उपयुक्त नामकरण सम्मेलन को अपनाना और सब कुछ आपके इरादे से व्यवहार करेगा।

काफी क्यों Embarcadero यह सुनिश्चित करने के लिए अपना कोड नहीं बदलता है कि 'MAINICON' नामक आइकन पहले से बाहर है। या व्यवस्थित करें कि एप्लिकेशन आइकन को पहले व्यक्ति के रूप में परिभाषित किया गया है, और इस प्रकार प्लेटफॉर्म के नियमों का पालन करें। लेकिन ऐसा कुछ भी नहीं है जिसे हम कर सकते हैं।

+0

मुझे लगता है कि एक नोटर विकल्प डेल्फी के मुख्य आइकन का उपयोग नहीं करना है। और अपनी खुद की संसाधन फ़ाइल से लिंक करें। – kobik

+0

@ कोबिक मुझे लगता है कि डेल्फी लिंकर आपके द्वारा प्रदान किए जाने वाले सभी आइकन लेता है और फिर उनके नामों से टाइप करता है। मैं खुद डेल्फी मुख्य आइकन का उपयोग नहीं करता हूं और अपने सभी आइकनों को एक res फ़ाइल में आपूर्ति करता हूं। लेकिन डेल्फी उन्हें निष्पादन योग्य आईआईआरसी में आदेश देते हैं। –

+0

@ कोबिक - यह प्रबंधित करने में मुश्किल समस्या नहीं है। समाधान उपलब्ध हैं (अपने आइकन का नाम बदलें, डेल्फी के मुख्य आइकन का उपयोग न करें)। समस्या इस मुद्दे के बारे में ज्ञान है। एक बार आपके पास ज्ञान हो ... :) :) – Ampere

संबंधित मुद्दे