2011-12-19 14 views
7

से स्रोत लिखने योग्य स्रोत बनाना क्या डेल्फी आईडीई के भीतर से पठनीय स्रोत कोड (उदाहरण के लिए, .pas & .dfm) लिखना संभव है? आईडीई के भीतर फ़ाइलों को पढ़ने/लिखने योग्य बनाने के लिए राइट क्लिक विकल्प फ़ाइल सिस्टम पर गुणों को नहीं बदलता है। क्या कोई आईडीई एक्सटेंशन या समान है जो इसे प्राप्त कर सकता है?डेल्फी आईडीई

स्रोत नियंत्रण प्रणाली को एकीकृत किए बिना ऐसा करने का एक तरीका बेहतर होगा। मैं डेल्फी एक्सई और डेल्फी का उपयोग कर रहा हूं 6.

धन्यवाद!

SSE

उत्तर

8

यह मैं कैसे करना होता है यह।

एक नया पैकेज बनाएं जो डिजाइन समय पर आईडीई में स्थापित किया जाएगा। यदि आपके पास एक मौजूदा पैकेज आसान है तो आप इसका उपयोग कर सकते हैं। सुनिश्चित करें कि पैकेज requiresdesignide पैकेज। आप इसे प्रोजेक्ट मैनेजर में या केवल प्रोजेक्ट स्रोत देखकर designide को requires क्लॉज में जोड़कर कर सकते हैं।

अब अपने पैकेज में निम्न इकाई जोड़ें।

unit MakeEditable; 

interface 

procedure Register; 

implementation 

uses 
    Windows, SysUtils, Menus, ToolsAPI; 

type 
    TMakeEditable = class(TObject) 
    private 
    FEditorServices: IOTAEditorServices; 
    FFileMenu: TMenuItem; 
    FMakeEditable: TMenuItem; 
    function MenuItemWithCaptionLike(const Menu: TMenuItem; const DesiredCaption: string): TMenuItem; 
    procedure MakeEditableClick(Sender: TObject); 
    public 
    constructor Create; 
    destructor Destroy; override; 
    end; 

constructor TMakeEditable.Create; 
var 
    Index: Integer; 
    PreviousMenuItem: TMenuItem; 
begin 
    inherited; 
    FEditorServices := (BorlandIDEServices as IOTAEditorServices); 
    FFileMenu := MenuItemWithCaptionLike((BorlandIDEServices as INTAServices40).MainMenu.Items, 'File'); 
    if Assigned(FFileMenu) then begin 
    PreviousMenuItem := MenuItemWithCaptionLike(FFileMenu, 'Reopen'); 
    if Assigned(PreviousMenuItem) then begin 
     Index := PreviousMenuItem.MenuIndex; 
     if Index>=0 then begin 
     FMakeEditable := TMenuItem.Create(FFileMenu); 
     FMakeEditable.Caption := 'Ma&ke Editable'; 
     FMakeEditable.OnClick := MakeEditableClick; 
     FFileMenu.Insert(Index, FMakeEditable); 
     end; 
    end; 
    end; 
end; 

destructor TMakeEditable.Destroy; 
begin 
    FMakeEditable.Free; 
    inherited; 
end; 

function TMakeEditable.MenuItemWithCaptionLike(const Menu: TMenuItem; const DesiredCaption: string): TMenuItem; 
var 
    i: Integer; 
    Target, Found: string; 
begin 
    Target := StringReplace(LowerCase(Trim(DesiredCaption)), '&', '', [rfReplaceAll, rfIgnoreCase]); 
    for i := 0 to Menu.Count-1 do begin 
    Result := Menu.Items[i]; 
    Found := StringReplace(LowerCase(Trim(Result.Caption)), '&', '', [rfReplaceAll, rfIgnoreCase]); 
    if Pos(Target, Found)>0 then begin 
     exit; 
    end; 
    end; 
    Result := nil; 
end; 

procedure TMakeEditable.MakeEditableClick(Sender: TObject); 

    procedure MakeFileEditable(const FileName: string); 
    var 
    Attributes: DWORD; 
    begin 
    Attributes := GetFileAttributes(PChar(FileName)); 
    SetFileAttributes(PChar(FileName), Attributes and not FILE_ATTRIBUTE_READONLY); 
    end; 

var 
    FileName: string; 
    FileExt: string; 
    LinkedFileName: string; 
    EditBuffer: IOTAEditBuffer; 

