Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi eigene Konsole -> Readln Problem (https://www.delphipraxis.net/37267-eigene-konsole-readln-problem.html)

hboy 3. Jan 2005 16:34


eigene Konsole -> Readln Problem
 
Hi Leute :)

Ich steh mal wieder vor einem kleinen Problemchen und bevor es mich wieder die ganze Nacht kostet hoff ich dass ihr mir da weiterhelfen könnt ^^

"Wird F weggelassen, wird die globale Variable Output verwendet, die auf die Standardausgabedatei der Prozesse zugreift. Beim Einsatz von Output in GUI-Anwendungen muss auf ein spezielles Vorgehen geachtet werden."

"spezielles Vorgehen" ? Also wie stell ich dass an eigene Prozeduren fürs Schreiben und Lesen umzusetzen ? Was hat es mit dieser Dateivariable auf sich ?

Edit: Die Hilfe meint noch weiter:
"Unter Windows haben die meisten Prozesse keine Standardausgabedatei und das Schreiben in Output löst einen Fehler aus. Wenn Delphi-Programme als Konsolenanwendungen gelinkt sind, verfügen sie über eine Standardausgabedatei."

Nur wie stellt delphi das an ? Ich hätte da gern meine eigene Konsole ^^

scp 3. Jan 2005 16:48

Re: eigene Konsole -> writeln output ?
 
Dies dürfte entweder über Pipes, nachzuschlagen unter Hier im Forum suchenCreatepipe und Hier im Forum suchenTStartUpInfo funktionieren, oder wie anno dazumal über Assign(OUTPUT, ), zu letzterem steht unter Assign etwas in der Hilfe.

PS: Fürdie Standardkonsole reicht wentweder {$APPTYPE CONSOLE} oder eine Kombination von AllocConsole und FreeConsole.

hboy 3. Jan 2005 16:51

Re: eigene Konsole -> writeln output ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
cool thx gleich mal gucken... btw state-of-the-art is ne nonvcl-kompo die so ausschaut ^^

scp 3. Jan 2005 16:56

Re: eigene Konsole -> writeln output ?
 
Wie hast du das bwerkstelligt? Das Problem bei Pipes ist nämlich, das die zunächst nur zweifarbig funktionieren.

hboy 3. Jan 2005 17:00

Re: eigene Konsole -> writeln output ?
 
bis jetzt wird die Konsole noch als Objekt angesprochen und nicht über die Standardausgabedatei, da bin ich gerade dabei, aber ich werds in ne Unit packen und dann kann man die Farbparameter über das Objekt anpassen. Mal sehn wie weit ich jetzt komm :) stay tuned

hboy 3. Jan 2005 17:13

Re: eigene Konsole -> writeln output ?
 
noch n btw: jemand lust mir bei meiner component library zu helfen ^^ awas kleiner Scherz ;)

hboy 3. Jan 2005 19:47

Re: eigene Konsole -> writeln output ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
sodele... es beginnt zu funktionieren..



Delphi-Quellcode:
  write('testing, testing.... *hust*');
  TextColor := $FF0000;
  write('.... everything seems to be in order');
  TextColor := $00FF00;
  BackgroundColor := $505050;
  write('Console test done.');

ich weiß... Zeilenumbrüche fehlen halt ^^ gemach gemach :D
Jetzt wie mach ich Readln ? läuft doch bestimmt auch wieder über InOut ?

schaut dann so aus:

hboy 3. Jan 2005 20:15

Re: eigene Konsole -> writeln output ?
 
danke erst mal das ich so weit gekommen bin.

und weiter gehts mit der fragerei ^^

Also bei ReadLn wird wohl die Open-Prozedur aufgerufen... nur was muss ich ändern/zurückgeben damit die "datei" als lesbar gilt ?

kleiner Einblick in den Code :

Delphi-Quellcode:
unit CCONSOLE;

interface

var TextColor, BackgroundColor: Cardinal;

implementation
  uses ConsoleWnd;

var
  ConsoleWin : TConsoleWnd;
  killed: Boolean;

