2011-10-24 5 views
1

왜 이것이 옵션 세트로 변경 가능한 것이 아닌지 확실하지 않습니다. 그렇다면 정말 좋을 것입니다. DDevExtensions에도 없지만 다른 많은 것들도 바꿀 수 있습니다.Delphi 2009 그룹 프로젝트에서 여러 프로젝트에 대한 호스트 응용 프로그램을 변경할 수 있습니까?

델파이 2009 IDE에 설치 장소가 있습니까? 아니면 설치할 수있는 또 다른 확장 프로그램이 있습니까? 내 그룹 프로젝트에서 30 개 이상의 DLL에 대한 호스트 응용 프로그램을 하나씩 변경할 수 있습니까?

답변

1

저의 삶은 왜 생각할 수 없지만 음, 분명히 방법은 없습니다. 난 내 꽤하지 않습니다 당신이, 당신의 자신의 DFM을 쓸 수 있습니다 (Zarko Gajic for the file search에 몇 가지 소품)

unit HostAppSwitcherDialog; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, ComCtrls, FileCtrl, msxml, msxmldom, Contnrs, 
    Generics.Collections; 

type 
    TForm1 = class(TForm) 
    lv1: TListView; 
    btnFolder: TButton; 
    btnHostApp: TButton; 
    btnUpdate: TButton; 
    procedure btnFolderClick(Sender: TObject); 
    procedure btnHostAppClick(Sender: TObject); 
     procedure btnUpdateClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    procedure ClearList; 
     public 
     end; 

    TDprojHostAppInfo = class 
    FileName : String; 
    Directory : String; 
    HostApp : String; 
    function GetPath : String; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 


function GetHostApplication(const AFileName : String) : String; 
var 
    DomDoc : IXMLDOMDocument; 
    DomNode : IXMLDOMNode; 
begin 
    DomDoc := CreateDOMDocument; 
    if DomDoc.load(AFileName) then 
    begin 
    DomNode := DomDoc.selectSingleNode('//Parameters[@Name="HostApplication"]'); 
    if assigned(DomNode) then 
     Result := DomNode.text; 

    end; 
end; 


function FileSearch(const PathName, FileName : string; const InDir : boolean) : TObjectList<TDprojHostAppInfo>; 
var Rec : TSearchRec; 
    Path : string; 
    TmpFiles : TObjectList<TDprojHostAppInfo>; 
    DProj : TDprojHostAppInfo; 
begin 
    Result := TObjectList<TDprojHostAppInfo>.Create(False); 
    Path := IncludeTrailingBackslash(PathName); 
    if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then 
    try 
    repeat 
     if (faReadOnly and rec.Attr) <> faReadOnly then 
     begin 
     DProj := TDprojHostAppInfo.Create; 
     DProj.FileName := Rec.Name; 
     DProj.Directory := Path; 
     DProj.HostApp := GetHostApplication(DProj.GetPath); 
     Result.Add(DProj); 
     end; 
    until FindNext(Rec) <> 0; 
    finally 
    FindClose(Rec); 
    end; 

    If not InDir then Exit; 

    if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then 
    try 
    repeat 
     if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..')  then 
     begin 
     TmpFiles := FileSearch(Path + Rec.Name, FileName, True); 
     TmpFiles.OwnsObjects := false; 
     for DProj in TmpFiles do 
      Result.Add(DProj); 
     TmpFiles.Free; 
     end; 
    until FindNext(Rec) <> 0; 
    finally 
    FindClose(Rec); 
    end; 
end; //procedure FileSearch 


procedure SetHostApplication(const AFileName : String; const ANewHostApplication : String); 
var 
    DomDoc : IXMLDOMDocument; 
    DomNode : IXMLDOMNode; 
begin 
    DomDoc := CreateDOMDocument; 
    if DomDoc.load(AFileName) then 
    begin 
    DomNode := DomDoc.selectSingleNode('//Parameters[@Name="HostApplication"]'); 
    if assigned(DomNode) then 
     DomNode.text := ANewHostApplication; 

    end; 
    DomDoc.save(AFileName); 
end; 


procedure TForm1.btnHostAppClick(Sender: TObject); 
var 
    NewHostApp : String; 
    lvi : TListItem; 
    DProj : TDprojHostAppInfo; 
begin 
    NewHostApp := InputBox('New Host Application', 'Please type the new host  application', 'w:\bcproc\'); 
    for lvi in lv1.Items do 
    if lvi.Selected then 
    begin 
     DProj := TDprojHostAppInfo(lvi.Data); 
     DProj.HostApp := NewHostApp; 
     lvi.SubItems[0] := NewHostApp; 
    end; 
end; 

procedure TForm1.btnUpdateClick(Sender: TObject); 
var 
    lvi : TListItem; 
    dproj : TDprojHostAppInfo; 
begin 
    for lvi in lv1.Items do 
    if lvi.Checked then 
    begin 
     dproj := TDprojHostAppInfo(lvi.Data); 
     SetHostApplication(dproj.GetPath, dproj.HostApp); 
    end; 
end; 

procedure TForm1.ClearList; 
var 
    lvi : TListItem; 
    dproj : TDprojHostAppInfo; 
begin 
    for lvi in lv1.Items do 
    begin 
    dproj := TDprojHostAppInfo(lvi.Data); 
    dproj.Free; 
    end; 
    lv1.Clear; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    ClearList; 
end; 

procedure TForm1.btnFolderClick(Sender: TObject); 
var 
    Options : TSelectDirOpts; 
    ChosenDir : string; 

    Files : TObjectList<TDprojHostAppInfo>; 
    DProj : TDprojHostAppInfo; 
    lvi : TListItem; 
begin 
    ClearList; 
    ChosenDir := 'C:\'; 

    if SelectDirectory(ChosenDir, Options, 0) then 
    begin 
    Files := FileSearch(ChosenDir, '*.dproj', True); 

    for DProj in Files do 
    begin 
     lvi := lv1.Items.Add; 
     lvi.Caption := DProj.FileName; 
     lvi.SubItems.Add(DProj.HostApp); 
     lvi.Data := DProj; 
    end; 

    Files.Free; 
    end; 
end; 


function TDprojHostAppInfo.GetPath: String; 
begin 
    Result := Directory + '\' + FileName; 
end; 

end. 

: 그래서 나는 이것을 썼다.

dproj는 XML 파일이므로로드하여 저장할 수 있습니다. 필자는 VSS를 계속 사용함에 따라 변경 될 수있는 항목 목록에 ReadOnly 항목을 포함시키지 않았지만 아마도 Delphi XE2에 대한 SVN으로 전환 한 것으로 생각할 것입니다.