begin 
    EditBuffer := FEditorServices.TopBuffer; 
    FileName := EditBuffer.FileName; 
    if FileExists(FileName) then begin 
    MakeFileEditable(FileName); 
    EditBuffer.IsReadOnly := False; 

    FileExt := ExtractFileExt(FileName); 
    if SameText(FileExt,'.dfm') then begin 
     LinkedFileName := ChangeFileExt(FileName, '.pas'); 
    end else if SameText(FileExt,'.pas') then begin 
     LinkedFileName := ChangeFileExt(FileName, '.dfm'); 
    end else begin 
     LinkedFileName := ''; 
    end; 
    if (LinkedFileName<>'') and FileExists(LinkedFileName) then begin 
     MakeFileEditable(LinkedFileName); 
    end; 
    end; 
end; 

var 
    MakeEditableInstance: TMakeEditable; 

procedure Register; 
begin 
    MakeEditableInstance := TMakeEditable.Create; 
end; 

initialization 

finalization 
    MakeEditableInstance.Free; 

end. 

जब आप संकलन और इस पैकेज तुम अब फ़ाइल मेनू जो दोनों इनपुट बफर में केवल पढ़ने के लिए ध्वज को साफ करता है और फ़ाइल लिखने योग्य बनाता है पर एक नया मेनू आइटम होगा स्थापित करें।

enter image description here

+2

+1 के लिए +1, आईडीई मेनू के साथ पैकेज बनाने का तरीका दिखाने का यह एक अच्छा तरीका है :) –

+0

वास्तव में अच्छा समाधान डेविड, धन्यवाद! – sse

+0

+1। मुख्य प्रोग्राम/पैकेज फ़ाइल को संभालने के लिए .dpr और .dpk फ़ाइल जांच भी जोड़ें। और यहां आपको .dproj और .res फ़ाइलों के लिए आरओ विशेषता भी बदलनी चाहिए। – Larsdk

3

आप उपकरण सूची एक .bat फ़ाइल कॉल कर सकते हैं। तो आप अपने लिए काम करने के लिए .bat फ़ाइल लिख सकते हैं, और इसे पैरामीटर के रूप में $ EDNAME के ​​साथ कॉल कर सकते हैं। आपकी .bat फ़ाइल को फ़ाइल नाम को% 1 के रूप में देखना चाहिए। तो आपको केवल पढ़ने के लिए ध्वज (attrib कमांड?) को बदलने के लिए थोड़ा सा तर्क चाहिए और फिर देखें कि कोई .dfm है और वह भी करता है।

यदि आप .bat फ़ाइलों के साथ सहज नहीं हैं, तो आप यह भी करने के लिए डेल्फी कमांड-लाइन ऐप भी कर सकते हैं (स्पष्ट रूप से)।

इस लेख है कि एक .bat फ़ाइल का उपयोग करने के लिए कैसे SVN डेल्फी उपकरण मेनू के साथ आदेशों को एकीकृत करने के बारे में बात करती से प्रेरित यह विचार: http://delphi.wikia.com/wiki/Adding_TortoiseSVN_to_the_Tools_menu

+0

जब तक आप एक पैकेज मैं कोई रास्ता नहीं संपादक की केवल झंडा –

+0

ऑप्स सवाल बदलने के बारे में था पढ़ा टॉगल करने के लिए के बारे में पता से यह कर रीड-ओनली डिस्क फ़ाइल, नहीं संपादक पर विशेषता। –

+0

और व्यक्तिगत अनुभव से एक दूसरे के बिना संतोषजनक नहीं है। –

0

एक और विचार: "खुला: बस उपकरण मेनू के लिए एक विकल्प जोड़ने कमांड प्रॉम्प्ट यहाँ "। यह आपको कमांड लाइन से सभी प्रकार की चीजें करने देता है, जैसे अट्रिब कमांड चला रहा है।

उपकरण मेनू में एक नई प्रविष्टि जोड़ें, और इन सेटिंग्स का उपयोग:

Title: Open Command Prompt Here 
Program: cmd.exe 
Working Dir (leave blank) 
Parameters: cd $PATH($EDNAME) 
इसके अलावा

, अपने आप को एक "ओपन फ़ोल्डर यहां" बनाने प्रविष्टि:

Title: Open Folder Here 
Program: explorer.exe 
Working Dir (leave blank) 
Parameters: $PATH($EDNAME) 
संबंधित मुद्दे