Function DevOpen(var F: TTextRec): Integer;
begin
  // und was geht hier ???
  result :=0;
end;

Function DevInOut(var F: TTextRec): Integer;
begin
  case f.Mode of
    fmOutput:
      begin
        if not killed then ConsoleWin.proto.AddLine(F.Buffer,BackgroundColor,TextColor);
      end;
    fmInput:
      begin

      end;
    fmInOut:
      begin

      end;
  end;
  result :=0;
end;

Function DevFlush(var F: TTextRec): Integer;
begin
  case f.Mode of
    fmOutput:
      begin
        DevInOut(F);
        FillChar(F.Buffer,F.BufPos-1,0);
        F.BufPos := 0;
      end;
    fmInput:
      begin
      end;
    fmInOut:
      begin
      end;
  end;
  result :=0;
end;

Function DevClose(var F: TTextRec): Integer;
begin
  result :=0;
end;


procedure AssignDev(var F: Text);
begin
  with TTextRec(F) do
  begin
    Mode := fmClosed;
    BufSize := SizeOf(Buffer);
    BufPtr := @Buffer;
    OpenFunc := @DevOpen;
    InOutFunc := @DevInOut;
    FlushFunc := @DevFlush;
    CloseFunc := @DevClose;
    Name[0] := #0;
  end;
end;

initialization
  ConsoleWin := TConsoleWnd.Create(0);
  ConsoleWin.Caption := system.ParamStr(0)+ ' - NVConsole';
  ConsoleWin.Show;
  ConsoleWin.proto.AddLine('NonVCL Console by hbw-technology 2005 ',$0,$00C000);
  ConsoleWin.proto.AddLine('',0,0);
  AssignDev(Output);
finalization
  killed:= true;
end.

hboy 3. Jan 2005 23:17

Re: eigene Konsole -> writeln output ?
 
ja leute ich bin imma noch nich weiter hiiiiiiiiiiiiiiiiiilfeeee ^^

Sprint 3. Jan 2005 23:38

Re: eigene Konsole -> writeln output ?
 
Zitat:

Zitat von hboy
Also bei ReadLn wird wohl die Open-Prozedur aufgerufen... nur was muss ich ändern/zurückgeben damit die "datei" als lesbar gilt ?

Zitat:

ja leute ich bin imma noch nich weiter hiiiiiiiiiiiiiiiiiilfeeee ^^
Vielleicht solltest du dich mal klar und deutlich ausdrücken wo dein Problem liegt.

Delphi-Quellcode:
var
  S: String;
begin
  Readln(S);
end;

hboy 3. Jan 2005 23:45

Re: eigene Konsole -> writeln output ?
 
