Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ScriptingEngine? (https://www.delphipraxis.net/5175-scriptingengine.html)

Christian Seehase 26. Mai 2003 19:08

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.

CalganX 26. Mai 2003 19:17

Hi Chris, hi Chewie,
danke für eure Hilfe!
Ich werde versuchen Christians Idee umzusetzen (muss erstmal Onkel Fisch anhören :mrgreen:).

Chris

CalganX 27. Mai 2003 16:25

Hi,
ich habe gerade das ganze mal versucht.
Erstmal meine Funktion:
Delphi-Quellcode:
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;
Bei lineStr =
Code:
findwindow "test" "test test" $1
wird so ist Paramcount so:
Code:
0: findwindow
1:
2: "
3:
4: "
5:
Das erste ist ja richtig... :mrgreen:

Woran kann das liegen? Wo liegt der Hund begraben?

Chris

CalganX 27. Mai 2003 17:57

Habe gerade noch mal drüber geschaut. Jetzt sieht das ganze so aus:
Delphi-Quellcode:
  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);
Das Array geht von 0 bis 10 und die Ausgabe ist:
Code:
0: findwindow
1: "test"
2: " "
3:
4: "test test"
5:
6: " $1
7:
8: " $
9:
10:
Habt ihr eine Idee, wie man das ganze noch verbessern (lauffähig bekommen) könnte?

Chris

Christian Seehase 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;

CalganX 28. Mai 2003 11:31

Ö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

Christian Seehase 28. Mai 2003 14:29

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 ;-)

CalganX 28. Mai 2003 14:43

Zitat:

Zitat von Christian Seehase
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 ;-)

Ich sag ja nicht, dass das schlecht war!!! Ich finde es sogar besser!

Chris

CalganX 28. Mai 2003 19:57

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

Christian Seehase 28. Mai 2003 21:33

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 08:52 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz