![]() |
Aktuelle Zeile auslesen ...
Hi,
ich lese mit diesem Code die Zeile aus in der ich mich befinde
Delphi-Quellcode:
Der ganze Code:
i := 0; i2 := 0;
while i < Memo1.Lines.Count do begin Inc(i2, Length(Memo1.Lines.Strings[i])); if i2 < Memo1.SelStart then Break; Inc(i); end;
Delphi-Quellcode:
Warum passiert nichts, wenn ich '#exit' eintippe und Return drücke ?
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var i, i2: integer; begin i := 0; i2 := 0; while i < Memo1.Lines.Count do begin Inc(i2, Length(Memo1.Lines.Strings[i])); if i2 < Memo1.SelStart then Break; Inc(i); end; if Key = VK_Return then begin if LowerCase(IntToStr(i)) = '#exit' then Application.Terminate; end; end; |
Re: Aktuelle Zeile auslesen ...
Lowercase(i) wird auch nie #exit ergeben ;) Müsste ehr Lowercase(Memo1.Lines[i]) heissen, nicht wahr ;)
|
Re: Aktuelle Zeile auslesen ...
Delphi-Quellcode:
Läuft immer noch nicht.
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var i, i2: integer; begin i := 0; i2 := 0; while i < Memo1.Lines.Count do begin Inc(i2, Length(Memo1.Lines.Strings[i])); if i2 < Memo1.SelStart then Break; Inc(i); end; if Key = VK_Return then begin if Lowercase(Memo1.Lines[i]) = '#exit' then Application.Terminate; end; end; |
Re: Aktuelle Zeile auslesen ...
Wie wäre es, wenn du einfach mal den Debugger zur Hand nimmst und die Variableninhalte prüfst?
|
Re: Aktuelle Zeile auslesen ...
Hi,
überleg mal bitte: wenn du Enter drückst (=> in die nächste Zeile springst), prüfst du den Inhalt dieser neuen Zeile auf den Wert #exit. Aber im Normalfall steht in dieser Zeile ja noch nichts, weil du gerade erst in sie reingesprungen bist/sie erzeugt hast. Wo musst du also den Wert überprüfen? Auf jeden Fall nicht in der i. Zeile. Chris |
Re: Aktuelle Zeile auslesen ...
... sondern in der i-1 Zeile.
|
Re: Aktuelle Zeile auslesen ...
Zitat:
Delphi-Quellcode:
Passiert nichts. Was brinbgt mir außerdem der Debugger ? Es tauchen ja keine Fehler auf.
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var i, i2: integer; begin i := 0; i2 := 0; while i < Memo1.Lines.Count do begin Inc(i2, Length(Memo1.Lines.Strings[i])); if i2 < Memo1.SelStart then Break; Inc(i); end; if Key = VK_Return then begin if Lowercase(Memo1.Lines[i-1]) = '#exit' then Application.Terminate; end; end; |
Re: Aktuelle Zeile auslesen ...
Hallo Nils,
kommst du damit zurecht?
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.MemoKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var iLine: integer; begin iLine := Memo.Perform(EM_LINEFROMCHAR, -1, 0); if (Key = VK_Return) and (LowerCase(Memo.Lines[iLine]) = '#exit') then Application.Terminate; end; |
Re: Aktuelle Zeile auslesen ...
Zitat:
Wie könnte ich es machen, dass überprüft wird, ob es die Befehle überhaupt gibt ? Ich könnte es ja über eine Textdatei machen, in der alle Befehle stehen. Aber wie vergleiche ich das dann ? Dadurch wird der Code auch allgemein kleiner, da ich die if Abfragen nicht mehr für jeden Befehl benötige. |
Re: Aktuelle Zeile auslesen ...
Zitat:
![]() |
Re: Aktuelle Zeile auslesen ...
Zitat:
|
Re: Aktuelle Zeile auslesen ...
Du könntest eine Befehlsliste verwenden:
Delphi-Quellcode:
Und später dann prüfst du so:
var
CommandList: TStringList; begin CommandList := TStringList.Create; with CommandList do begin Sorted := true; CaseSensitive := false; Add('#exit'); Add('#pause'); // ... end; end;
Delphi-Quellcode:
marabu
if CommandList.IndexOf(command) >= 0
then // gültiger Befehl else // ungültiger Befehl ; |
Re: Aktuelle Zeile auslesen ...
Zitat:
|
Re: Aktuelle Zeile auslesen ...
Weil der Befehl dann nicht in der Liste steht? :roll:
|
Re: Aktuelle Zeile auslesen ...
Zitat:
- Ach ich idiot ... schon gut. - Nur was ist dann Comman bei dem Indexof ? |
Re: Aktuelle Zeile auslesen ...
Zitat:
|
Re: Aktuelle Zeile auslesen ...
Delphi-Quellcode:
Jetzt kann ich halt kein #exit mehr eintippen, da alles vollgemüllt wird.
procedure TForm1.ConsoleKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var iLine: integer; CommandList: TStringList; begin CommandList := TStringList.Create; with CommandList do begin Sorted := true; CaseSensitive := false; Add('#exit'); Add('#pause'); end; iLine := Console.Perform(EM_LINEFROMCHAR, -1, 0); { // #exit if (Key = VK_Return) and (LowerCase(Console.Lines[iLine]) = '#exit') then Application.Terminate; if not (Key = VK_Return) and (LowerCase(Console.Lines[iLine]) = '#exit') then Console.Lines.Add('Befehl konnte nicht gefunden werden.'); } if CommandList.IndexOf(IntToStr(iLine)) >= 0 then // gültiger Befehl else Console.Lines.Add('Ungültiger Befehl'); ; end; |
Re: Aktuelle Zeile auslesen ...
Delphi-Quellcode:
Jetzt schaust du dir mal den Sourcecode an, und gehst dich danach schämen.
if CommandList.IndexOf(IntToStr(iLine)) >= 0
then // gültiger Befehl else Console.Lines.Add('Ungültiger Befehl'); Aber immerhin eine Leistung, zweimal den selben Fehler zu machen :thumb: |
Re: Aktuelle Zeile auslesen ...
Nils, meinst du nicht auch, dass deine CommandList besser in dem Ereignis OnCreate() der Form aufgebaut wird? Sie ändert sich ja nicht bei jedem Tastendruck. Auch ist mein Code für die Überprüfung eines Befehls eher beispielhaft. Du musst dir da schon noch ein paar eigene Gedanken machen. Deine Befehle werden vielleicht nicht immer alle einsam und alleine in einer Zeile stehen - oder?
Freundliche Grüße vom marabu |
Re: Aktuelle Zeile auslesen ...
Zitat:
|
Re: Aktuelle Zeile auslesen ...
Ich bin auf eine andere Methode fast zum Ergebnis gekommen.
Delphi-Quellcode:
Das Problem ist, wenn ich opencd und closecd eingebaut habe wird zwar jeder Befehl augeführt, es kommt aber hinter jedem Befehl 'Unbekannter Befehl'. Wenn ich opencd und closecd nicht eingebaut habe tritt der Fehler nicht auf.
procedure TForm1.ConsoleKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var iLine: integer; begin iLine := Console.Perform(EM_LINEFROMCHAR, -1, 0); if Key = VK_RETURN then begin if LowerCase(Console.Lines[iLine]) = '#exit' then Application.Terminate; if LowerCase(Console.Lines[iLine]) = '#help' then begin with Console.Lines do begin Add(''); Add(''); Add('#help = ruft die Hilfe auf'); Add('#exit = beendet das Programm'); Add('#opencd = öffnet das CD-Laufwerk'); Add('#closecd = schließt das CD-Laufwerk'); Add(''); end; end; if LowerCase(Console.Lines[iLine]) = '#opencd' then begin mciSendString('Set cdaudio door open wait', Nil, 0, Handle); end; if LowerCase(Console.Lines[iLine]) = '#closecd' then begin mciSendString('Set cdaudio door closed wait', Nil, 0, Handle); end else Console.Lines.Add('Unbekannter Befehl'); Console.Lines.Add(''); end; end; |
Re: Aktuelle Zeile auslesen ...
Hi,
ganz spontan würde ich sagen:
Delphi-Quellcode:
procedure TForm1.ConsoleKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var iLine: integer; begin iLine := Console.Perform(EM_LINEFROMCHAR, -1, 0); if Key = VK_RETURN then begin if LowerCase(Console.Lines[iLine]) = '#exit' then Application.Terminate else if LowerCase(Console.Lines[iLine]) = '#help' then begin with Console.Lines do begin Add(''); Add(''); Add('#help = ruft die Hilfe auf'); Add('#exit = beendet das Programm'); Add('#opencd = öffnet das CD-Laufwerk'); Add('#closecd = schließt das CD-Laufwerk'); Add(''); end; end else // << if LowerCase(Console.Lines[iLine]) = '#opencd' then begin mciSendString('Set cdaudio door open wait', Nil, 0, Handle); end else // << if LowerCase(Console.Lines[iLine]) = '#closecd' then begin mciSendString('Set cdaudio door closed wait', Nil, 0, Handle); end else Console.Lines.Add('Unbekannter Befehl'); Console.Lines.Add(''); end; end; |
Re: Aktuelle Zeile auslesen ...
Nils, ich würde mir an deiner Stelle mal die Grundlagen ansehen. Ein else bezieht sich nicht auf die Prozedur, so wie du es oben glaubst, sondern auf das if.
Also:
Delphi-Quellcode:
Grüße
if Key = VK_RETURN then
begin if LowerCase(Console.Lines[iLine]) = '#exit' then Application.Terminate; if LowerCase(Console.Lines[iLine]) = '#help' then //Hier wäre doch ein else if besser begin (...) end; if LowerCase(Console.Lines[iLine]) = '#opencd' then //Auch hier wäre ein else if besser begin mciSendString('Set cdaudio door open wait', Nil, 0, Handle); end; if LowerCase(Console.Lines[iLine]) = '#closecd' then //Und nochmals else if begin mciSendString('Set cdaudio door closed wait', Nil, 0, Handle); end else //Dieses else wird sonst immer ausgeführt, wenn >>LowerCase(Console.Lines[iLine]) = '#closecd'<< nicht zutrifft. Console.Lines.Add('Unbekannter Befehl'); Console.Lines.Add(''); //Nur am Rande bemerkt: Diese Zeile gehört nicht eingerückt, die gehört nicht zum else. end; Faux |
Re: Aktuelle Zeile auslesen ...
Danke.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 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