![]() |
Moin Chris,
ich würd's leicht anders machen: Die Zeile zeichenweise durchgehen, dabei in Schlüsselwort und Parameter trennen, indem bei auftreten eines " alle Zeichen ab der Position von " +1 bis zum nächsten " (-1) als String übernommen werden, und ab $ bis zum Auftreten von #32 als Variablenname. |
Hi Chris, hi Chewie,
danke für eure Hilfe! Ich werde versuchen Christians Idee umzusetzen (muss erstmal Onkel Fisch anhören :mrgreen:). Chris |
Hi,
ich habe gerade das ganze mal versucht. Erstmal meine Funktion:
Delphi-Quellcode:
Bei lineStr =
function GetParam(index: integer; lineStr: string): string;
var Params: array[0..5] of string; counter: integer; paramCounter: integer; temp: string; oldEnd: integer; openString: boolean; i: integer; begin counter := 0; paramCounter := -1; oldEnd := 1; repeat inc(counter); if lineStr[counter] = '"' then begin openString := true; i := counter; while openString do begin inc(i); if lineStr[i] = '"' then openString := false; end; temp := copy(lineStr, counter, counter + 1 - i); inc(paramCounter); Params[paramCounter] := temp; oldEnd := i; counter := i; end; if lineStr[counter] = ' ' then begin temp := copy(lineStr, oldEnd, counter - oldEnd); inc(paramCounter); Params[paramCounter] := temp; oldEnd := counter; end; until counter = length(lineStr); end;
Code:
wird so ist Paramcount so:
findwindow "test" "test test" $1
Code:
Das erste ist ja richtig... :mrgreen:
0: findwindow
1: 2: " 3: 4: " 5: Woran kann das liegen? Wo liegt der Hund begraben? Chris |
Habe gerade noch mal drüber geschaut. Jetzt sieht das ganze so aus:
Delphi-Quellcode:
Das Array geht von 0 bis 10 und die Ausgabe ist:
counter := 0;
paramCounter := -1; oldEnd := 1; repeat inc(counter); if lineStr[counter] = '"' then begin openString := true; i := counter; while openString do begin inc(i); if lineStr[i] = '"' then openString := false; end; temp := copy(lineStr, counter, i - counter + 1); inc(paramCounter); Params[paramCounter] := temp; oldEnd := i; inc(counter); end; if (lineStr[counter] = ' ') or (length(lineStr) = counter) then begin temp := copy(lineStr, oldEnd, counter - oldEnd); inc(paramCounter); Params[paramCounter] := temp; oldEnd := counter - 1; end; until counter = length(lineStr);
Code:
Habt ihr eine Idee, wie man das ganze noch verbessern (lauffähig bekommen) könnte?
0: findwindow
1: "test" 2: " " 3: 4: "test test" 5: 6: " $1 7: 8: " $ 9: 10: Chris |
Moin Chris,
hier mal ein erweiterbares Muster. Es wäre u.U. sinnvoller mit einer speziellen Liste für das Ergebnis zu arbeiten (Einträge als Record mit den Feldern Token für die Kennung was es denn nun ist, und Attribute für den Wert). Der Einfachheit halber mal als StringListe, und die Typen als Konstanten, statt Aufzählungstyp. Das Muster entspricht im Wesentlichen dem, was ich Dir schon mal vorgeschlagen hatte. Die Leerzeichen entfallen, da Du sie nach der Aufspaltung der Zeile eh' nicht mehr brauchst.
Delphi-Quellcode:
procedure SplitCommandLine(const AsCommandLine : string;const AslResult : TStrings);
const _iIsKeyword = 1; _iIsVariable = 2; _iIsStringConst = 3; var iIndex : integer; iCount : integer; begin AslResult.Clear; iIndex := 1; while iIndex <= length(AsCommandLine) do begin case AsCommandLine[iIndex] of 'a'..'z','A'..'Z' : begin // Keyword filtern iCount := 1; while (iIndex < length(AsCommandLine)) and (AsCommandLine[iIndex+iCount] in ['a'..'z','A'..'Z']) do inc(iCount); AslResult.AddObject(copy(AsCommandLine,iIndex,iCount),Pointer(_iIsKeyword)); inc(iIndex,iCount); end; '"' : begin // StringKonstante iCount := 1; while (iIndex < length(AsCommandLine)) and (AsCommandLine[iIndex+iCount] <> '"') do inc(iCount); AslResult.AddObject(copy(AsCommandLine,iIndex+1,iCount-1),Pointer(_iIsStringConst)); inc(iIndex,iCount+1); end; '$' : begin // Variable iCount := 1; while (iIndex < length(AsCommandLine)) and (AsCommandLine[iIndex+iCount] in ['0'..'9']) do inc(iCount); AslResult.AddObject(copy(AsCommandLine,iIndex,iCount),Pointer(_iIsVariable)); inc(iIndex,iCount); end; else begin inc(iIndex); end; end; end; end; procedure TfrmMAIN.Button1Click(Sender: TObject); begin SplitCommandLine('findwindow "test" "test test" $1',Memo1.Lines); end; |
Öhm... ok... eigentlich wollte ich nur einen Vorschlag für meine Funktion, allerdings ist da deine doch wesentlich komfortabler.
Danke! Werde das ganze jetzt mal ausprobieren... Chris |
Moin Chris,
sorry, aber da ich mich seit geraumer Zeit, und auch gerade jetzt, intensiv mit der Thematik beschäftigt habe, war's für mich einfacher das neu zu machen, als mich in Deine Funktion einzulesen ;-) |
Zitat:
Chris |
So... Funktioniert jetzt alles wunderbar, aber wie mache ich das mit "string string string".$4???
[EDIT] Muss nicht unbedingt "string".$4 sein! Kann z.B. auch "string$4" sein... [/EDIT] Chris |
Moin Chris,
wenn Du mich mal aufklären könntest, wie Du Dir, so ganz im allgemeinen, die Syntax gedacht hattest, könnte ich Dir vielleicht darauf antworten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz