2014-12-16 2 views
0

В моей (XE2) IDE я постоянно приходится переключать настройки для Project Options/ Debugger/Parameters, потому что я тестирую для различных конфигураций клиентов, баз данных и т.д.Как управлять постоянно изменяющимися параметрами времени выполнения проекта в среде IDE?

Раскрывающийся список параметров становится неуправляемым. Так как у них тоже нет описаний, даже сложно определить, какие из них удалить (How can I clean the Parameters field in the Run -> Parameters menu?).

Любые умные идеи по управлению этим?
В идеале слова, которое я хотел бы дать им тег/описание, изменить порядок их, удалять некоторые ...

ответ

1

Не идеально, но обходной путь будет добавить избыточный параметр тега в качестве первого параметра.

Этот способ, по крайней мере, при использовании выпадающего списка, вы найдете указание того, какую комбинацию параметров вы используете.

+1

То есть умный. Я могу написать что-нибудь там, потому что приложение ищет только определенные параметры. Я начну использовать [string] в начале для «идентификации», а когда (?) У меня осталось немного времени, напишите небольшую утилиту, чтобы очистить этот список строк реестра. –

1

В дополнение к Lievens answer Я добавляю ответ на свой вопрос.

Я начал использовать [идентификатор] в начале параметра времени выполнения, и я могу добавить туда то, что хочу. Кроме того, я написал небольшое приложение, которое позволяет мне очищать параметры, хранящиеся в реестре (по адресу HKEY_CURRENT_USER\Software\Embarcadero\BDS\9.0\History Lists\hlRunParameters).

enter image description here

Вот код для этого приложения Win32. Это позволит вам удалить и отсортировать значения реестра. Он написан в Delphi XE2. Просто создайте новый проект VCL и используйте его в качестве основной формы.

uCleanIDEParams.pas

unit uCleanIDEParams; 
// https://stackoverflow.com/questions/27502689/how-to-manage-constantly-changing-project-run-time-parameters-in-the-ide 
// All 32 bit stuff, the Delphi IDE is 32 bit too 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CheckLst, Registry, 
    Vcl.ExtCtrls; 

type 
    TFrmCleanIDEParams = class(TForm) 
    PnlTop: TPanel; 
    BtnLoad: TButton; 
    EdtRegKey: TEdit; 
    Label1: TLabel; 
    ChkRedundant: TCheckBox; 
    PnlBottom: TPanel; 
    GBxSelection: TGroupBox; 
    BtnSelectAll: TButton; 
    BtnSelectNone: TButton; 
    BtnStartWith: TButton; 
    ChkNot: TCheckBox; 
    EdtStartWith: TEdit; 
    BtnInvert: TButton; 
    Label2: TLabel; 
    BtnWrite: TButton; 
    ChkSort: TCheckBox; 
    PnlCenter: TPanel; 
    CLBParams: TCheckListBox; 
    procedure BtnLoadClick(Sender: TObject); 
    procedure BtnSelectAllClick(Sender: TObject); 
    procedure BtnSelectNoneClick(Sender: TObject); 
    procedure BtnInvertClick(Sender: TObject); 
    procedure BtnStartWithClick(Sender: TObject); 
    procedure BtnWriteClick(Sender: TObject); 
    private 
    public 
    end; 

var 
    FrmCleanIDEParams: TFrmCleanIDEParams; 

implementation 

{$R *.dfm} 

procedure TFrmCleanIDEParams.BtnInvertClick(Sender: TObject); 
var i: integer; 
begin 
    for i := 0 to CLBParams.Items.Count-1 do CLBParams.Checked[i] := not CLBParams.Checked[i]; 
end; 

procedure TFrmCleanIDEParams.BtnLoadClick(Sender: TObject); 
var 
    lReg  : TRegistry; 
    lValue, 
    lItem, 
    lKey  : String; 
    i, 
    lNrRegVals: Integer; 
begin 
    lKey := Trim(EdtRegKey.Text); 
    if lKey = '' then Exit; 
    if lKey[1] = '\' then lKey := Copy(lKey,2); 

    lReg := TRegistry.Create(KEY_READ); 
    lReg.RootKey := HKEY_CURRENT_USER; 

    if not lReg.OpenKey(lKey,false) then 
    begin 
     MessageDlg('Key not found', mtError, mbOKCancel, 0); 
     Exit; 
    end; 
    if not lReg.ValueExists('Count') then 
    begin 
     MessageDlg('Value ''Count'' not found', mtError, mbOKCancel, 0); 
     Exit; 
    end; 
    lNrRegVals := lReg.ReadInteger('Count'); 
    for i := 0 to lNrRegVals-1 do 
    begin 
    lValue := 'Item' + IntToStr(i); 
    if lReg.ValueExists(lValue) then 
    begin 
     lItem := lReg.ReadString(lValue); 
     if ChkRedundant.Checked then 
     lItem := Trim(StringReplace(lItem,' ',' ',[rfReplaceAll])); 
     CLBParams.Items.Add(lItem); 
    end; 
    end; 
