![]() |
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 ^^ |
Re: eigene Konsole -> writeln output ?
Dies dürfte entweder über Pipes, nachzuschlagen unter
![]() ![]() PS: Fürdie Standardkonsole reicht wentweder {$APPTYPE CONSOLE} oder eine Kombination von AllocConsole und FreeConsole. |
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 ^^
|
Re: eigene Konsole -> writeln output ?
Wie hast du das bwerkstelligt? Das Problem bei Pipes ist nämlich, das die zunächst nur zweifarbig funktionieren.
|
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
|
Re: eigene Konsole -> writeln output ?
noch n btw: jemand lust mir bei meiner component library zu helfen ^^ awas kleiner Scherz ;)
|
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: |
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. |
Re: eigene Konsole -> writeln output ?
ja leute ich bin imma noch nich weiter hiiiiiiiiiiiiiiiiiilfeeee ^^
|
Re: eigene Konsole -> writeln output ?
Zitat:
Zitat:
Delphi-Quellcode:
var
S: String; begin Readln(S); end; |
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: |
Re: eigene Konsole -> writeln output ?
Zitat:
|
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; |
Re: eigene Konsole -> writeln output ?
Bin ich blind oder kommt in deinem geposteten Beispiel kein Readln vor?
|
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. |
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?
|
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:
beim Initiaisieren der Unit wird ein Fenster mit der Komponente erzeugt und in dieses wird der Buffer ausgegeben
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; 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 |
Re: eigene Konsole -> Readln Problem
au meine fresse... sag nich es gibt extra input... neeiiiinn.... mom
|
Re: eigene Konsole -> Readln Problem
okay also die Blindheit geht mal heute klar an mich ^^
Delphi-Quellcode:
bleibt jetzt nur noch das Problem, dass nichts gelesen wird
AssignDev(Output);
AssignDev(Input); |
Re: eigene Konsole -> Readln Problem
Zitat:
|
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,'"'); "" |
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. |
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:
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 )
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; |
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] |
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 05:06 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