Thema: Delphi ScriptingEngine?

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#15
  Alt 27. Mai 2003, 21:12
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat