![]() |
If-Abfrage, die einen Befehl (Console) überprüfen kann ()
Hi,
tur mir leid, wenn der Titel etwas unklar formuliert ist, () heißt soviel wie Parameter. Ich mache gerade bei meiner kleinen Console weiter. Da stoße ich auf folgendes Problem: Ich möchte, dass man die Hintergrund Farbe per color() abändern kann. Aber wenn ich z.B. color(asdhasg) eingebe, ist der Parameter falsch, es tritt zwar kein Fehler auf, aber ich möchte natürlich den Benutzer darauf hinweisen, dass es keine Farbe mit dem Namen asdhasg gibt und dann 'Ungültiger Parameter' mit
Delphi-Quellcode:
ausgeben, aber das wird sehr schwierig, hier erstmal der Code:
// Console = TMemo
Console.Lines.Add('Ungültiger Parameter');
Delphi-Quellcode:
Um die Frage nochmal ganz klar zu stellen: Wie schmeiße ich dem Benutzer die Meldung 'Ungültiger Parameter' an den Kopf, wenn er weder color(black) eintippt oder color(maroon) ?
if pos('#color', line) = 1 then
begin // Console = TMemo if pos('(black)', line) > 0 then Console.color := clBlack; if pos('(marron)', line) > 0 then Console.color := clMaroon; end; |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
:gruebel: So?
Delphi-Quellcode:
if pos('#color', line) = 1 then
begin // Console = TMemo if pos('(black)', line) > 0 then Console.color := clBlack else if pos('(marron)', line) > 0 then Console.color := clMaroon else Console.Lines.Add('Ungültiger Parameter'); end; |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Ähm, nein, dann kann ich color(maroon) nicht mehr benutzen.
|
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Wieso nicht?
PS: color(black)abc oder colorino(black) oder colorino(black)abc sind nach eurer Abfrage dennoch richtig, wärend z.B. color(Black) ein falscher Parameter ist -.-'' |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Zitat:
Zitat:
|
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Ok, nochmal von vorne: Ich möchte ganz einfach nur, dass alle Befehle, die color(), mit einem zulässigen, von mir vorgegebenen Parameter akzeptiert werden, kein abc dahinter, einfach nur color(farbe).
|
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Du solltest die Zeile parsen, so dass du am Ende einen String hast, welcher genau den Wert zwischen der Klammer enthält. Nun kannst du per IdentToColor() den String in den entsprechenden Farbwert umwandeln lassen (denk dran vorher im Code ein "cl" anzufügen, damit der Name den Farbkonstanten von Delphi entspricht). Dabei kannst du direkt prüfen, ob die Funktion den Wert False zurücklieferte, was bedeutet, dass die Farbe ungültig war ;)
|
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Dann mußt du halt ertmal abfragen, ob color richtig eingegeben ist und dann nochmal die farbe prüfen,
Delphi-Quellcode:
oder du fragst direkt ab
if (copy(line, 1, 6) = 'color(') and (line[length(line)] = ')' then begin
if copy(line, 7, length(line) - 8) = 'black' then Console.color := clBlack else if copy(line, 7, length(line) - 8) = 'maroon' then Console.color := clMaroon else Console.Lines.Add('Falscher Farbwert'); end else Console.Lines.Add('Befehl unbekannt.');
Delphi-Quellcode:
[add]
if line = 'color(black)' then
Console.color := clBlack else if line = 'color(maroon)' then Console.color := clMaroon else Console.Lines.Add('Falscher Parameter'); oder wir Pr0g meint ._. |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
pr0g's Lösung ist wahrscheinlich die passendste..
Ich hätte ja vorgeschlagen, aus dem Eingabestring erstmal Tokens zu machen, dann mit ner Grammatik nen abstrakten Syntaxbaum aufzubauen und den dann zu interpretieren. Aber irgendwie glaub ich, ist das wohl etwas übertrieben :D |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
@himitsu: Irgendwie funktioniert dein Code bei mir nicht, Unbekannter Befehl.
Delphi-Quellcode:
if Console.Lines[iLine] <> '' then
begin Console.Lines.Add('Unbekannter Befehl'); end; |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Ich würde mal spontan sagen ich hätte da ein end vergessen (wenn's jetzt nicht dastehen würde :roll: ), aber sowas hätte man ja auch so merken können :)
|
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Ok, das habe ich bemerkt, der eigentliche Fehler ist beseitigt, aber wenn ich #color(maroon) eintippe, kommt der Fehler falscher Farbwert.
Delphi-Quellcode:
if (copy(line, 1, 6) = '#color(') and (line[length(line)] = ')') then begin
if copy(line, 7, length(line) - 8) = 'black' then Console.color := clBlack else if copy(line, 7, length(line) - 8) = 'maroon' then Console.color := clMaroon else Console.Lines.Add('Falscher Farbwert'); end else |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Warum machst du es nicht einfach so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var lInput, lValue: String; lColor: Integer; begin // Eingabe aus Editfeld holen lInput := AnsiLowerCase(Edit1.Text); // Befehl prüfen if (Pos('#color(', lInput) = 1) and (Pos(')', lInput) > 1) then begin // Farbwert extrahieren lValue := Copy(lInput, 8, Pos(')', lInput) - 8); // Farbwert in Delphifarbe umwandeln if IdentToColor('cl' + lValue, lColor) then Console.Color := lColor else Console.Lines.Add('Ungültiger Farbwert!'); end; end; |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Also ich benutze jetzt folgenden Code:
Delphi-Quellcode:
Die Farbe wird mir dem Befehl #color(maroon) abgeändert, allerdings wird später leider noch folgender Code aktiv:
var
iLine : Integer; Line : String; lInput, lValue: String; lColor: Integer; begin // ... lInput := AnsiLowerCase(Line); if (Pos('#color(', lInput) = 1) and (Pos(')', lInput) > 1) then begin lValue := Copy(lInput, 8, Pos(')', lInput) - 8); if IdentToColor('cl' + lValue, lColor) then Console.Color := lColor else Console.Lines.Add('Ungültiger Parameter'); end; // ...
Delphi-Quellcode:
Wie kann ich umgehen, dass nach der Abänderung der Farbe 'Unbekannter Befehl' noch in das Memo hinzugefügt wird ?
if Console.Lines[iLine] <> '' then
begin Console.Lines.Add('Unbekannter Befehl'); end; Ich möchte mich ganz herzlich bei euch allen bedanken, da ihr mir sehr bei dem Problem weitergeholfen habt, das Problem ist dann so ziemlich gelöst, danke für alles !! |
Re: If-Abfrage, die einen Befehl (Console) überprüfen kann (
Wie wäre es mit 'nem ELSE, also diese Abfrage nur machen, wenn worherige übergangen wurde?
Delphi-Quellcode:
PS: vielleicht ist dir aufgefallen, daß ich oben das # vor'm color vergaß und wenn du dieses schon einfügst, dann müssen natürlich auch die Positionen (also die 6en, 7en und 8en) um das hinzugefügte Zeichen erweiters werden, also um 1 erhöt :roll:
var
iLine : Integer; Line : String; lInput, lValue: String; lColor: Integer; begin // ... lInput := AnsiLowerCase(Line); if (Pos('#color(', lInput) = 1) and (Pos(')', lInput) > 1) then begin lValue := Copy(lInput, 8, Pos(')', lInput) - 8); if IdentToColor('cl' + lValue, lColor) then Console.Color := lColor else Console.Lines.Add('Ungültiger Parameter'); end else if Console.Lines[iLine] <> '' then begin Console.Lines.Add('Unbekannter Befehl'); end;
Delphi-Quellcode:
line := trim(line);
if (copy(line, 1, 7) = '#color(') and (line[length(line)] = ')' then begin if copy(line, 8, length(line) - 8) = 'black' then Console.color := clBlack else if copy(line, 8, length(line) - 8) = 'maroon' then Console.color := clMaroon else Console.Lines.Add('Falscher Farbwert'); //end else if (copy(line, 1, 14) = '#otherCommand(') and (line[length(line)] = ')' then begin // if copy(line, 14, length(line) - 14) = '...' then // ... // else Console.Lines.Add('Falscher Parameter'); end else Console.Lines.Add('Befehl unbekannt.'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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