Entwickler-Ecke

Dateizugriff - ...einfach auf Kommandozeilenparameter zugreifen?


Narses - Mo 02.06.08 21:27
Titel: ...einfach auf Kommandozeilenparameter zugreifen?
Wie kann man einfach auf Kommandozeilenparameter zugreifen? Besonders z.B. über den Namen?

Vorschlag:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
type
  TForm1 = class(TForm)
    //...
  public
    ParamList: TStringList;
  end;

//...

procedure TForm1.FormCreate(Sender: TObject);
begin
  ParamList := TStringList.Create;
//ParamList.NameValueSeparator := ':'; // falls /param:value statt /param=value
  {$WARNINGS OFF}
  ParamList.CommaText := CmdLine; // Symbol 'CmdLine' ist plattformspezifisch
  {$WARNINGS ON}
  if (ParamList.Count > 0then begin
    Edit1.Text := ParamList.Strings[0]; // das hier ist Application.ExeName
    ParamList.Delete(0); // entfernen
  end;
  ListBox1.Items.Assign(ParamList);
  // so kann man einfach auf einen Kommandozeilenparamter über den Namen zugreifen
  if (UpperCase(ParamList.Values['/SWITCH']) = 'ON'then
    ShowMessage('Switch ist ON!');
end;

procedure TForm1.ListBox1Click(Sender: TObject);
  var
    i: Integer;
begin
  i := ListBox1.ItemIndex;
  if (i >= 0then begin
    // auf Kommandozeilenparamter über den Index zugreifen
    Edit2.Text := ParamList.Names[i];
    Edit3.Text := ParamList.ValueFromIndex[i];
  end
  else begin
    Edit2.Clear;
    Edit3.Clear;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ParamList.Free;
end;
Beispiel für eine Kommandozeile:

Quelltext
1:
test.exe /test=hallo "/welcome=hello world!" /switch=on                    

Einzige "Unschönheit": wenn der Parameter-Wert Whitespaces oder Kommata enthält, muss der ganze Parameter in Anführungszeichen (siehe DOH zur Eigenschaft .CommaText), nicht nur der Wert.

Im Anhang das zugehörige Testprojekt.


BenBE - Mo 02.06.08 23:53

Alternativ kann man sich auch mit ParamStr und ParamCount die benötigten Parameter in die StringList packen. Hier sollte aber auf Grund der Vorgehensweise von ParamStr ein ähnliches Problem existieren.