end; 

procedure TFrmCleanIDEParams.BtnSelectAllClick(Sender: TObject); 
var i: integer; 
begin 
    for i := 0 to CLBParams.Items.Count-1 do CLBParams.Checked[i] := true; 
end; 

procedure TFrmCleanIDEParams.BtnSelectNoneClick(Sender: TObject); 
var i: integer; 
begin 
    for i := 0 to CLBParams.Items.Count-1 do CLBParams.Checked[i] := true; 
end; 

procedure TFrmCleanIDEParams.BtnStartWithClick(Sender: TObject); 
var 
    i  : integer; 
    lStart, 
    lItem : string; 
begin 
    lStart := Lowercase(Trim(EdtStartWith.Text)); 
    if lStart = '' then Exit; 
    for i := 0 to CLBParams.Items.Count-1 do 
    begin 
    lItem := lowercase(CLBParams.Items[i]); 
    if (not ChkNot.Checked) and (Pos(lStart,lItem) = 1) 
    or (ChkNot.Checked) and (Pos(lStart,lItem) <> 1) then 
     CLBParams.Checked[i] := true; 
    end; 
end; 

procedure TFrmCleanIDEParams.BtnWriteClick(Sender: TObject); 
var 
    lReg  : TRegistry; 
    lValue, 
    lKey  : String; 
    i, 
    lNrToWrite, 
    lNrRegVals: Integer; 
begin 
    for i := CLBParams.Items.Count-1 downto 0 do 
    if not CLBParams.Checked[i] then 
     CLBParams.Items.Delete(i); 
    if CLBParams.Items.Count = 0 then 
    begin 
     MessageDlg('Nothing to do', mtInformation, mbOKCancel, 0); 
     Exit; 
    end; 
    if ChkSort.Checked then 
    CLBParams.Sorted := true; 

    // Now writing back 

    lKey := Trim(EdtRegKey.Text); 
    if lKey = '' then Exit; 
    if lKey[1] = '\' then lKey := Copy(lKey,2); 

    lReg := TRegistry.Create(KEY_READ or KEY_WRITE); 
    lReg.RootKey := HKEY_CURRENT_USER; 
    if not lReg.OpenKey(lKey,false) then 
    begin 
     MessageDlg('Key not found', mtError, mbOKCancel, 0); 
     Exit; 
    end; 
    if not lReg.ValueExists('Count') then 
    begin 
     MessageDlg('Value ''Count'' not found', mtError, mbOKCancel, 0); 
     Exit; 
    end; 
    lNrRegVals := lReg.ReadInteger('Count'); 

    lNrToWrite := CLBParams.Items.Count; 
    lReg.WriteInteger('Count',lNrToWrite); 
    // Write TCheckListBox items: 
    for i := 0 to lNrToWrite-1 do 
    begin 
    lValue := 'Item' + IntToStr(i); 
    lReg.WriteString(lValue,CLBParams.Items[i]); 
    end; 
    // Remove the rest: 
    for i := lNrToWrite to lNrRegVals-1 do 
    lReg.DeleteValue('Item' + IntToStr(i)); 
end; 

end. 

uCleanIDEParams.dfm

