AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ScriptingEngine?

Ein Thema von CalganX · begonnen am 26. Mai 2003 · letzter Beitrag vom 29. Mai 2003
Antwort Antwort
Seite 2 von 3     12 3      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#11
  Alt 26. Mai 2003, 20: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.
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
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#12
  Alt 26. Mai 2003, 20:17
Hi Chris, hi Chewie,
danke für eure Hilfe!
Ich werde versuchen Christians Idee umzusetzen (muss erstmal Onkel Fisch anhören ).

Chris
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#13
  Alt 27. Mai 2003, 17: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...

Woran kann das liegen? Wo liegt der Hund begraben?

Chris
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#14
  Alt 27. Mai 2003, 18: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#15
  Alt 27. Mai 2003, 22: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
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#16
  Alt 28. Mai 2003, 12: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#17
  Alt 28. Mai 2003, 15: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
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
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#18
  Alt 28. Mai 2003, 15:43
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
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#19
  Alt 28. Mai 2003, 20: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#20
  Alt 28. Mai 2003, 22: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.
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
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:32 Uhr.
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