hab gedacht das hier reicht... :(

"Also bei ReadLn wird wohl die Open-Prozedur aufgerufen... nur was muss ich ändern/zurückgeben damit die "datei" als lesbar gilt ? "

weil bei ReadLn Fehler 6 auftritt. Und genau dieses Readln tut eben nicht. *grübeö* wwwiiiessooo :gruebel:

Sprint 4. Jan 2005 00:00

Re: eigene Konsole -> writeln output ?
 
Zitat:

Zitat von hboy
"Also bei ReadLn wird wohl die Open-Prozedur aufgerufen... nur was muss ich ändern/zurückgeben damit die "datei" als lesbar gilt ? "

Mit diesem Satz kann ich überhaupt nichts anfangen.

hboy 4. Jan 2005 00:04

Re: eigene Konsole -> writeln output ?
 
sorry. Also es geht darum dass ein Fehler bei Readln auftritt. Ich weiß nicht wie ich ein Lesen realisieren soll. Testweise könnte man auch 'Test' in den Buffer schreiben.
Ich weiß allerdings nicht wo das Programm mit dem Fehler abbricht. Kleine Änderung:

Delphi-Quellcode:
Function ConsoleIn(var F: TTextRec): Integer;
begin
  // ???
  Result := 0;
end;

Function ConsoleOut(var F: TTextRec): Integer;
begin
  if not killed then ConsoleWin.proto.AddLine(F.Buffer,BackgroundColor,TextColor);
  FillChar(F.Buffer,F.BufPos-1,0);
  F.BufPos := 0;
  Result := 0;
end;

Function ConsoleIgnore(var F: TTextRec): Integer;
begin
  Result := 0;
end;


Function DevOpen(var F: TTextRec): Integer;
begin
  with F do begin
    BufPos := 0;
    BufEnd := 0;
    case Mode of
      fmInput: begin
        InOutFunc := @ConsoleIn;
        FlushFunc := @ConsoleIgnore;
      end;
      fmOutput: begin
        InOutFunc := @ConsoleOut;
        FlushFunc := @ConsoleOut;
      end;
      fmInOut: begin
        Mode := fmOutput;
        InOutFunc := @ConsoleOut;
        FlushFunc := @ConsoleOut;
      end;
    else
      Result := 1;
      Exit;
    end;
  end;
  Result := 0;
end;

Sprint 4. Jan 2005 00:06

Re: eigene Konsole -> writeln output ?
 
Bin ich blind oder kommt in deinem geposteten Beispiel kein Readln vor?

hboy 4. Jan 2005 00:07

Re: eigene Konsole -> writeln output ?
 
ich hab bis jetzt nur den Konsolencode gepostet. okay und das Prog schaut so aus:

Delphi-Quellcode:
program Project1;

uses
  Windows,messages,CConsole;
var msg:TMsg;
  a: string;
begin

  write('testing, testing.... *hust*');
  TextColor := $FF0000;
  write('.... everything seems to be in order');
  TextColor := $00FF00;
  BackgroundColor := $505050;
  write('Console test done.');

  sleep(1000);

  readln(a);

  write('Readln Successful !!!');

  while GetMessage(msg,0,0,0) do // aufhängen^^
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
    if not IsWindowVIsible(msg.hwnd) then break; // bis das Konsolenfenster geschlossen ist
  end;


end.

Sprint 4. Jan 2005 00:15

Re: eigene Konsole -> writeln output ?
 
Ich kann in deinem Code kein {$APPTYPE CONSOLE} finden. Ist das Ausgabe-Fenster kein Windows-Konsolenfenster, sondern dein eigenes Fenster? Wenn ja, hast du StdInput- StdOutput Handle gesetzt?

hboy 4. Jan 2005 00:59

Re: eigene Konsole -> Readln Problem
 
Richtig. Ich will mein eigenes Konsolenfenster verwenden, und wie in dem 2. Screenshot zu sehen ist funktioniert es über die Standardausgabedatei Output recht gut. Das Schreiben zumindest. Zum schreiben wird über Umwege ( F.FlushFunc enthält die Funktion, die folgendes aufruft : )

Delphi-Quellcode:
Function ConsoleOut(var F: TTextRec): Integer;
var IsLn: Boolean;
begin
  if (F.Buffer[F.BufPos-2] = #13) and (F.Buffer[F.BufPos-1] = #10) then
  begin
    IsLn := true; // future purpose
    F.Buffer[F.BufPos-2] := #0;
  end;
  if not killed then ConsoleWin.proto.AddLine(F.Buffer,BackgroundColor,TextColor);
  FillChar(F.Buffer,F.BufPos-1,0);
  F.BufPos := 0;
  Result := 0;
end;
beim Initiaisieren der Unit wird ein Fenster mit der Komponente erzeugt und in dieses wird der Buffer ausgegeben
Nur ein Lesen könnte man über Abfangen der WM_KEYDOWN messages in einem Loop realisieren, jedoch wird die Leseprozedur
Function ConsoleIn(var F: TTextRec): Integer;

nicht aufgerufen. Es wird nichtmal die InOutFunc aufgerufen oder die FlushFunc. OpenFunc auch nicht. Also frag ich mich was da geschieht das das Programm mit einem Fehler abbricht. Vielleicht muss ich auch F.Flags setzen ( wenn ich wüsste welche Flags zu setzen wären )


Also Wo steckt der Fehler ?

E/A Fehler 6

hboy 4. Jan 2005 01:00

Re: eigene Konsole -> Readln Problem
 
au meine fresse... sag nich es gibt extra input... neeiiiinn.... mom

hboy 4. Jan 2005 01:05

Re: eigene Konsole -> Readln Problem
 
okay also die Blindheit geht mal heute klar an mich ^^
Delphi-Quellcode:
  AssignDev(Output);
  AssignDev(Input);
bleibt jetzt nur noch das Problem, dass nichts gelesen wird

Sprint 4. Jan 2005 02:02

Re: eigene Konsole -> Readln Problem
 
Zitat:

Zitat von hboy
bleibt jetzt nur noch das Problem, dass nichts gelesen wird

Musst die Werte nach BufPtr schieben. Dabei auf BufSize, BufPos & BufEnd achten.

hboy 4. Jan 2005 02:51

Re: eigene Konsole -> Readln Problem
 
tja.... achten .. wie setz ich die dann ? angenommen ich wollte mal nen kleinen Teststring zurückgeben ?

Delphi-Quellcode:
  s := 'Zu übergebender String';
  F.BufPos := length(s)-1;
  Move(s[1],F.Buffer[0],length(s)-1);
  Result := 0;

aber da kommt nix an

Delphi-Quellcode:
  readln(s);
  writeln('s entählt: "',s,'"');

""

hboy 4. Jan 2005 03:35

Re: eigene Konsole -> Readln Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
also es kommt nix an weil ich nich weiß wie ich BufPos und BufEnd setzen muss. BufSize bleibt glaub ich kostant.

So schauts aus bis jetzt. Jetzt kann man auch Text eintippen :) er wird nur noch nich zurückgegeben.

hboy 4. Jan 2005 12:27

Re: eigene Konsole -> Readln Problem
 
und es kommt noch besser. Offensichtlich ( ich hab 2k ) scheint unter win xp gar keine Eingabe aufzutauchen, das Fenster schließt sich einfach wieder. Hab ich irgend ne Message vergammelt ?

also was noch nicht tut ist ConsoleIn:

Delphi-Quellcode:
Function ConsoleIn(var F: TTextRec): Integer;
var
  Msg:TMsg;
  s: string;
begin
  s:='';
  ConsoleWin.proto.AddLine('_',BackgroundColor,TextColor);
  while GetMessage(msg,0,0,0) do // aufhängen^^
  begin
    if msg.message = WM_CHAR then
    begin
      Case msg.wParam and $FF of
        8: begin
              if length(s) <>0  then setlength(s,length(s)-1);
            end;
        13: break;
        else s := s + chr(msg.wParam);
      end;
      ConsoleWin.proto.AddLine(s,BackgroundColor,TextColor,true);
    end;

    if IsWindowVIsible(msg.hwnd) then
    begin
      TranslateMessage(msg);
      DispatchMessage(msg);
    end
    else
      break; // bis das Konsolenfenster geschlossen ist
  end;
  ConsoleWin.proto.AddLine(s,BackgroundColor,TextColor,true);

  Move(s[1],F.BufPtr^,length(s));
  ///F.BufPos := ???;
  ///F.BufEnd := ???;
  Result := 0;
end;
kann mir jemand sagen wie ich die BufPos und BufEnd Variablen setzen muss ? Und wieso bricht bei XP der Message Loop ab ? wenn es überhaupt so weit kommt ( es also schon vorher abbicht )

hboy 4. Jan 2005 13:14

Re: eigene Konsole -> Readln Problem
 
mal nebenbei für alle die das in der Codeschlacht hier mal testn wollen hier das Programm.
Tut bei 2000 aber offenbar bei XP nicht :( testets mal bitte. Jemand ne Idee woran das liegt ?

[altes attachment entfernt]

hboy 5. Jan 2005 11:56

Re: eigene Konsole -> Readln Problem
 
also meine lieben Programmierkünstler :) ich habs jetzt soweit feritg. Es fehlt noch die Prozessbeendung beim Schließen des Fensters aber sonst isses fertig !
War zwar ein wenig tricky rauszufinden was man mit dem Buffer tun muss aber es lefft.
Danke an alle die mitgeholfen ham :) :dp: :hello:


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