Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Text von Writeln -> Speicherblock (https://www.delphipraxis.net/10706-text-von-writeln-speicherblock.html)

neolithos 23. Okt 2003 18:45


Text von Writeln -> Speicherblock
 
Wie kann ich die Zeichenkette, die ich mittels Writeln schreibe in einem von mir definierten Buffer umlenken?

Phoenix 23. Okt 2003 18:47

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?

neolithos 23. Okt 2003 18:52

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?).

Christian Seehase 23. Okt 2003 18:55

Re: Text von Writeln -> Speicherblock
 
Moin Neo,

schau Dir dazu mal den Artikel:

Zitat:

Zitat von PSDK
Creating a Child Process with Redirected Input and Output

an.
Sollte auch im MSDN zu finden sein.

neolithos 23. Okt 2003 19:02

Re: Text von Writeln -> Speicherblock
 
Interessant aber nicht das was ich meine.

Ich habe nämlich das herausgefunden...
Zitat:

Zitat von Delphi Hilfe
Der Typ TTextRec definiert das interne Format von Textdateien.

Unit

System

Delphi-Syntax:

type
PTextBuf = ^TTextBuf;
TTextBuf = array[0..127] of Char;
TTextRec = packed record

Handle: Integer;
Mode: Word;
Flags: Word;
BufSize: Cardinal;
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PChar;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..32] of Byte;
Name: array[0..259] of Char;
Buffer: TTextBuf;

end;

Beschreibung

TTextRec ist das interne Format einer Delphi-Variable des Typs Text. Normalerweise wird eine Variable dieses Typs nicht deklariert. Sie können aber TTextRect beispielsweise zur Typumwandlung einer Textdatei-Variablen benutzen, um auf die internen Datenfelder (z.B. den Dateinamen) zuzugreifen.

TextBuf ist der Typ des Eintrags Buffer im TTextRec-Record und gibt die Größe des verwendeten Puffers an.

Hinweis: Verwenden Sie diesen Typ nur, wenn Sie mit der Erstellung von Textdatei-Gerätetreibern in Delphi vertraut sind.

Wie soll das aber genau laufen?

negaH 23. Okt 2003 19:05

Re: Text von Writeln -> Speicherblock
 
Delphi-Quellcode:

procedure 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;
Gruß Hagen

Christian Seehase 23. Okt 2003 19:08

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:

neolithos 23. Okt 2003 19:08

Re: Text von Writeln -> Speicherblock
 
Ein Danke nach Thüringen!

Darauf kann ich aufbauen!

negaH 23. Okt 2003 19:27

Re: Text von Writeln -> Speicherblock
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Wenn Du in eine Datei schreiben willst hast Du doch den Buffer sowieso, denn woraus willst Du sonst schreiben?

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:
begin
  WriteLn('Test: ', FloatingPoint:10:2, Boolean:5, Integer:6);
end;
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.

Gruß Hagen

neolithos 23. Okt 2003 19:30

Re: Text von Writeln -> Speicherblock
 
Ich habe mich mal daran gemacht ein kleines Test-Programm zu schreiben...
Delphi-Quellcode:
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.
Dummerweise geht er nie DeviceInOut. Und beim Beenden tritt der RunTimeError 216 auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
Seite 1 von 2  1 2      

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