![]() |
Text von Writeln -> Speicherblock
Wie kann ich die Zeichenkette, die ich mittels Writeln schreibe in einem von mir definierten Buffer umlenken?
|
Re: Text von Writeln -> Speicherblock
:wiejetzt:
Du willst alles was an writeln übergeben wird hinterher abfangen? Wie soll das denn bitteschön gehen und wozu soll das dienen? |
Re: Text von Writeln -> Speicherblock
1. Ich habe gesehen das es geht! Leider kein OpenSource
2. Ich will für meine Programm ein Debug-Fenster schreiben. Der Debug-Text soll via Writeln entstehen (Nicht das MS-DOS-Fenster sondern es soll zusätzlich eine Eingabezeile erhalten + ?Status-Anzeige?). |
Re: Text von Writeln -> Speicherblock
Moin Neo,
schau Dir dazu mal den Artikel: Zitat:
Sollte auch im MSDN zu finden sein. |
Re: Text von Writeln -> Speicherblock
Interessant aber nicht das was ich meine.
Ich habe nämlich das herausgefunden... Zitat:
|
Re: Text von Writeln -> Speicherblock
Delphi-Quellcode:
Gruß Hagenprocedure AssignHook(var F: Text); function DeviceOpen(var F: TTextRec): Integer; register; begin Result := 0; end; function DeviceClose(var F: TTextRec): Integer; register; begin Result := 0; F.BufPtr^ := #0; F.BufEnd := 1; F.BufPos := 0; end; function DeviceFlush(var F: TTextRec): Integer; register; begin Result := 0; case F.Mode of fmInput: begin // ouput F.BufPtr^ here F.BufPtr^ := #0; F.BufEnd := 1; F.BufPos := 0; end; fmOutput: begin // ouput F.BufPtr^ here F.BufPtr^ := #0; F.BufEnd := 1; F.BufPos := 0; end; end; end; function DeviceInOut(var F: TTextRec): Integer; register; begin Result := 0; case F.Mode of fmInput: // read F.Buffer here in fmOutput: // output F.Buffer here end; end; begin with TTextRec(F) do begin FillChar(F, SizeOf(F), 0); Mode := fmClosed; BufSize := SizeOf(Buffer); BufPtr := @Buffer; OpenFunc := @DeviceOpen; InOutFunc := @DeviceInOut; FlushFunc := @DeviceFlush; CloseFunc := @DeviceClose; end; end; procedure Test; begin AssignHook(Output); WriteLn( 'Test '); end; |
Re: Text von Writeln -> Speicherblock
Moin Neo,
:shock: :?: Wenn Du in eine Datei schreiben willst hast Du doch den Buffer sowieso, denn woraus willst Du sonst schreiben? Jetzt versteh' ich Dein Problem irgendwie überhaupt nicht mehr. :gruebel: |
Re: Text von Writeln -> Speicherblock
Ein Danke nach Thüringen!
Darauf kann ich aufbauen! |
Re: Text von Writeln -> Speicherblock
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Weil er entweder alle Ausgaben parallel auf dem Display und Datei ausgeben will, oder weil er die Ausfagen an die "Console" virtuell in ein TRichEdit/TMemo umlenken will. Gerade der letze Fall ist super gut. Ich selber habe dies dafür benutzt um alle mit WriteLn(), Write() und ReadLn() gemachten Ein/Asugaben in ein Richtedit auf einem TForm ein/auszugeben. Statt also ein Consolen Programm mit Delphi zu coden, das auf der beschissenen Windosconsole aufsetzt, programmiert man ein einzigstes mal einen solchen Device Handler und redirigiert dann die Ausgaben ins RichtEdit um. Nun wird jede Consolenanwendung in eine normale Windowsanwendung umgeschrieben einfach indem man dieses Form als Hauptform einbindet. Im Anhang habe ich mal ein solches Programm das solche Devicehandler auf RichtEdits umlenkt reingestellt. Alle Ausgaben in dieses RichtEdit erfolgen z.B. mit
Delphi-Quellcode:
Man hat also die enormen Vorteile von der offenen WriteLn() Formatierungen und kann sowas immer gebrauchen um mal schnell einen kleinen PASCAL Code zu testen/optimieren.
begin
WriteLn('Test: ', FloatingPoint:10:2, Boolean:5, Integer:6); end; Gruß Hagen |
Re: Text von Writeln -> Speicherblock
Ich habe mich mal daran gemacht ein kleines Test-Programm zu schreiben...
Delphi-Quellcode:
Dummerweise geht er nie DeviceInOut. Und beim Beenden tritt der RunTimeError 216 auf.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure AssignMemo(var F: Text); function DeviceOpen(var F: TTextRec): Integer; register; begin Result := 0; end; function DeviceClose(var F: TTextRec): Integer; register; begin Result := 0; F.BufPtr^ := #0; F.BufEnd := 1; F.BufPos := 0; end; function DeviceFlush(var F: TTextRec): Integer; register; begin Result := 0; case F.Mode of fmInput, fmOutput: begin F.BufPtr^ := #0; F.BufEnd := 1; F.BufPos := 0; end; end; end; function DeviceInOut(var F: TTextRec): Integer; register; begin Result := 0; case F.Mode of fmInput:; // read F.Buffer here in fmOutput: begin with Form1.Memo1 do Text := Text + F.Buffer; // output F.Buffer here Flush(Text(F)); end; end; end; begin with TTextRec(F) do begin FillChar(F, SizeOf(F), 0); Mode := fmClosed; BufSize := SizeOf(Buffer); BufPtr := @Buffer; OpenFunc := @DeviceOpen; InOutFunc := @DeviceInOut; FlushFunc := @DeviceFlush; CloseFunc := @DeviceClose; end; end; procedure TForm1.FormCreate(Sender: TObject); begin AssignMemo(Output); end; procedure TForm1.Button1Click(Sender: TObject); begin Writeln(Edit1.Text); end; end. |
Re: Text von Writeln -> Speicherblock
Hi,
ich konnte mir schon denken das einfach mal ein bischen Code posten hier nicht ausreichen kann. Zitat:
Also, in Form.OnDestroy() noch Close(Output) aufrufen. Ich empfehle dir entweder dem AssignMemo() als zweiten Parameter das TMemo mit zu übergeben, und es dann in der TTextRec Struktur zu speichern. Oder du gibts ein eigenes Event mit, da dann bei jeder Operation aufgerufen wird. In meinem Memo/RichtEdit Treiber habe ich beide Methoden implementiert. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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 by Thomas Breitkreuz