Autor Beitrag
Pharao2k
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 21.09.02 20:02 
hi,
ich will so eine art Konsole bauen. Mit einer TMemo einer TEdit und einer TButton Komponente. Edit und Button zum Befehl schreibun und absenden. Nun das eigentliche Problem. Wie kann ich den Befehl dann auseinandersetzen um ihn zu verwenden? Wer Spielekonsolen kennt der weiss es, dort ist es so aufgebaut z.B. addbot bot1 100 oder so. Also erst der Befehl, dann der Name des neuen Bots und dann die Stärke oder so. Und sowas in der Art will ich in einer WIndows-Anwendung machen. Wie mach ich das? Ich muss ja irgendwie erst den Befehl auslesen und dementsprechend dann die Parameter
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.09.02 20:30 
Ich sehe das Problem jetzt nicht, Pharao.
Du schreibst doch selbst:
Zitat:
Also erst der Befehl, dann der Name des neuen Bots und dann die Stärke oder so

Du prüfst also die Eingabe bis zum ersten Leerzeichen, und dann hast du Befehl und der Rest müssen ja dann die Parameter sein:
ausblenden Quelltext
1:
2:
cmd := copy(Edit1.Text,1,pos(#32,Edit1.Text)-1);
param := copy(Edit1.Text,pos(#32,Edit1.Text)+1,length(Edit1.Text));
Pharao2k Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 21.09.02 20:42 
hmm bei deinem Code blick ich nicht durch.
Er soll halt bei dem Befehl
BEFEHL Parameter1 Parameter2
soll halt erst schauen wie der Befehl ist und dann die Parameter auslesen um die Funtkioon dann richtig zu machen
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.09.02 20:50 
Jetzt verstehe ich nichts mehr.
Was genau hast du vor? Du willst eine kleine Konsole schreiben, in der du z.B. Anwendungen starten kannst? Etwa:
ausblenden Quelltext
1:
Notepad MeineTextdatei.txt					

Oder wie?

Wenn ja, dann kann´s dir doch theoretisch egal sein, wieviele Parameter angegeben sind. Das Programm, das du startest, regelt letztlich den Umgang mit dem Parameter.
Ich sehe nur ein Problem:
ausblenden Quelltext
1:
dir/w					

Hier ist kein Leerzeichen drin, und trotzdem ist "/w" der Parameter des DIR-Befehls.

Falls du an "ShellExecute" gedacht hast, dann kann ich dir jetzt schon sagen, dass es eine bessere (und eigentlich auch richtige) Möglichkeit gibt, bei der du dir die Trennung von Befehl und Parameter sogar sparen kannst.

Oder hast du was ganz anderes im Sinn? :?
Bleiben wir bei dem Bot-Ding:
ausblenden Quelltext
1:
addbot bot1 100					

In dem Fall wäre "addbot" der Befehl, den du mit
ausblenden Quelltext
1:
cmd := copy(Edit1.Text,1,pos(#32,Edit1.Text)-1);					

in der Variablen "cmd" findest. Anhand dieser Angabe könntest du dann mit einer Befehlsliste von Fall zu Fall unterscheiden, wieviele Parameter er noch lesen soll.
ausblenden Quelltext
1:
2:
if(CompareText(cmd,'addbot') = 0) then
  // lies noch zwei Parameter aus

So.
Pharao2k Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 21.09.02 20:54 
es soollen aber nicht nur programme gestartet werden sondern auch funktionen wo dann die parameter übergeben werden
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.09.02 20:56 
Kannst du vielleicht mal ein konkretes Beispiel geben?
Ich meine, es wird doch kein "addbot bot1 100" sein, oder?
Pharao2k Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 21.09.02 21:03 
in eine bestimmte .log-datei:
addstring huhu
sowas halt nur ein beispiel:
Zuerst halt der Befehl in dem Falle soll er was reinschreiben und als Parameter dass was er reinschreiben soll
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 22.09.02 07:56 
Ja, in dem Fall würde ich mir die Eingabe im Gesamten holen:
ausblenden Quelltext
1:
inp := Edit1.Text;					

und dann zerlegen. Das spare ich mir allerdings, denn das hatte ich dir ja schon gezeigt. Wenn du so das Kommando gefunden hast (Zeichen kopieren von #1 bis zum ersten Leerzeichen - 1), dann vergleichst du es mit deiner Befehlsliste. Eine solche solltest du schon haben, denke ich mal.

Anhand des gefundenen Kommandos rufst du die entsprechende (programm-)interne Funktion auf, gibst den Rest der Eingabe (Zeichen vom ersten Leerzeichen + 1 bis zum Ende des Strings) an diese Funktion weiter und lässt sie dort auch auswerten.
Letztlich hängt die Auswertung immer von der Funktion ab (bzw. von dem Befehl, den du angibst), deswegen kann ich dir im Moment leider keinen besseren Rat geben.
Pharao2k Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 22.09.02 13:26 
so sollte das sein aber ich blick nicht durch wie ich das machen müßte könntest du mir ein kleines Beispiel-Programm schreiben und hier posten?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 22.09.02 14:11 
:?: Ich habe doch nun schon mehrfach Beispiele gemacht. Ich verstehe jetzt deine Probleme nicht so richtig.

Also, noch mal zum Mitdenken -

1. Du tippst in dein Eingabefeld "addstring huhuhu" ein und klickst auf den Button. In dessen "OnClick"-Event steht folgendes:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  cmd, param: string;
begin
  // kein Leerzeichen gefunden
  if(pos(#32,Edit1.Text) = 0) then exit;

  // Befehl und Parameter holen
  cmd := copy(Edit1.Text,1,pos(#32,Edit1.Text)-1);
  param := copy(Edit1.Text,pos(#32,Edit1.Text)+1,length(Edit1.Text));

// ZUR KONTROLLE FÜR DEN PHARAO -->
  ShowMessage('Befehl = ' + cmd + #13#10 +
    'Parameter = ' + param);
// <--

  // Befehl mit (fiktiver) Liste vergleichen
  // die Liste ist ein String-Array fester Länge
  for i := 1 to length(MeineBefehle) do
    if(CompareText(cmd,MeineBefehle[i]) = 0) then
      // mach jetzt was
end;

Das Problem ist, dass du ab hier weitermachen musst. Mein Vorschlag wäre, du schreibst ein Record und kein String-Array, wie ich eben sagte:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
type
  MeineBefehle =
    packed record
      CmdName : string;
      CmdEntry : pointer;
    end;

"CmdName" wäre in dem Fall der Name des Befehls, mit dem du die Eingabe vergleichst (also das besagte "addstring"), und "CmdEntry" könnte den Pointer auf die dazupassende Prozedur enthalten.

Auf die Weise kannst du mehrere verschiedene Prozeduren/Funktionen schreiben und -abhängig vom eingetippten Befehl- ausführen lassen.

Jetzt kommt das dicke Aber -
Das ist nur Theorie. So was habe ich selbst noch nicht ausprobiert. :(

PS:
Bleiben wir also noch bei der einfachen Variante. Du müsstest eine Reihe if-then-Abfragen durchführen und den Parameter an die jeweilige Prozedur weiterleiten:
ausblenden Quelltext
1:
2:
if(CompareText(cmd,'addstring') = 0) then AddToLog(param)
  else if(CompareText(cmd,'blabla') = 0) then MachwasAnderes(param);

Ich glaube, das wäre erst mal die Variante, die du probieren könntest. Die Funktion selbst müsste dann den übergebenen Parameter auf Gültigkeit prüfen. Aber -wie gesagt!- das hängt von dem ab, was du ganz speziell machen willst. Da nutzen meine Beispiele nicht viel. Höchstens:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure AddToLog(const param: string);
begin
  // Datei öffnen und den Parameter reinschreiben
  // ganz egal, ob´s nur einer ist ... oder mehrere
  { ... }
end;