Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aktuelle Zeile auslesen ... (https://www.delphipraxis.net/56847-aktuelle-zeile-auslesen.html)

Nils_13 12. Nov 2005 09:59


Aktuelle Zeile auslesen ...
 
Hi,

ich lese mit diesem Code die Zeile aus in der ich mich befinde
Delphi-Quellcode:
  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;
Der ganze Code:
Delphi-Quellcode:
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;
Warum passiert nichts, wenn ich '#exit' eintippe und Return drücke ?

jim_raynor 12. Nov 2005 10:06

Re: Aktuelle Zeile auslesen ...
 
Lowercase(i) wird auch nie #exit ergeben ;) Müsste ehr Lowercase(Memo1.Lines[i]) heissen, nicht wahr ;)

Nils_13 12. Nov 2005 10:29

Re: Aktuelle Zeile auslesen ...
 
Delphi-Quellcode:
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;
Läuft immer noch nicht.

Khabarakh 12. Nov 2005 10:32

Re: Aktuelle Zeile auslesen ...
 
Wie wäre es, wenn du einfach mal den Debugger zur Hand nimmst und die Variableninhalte prüfst?

CalganX 12. Nov 2005 10:33

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

Neutral General 12. Nov 2005 11:10

Re: Aktuelle Zeile auslesen ...
 
... sondern in der i-1 Zeile.

Nils_13 12. Nov 2005 11:43

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von Neutral General
... sondern in der i-1 Zeile.

Nein.
Delphi-Quellcode:
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;
Passiert nichts. Was brinbgt mir außerdem der Debugger ? Es tauchen ja keine Fehler auf.

marabu 12. Nov 2005 11:46

Re: Aktuelle Zeile auslesen ...
 
Hallo Nils,

kommst du damit zurecht?

Delphi-Quellcode:
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;
Grüße vom marabu

Nils_13 12. Nov 2005 11:48

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von marabu
Hallo Nils,

kommst du damit zurecht?

Delphi-Quellcode:
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;
Grüße vom marabu

Danke :-D jetzt läuft es.

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.

Khabarakh 12. Nov 2005 11:52

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von Nils_13
Was brinbgt mir außerdem der Debugger ? Es tauchen ja keine Fehler auf.

Wenn ein Programm nicht macht, was es soll, ist das ja wohl ein Fehler :stupid: . Wie gesagt, du hättest die Variableninhalte (und Lines) überprüfen sollen.
http://www.delphipraxis.net/internal...ct.php?t=47972

jim_raynor 12. Nov 2005 12:10

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von Nils_13
Was brinbgt mir außerdem der Debugger ? Es tauchen ja keine Fehler auf.

Weil man mit dem Debugger auch Werte von Variablen anzeigen kann ... und so den Fehler auf die Schliche kommt.

marabu 12. Nov 2005 12:31

Re: Aktuelle Zeile auslesen ...
 
Du könntest eine Befehlsliste verwenden:

Delphi-Quellcode:
var
  CommandList: TStringList;

begin
  CommandList := TStringList.Create;
  with CommandList do
  begin
    Sorted := true;
    CaseSensitive := false;
    Add('#exit');
    Add('#pause');
    // ...
  end;
end;
Und später dann prüfst du so:

Delphi-Quellcode:
if CommandList.IndexOf(command) >= 0 
  then // gültiger Befehl
  else // ungültiger Befehl
;
marabu

Nils_13 12. Nov 2005 12:43

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von marabu
Du könntest eine Befehlsliste verwenden:

Delphi-Quellcode:
var
  CommandList: TStringList;

begin
  CommandList := TStringList.Create;
  with CommandList do
  begin
    Sorted := true;
    CaseSensitive := false;
    Add('#exit');
    Add('#pause');
    // ...
  end;
end;
Und später dann prüfst du so:

Delphi-Quellcode:
if CommandList.IndexOf(command) >= 0 
  then // gültiger Befehl
  else // ungültiger Befehl
;
marabu

Und wie willst du überprüfen, ob der Befehl gültig oder ungültig ist ?

Die Muhkuh 12. Nov 2005 12:44

Re: Aktuelle Zeile auslesen ...
 
Weil der Befehl dann nicht in der Liste steht? :roll:

Nils_13 12. Nov 2005 12:47

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von Spider
Weil der Befehl dann nicht in der Liste steht? :roll:

Ach nee :roll: Aber wie macht man das mit Delphi ?
-
Ach ich idiot ... schon gut.
-
Nur was ist dann Comman bei dem Indexof ?

malo 12. Nov 2005 12:56

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von Nils_13
Nur was ist dann Comman bei dem Indexof ?

Ein wenig Nachdenken schadet doch bestimmt nicht? Ich würde vorschlagen, das ist deine aktuelle Zeile, die dann geprüft wird :roll:

Nils_13 12. Nov 2005 13:19

Re: Aktuelle Zeile auslesen ...
 
Delphi-Quellcode:
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;
Jetzt kann ich halt kein #exit mehr eintippen, da alles vollgemüllt wird.

malo 12. Nov 2005 13:22

Re: Aktuelle Zeile auslesen ...
 
Delphi-Quellcode:
if CommandList.IndexOf(IntToStr(iLine)) >= 0
  then // gültiger Befehl
  else Console.Lines.Add('Ungültiger Befehl');
Jetzt schaust du dir mal den Sourcecode an, und gehst dich danach schämen.

Aber immerhin eine Leistung, zweimal den selben Fehler zu machen :thumb:

marabu 12. Nov 2005 13:32

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

Nils_13 12. Nov 2005 14:03

Re: Aktuelle Zeile auslesen ...
 
Zitat:

Zitat von malo
Delphi-Quellcode:
if CommandList.IndexOf(IntToStr(iLine)) >= 0
  then // gültiger Befehl
  else Console.Lines.Add('Ungültiger Befehl');
Jetzt schaust du dir mal den Sourcecode an, und gehst dich danach schämen.

Aber immerhin eine Leistung, zweimal den selben Fehler zu machen :thumb:

Geh du dich mal für deine Besserwisserei schämen, du hast es ja nicht nur zweimal gemacht :wink:

Nils_13 13. Nov 2005 09:38

Re: Aktuelle Zeile auslesen ...
 
Ich bin auf eine andere Methode fast zum Ergebnis gekommen.
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;

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

Die Muhkuh 13. Nov 2005 09:42

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;

faux 13. Nov 2005 10:17

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:
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;
Grüße
Faux

Nils_13 13. Nov 2005 10:56

Re: Aktuelle Zeile auslesen ...
 
Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 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