object FrmCleanIDEParams: TFrmCleanIDEParams 
    Left = 0 
    Top = 0 
    Caption = 'Clean Delphi IDE runtime parameters' 
    ClientHeight = 560 
    ClientWidth = 549 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    Position = poScreenCenter 
    PixelsPerInch = 96 
    TextHeight = 13 
    object PnlTop: TPanel 
    Left = 0 
    Top = 0 
    Width = 549 
    Height = 58 
    Align = alTop 
    BevelOuter = bvNone 
    TabOrder = 0 
    object Label1: TLabel 
     Left = 19 
     Top = 11 
     Width = 308 
     Height = 13 
     Caption = 'HKEY_CURRENT_USER registry key for IDE runtime parameters:' 
    end 
    object BtnLoad: TButton 
     Left = 496 
     Top = 30 
     Width = 40 
     Height = 25 
     Caption = 'Load' 
     TabOrder = 0 
     OnClick = BtnLoadClick 
    end 
    object EdtRegKey: TEdit 
     Left = 16 
     Top = 32 
     Width = 473 
     Height = 21 
     TabOrder = 1 
     Text = '\Software\Embarcadero\BDS\9.0\History Lists\hlRunParameters' 
    end 
    object ChkRedundant: TCheckBox 
     Left = 388 
     Top = 10 
     Width = 151 
     Height = 17 
     Hint = 'Removes leading, trailing, and duplicate spaces' 
     Caption = 'Remove redundant spaces' 
     Checked = True 
     State = cbChecked 
     TabOrder = 2 
    end 
    end 
    object PnlBottom: TPanel 
    Left = 0 
    Top = 471 
    Width = 549 
    Height = 89 
    Align = alBottom 
    BevelOuter = bvNone 
    TabOrder = 1 
    object Label2: TLabel 
     Left = 74 
     Top = 62 
     Width = 287 
     Height = 13 
     Caption = 'Click button to write the selected items back to the registry:' 
    end 
    object GBxSelection: TGroupBox 
     Left = 16 
     Top = -3 
     Width = 520 
     Height = 51 
     Caption = ' Select ' 
     TabOrder = 0 
     object BtnSelectAll: TButton 
     Left = 348 
     Top = 18 
     Width = 50 
     Height = 25 
     Caption = 'All' 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [] 
     ParentFont = False 
     TabOrder = 0 
     OnClick = BtnSelectAllClick 
     end 
     object BtnSelectNone: TButton 
     Left = 404 
     Top = 18 
     Width = 50 
     Height = 25 
     Caption = 'None' 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [] 
     ParentFont = False 
     TabOrder = 1 
     OnClick = BtnSelectNoneClick 
     end 
     object BtnStartWith: TButton 
     Left = 51 
     Top = 18 
     Width = 79 
     Height = 25 
     Hint = 'Selection is additive' 
     Caption = 'starting with:' 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [] 
     ParentFont = False 
     ParentShowHint = False 
     ShowHint = True 
     TabOrder = 2 
     OnClick = BtnStartWithClick 
     end 
     object ChkNot: TCheckBox 
     Left = 11 
     Top = 22 
     Width = 40 
     Height = 17 
     Caption = 'NOT' 
     TabOrder = 3 
     end 
     object EdtStartWith: TEdit 
     Left = 136 
     Top = 20 
     Width = 121 
     Height = 21 
     Hint = 'Case insensitive match' 
     ParentShowHint = False 
     ShowHint = True 
     TabOrder = 4 
     Text = '[' 
     end 
     object BtnInvert: TButton 
     Left = 460 
     Top = 18 
     Width = 50 
     Height = 25 
     Caption = 'Invert' 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [] 
     ParentFont = False 
     TabOrder = 5 
     OnClick = BtnInvertClick 
     end 
    end 
    object BtnWrite: TButton 
     Left = 364 
     Top = 58 
     Width = 89 
     Height = 25 
     Hint = 'Write the selected items back to the registry' 
     Caption = 'Write back' 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [fsBold] 
     ParentFont = False 
     ParentShowHint = False 
     ShowHint = True 
     TabOrder = 1 
     OnClick = BtnWriteClick 
    end 
    object ChkSort: TCheckBox 
     Left = 459 
     Top = 62 
     Width = 57 
     Height = 17 
     Caption = '(sorted)' 
     Checked = True 
     State = cbChecked 
     TabOrder = 2 
    end 
    end 
    object PnlCenter: TPanel 
    Left = 0 
    Top = 58 
    Width = 549 
    Height = 413 
    Align = alClient 
    BevelOuter = bvNone 
    TabOrder = 2 
    object CLBParams: TCheckListBox 
     AlignWithMargins = True 
     Left = 15 
     Top = 10 
     Width = 522 
     Height = 393 
     Margins.Left = 15 
     Margins.Top = 10 
     Margins.Right = 12 
     Margins.Bottom = 10 
     Align = alClient 
     ItemHeight = 13 
     TabOrder = 0 
    end 
    end 
end 

Примечания:

  1. Не забудьте изменить номер версии в ключе, если вам являются usin g ничего, кроме XE2. Для старых версий Delphi вам может понадобиться изменить Embarcadero до Borland.

  2. Не запускайте это приложение из среды IDE. Когда он закрывается, Delphi перезапишет любые изменения, внесенные в этот раздел реестра, и это выглядит как ваш program does not work =)

Смежные вопросы