AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Text von Writeln -> Speicherblock

Ein Thema von neolithos · begonnen am 23. Okt 2003 · letzter Beitrag vom 25. Okt 2003
Antwort Antwort
Seite 1 von 2  1 2      
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#1

Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 18:45
Wie kann ich die Zeichenkette, die ich mittels Writeln schreibe in einem von mir definierten Buffer umlenken?
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#2

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 18:47


Du willst alles was an writeln übergeben wird hinterher abfangen?
Wie soll das denn bitteschön gehen und wozu soll das dienen?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#3

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 18:52
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?).
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 18:55
Moin Neo,

schau Dir dazu mal den Artikel:

Zitat von PSDK:
Creating a Child Process with Redirected Input and Output
an.
Sollte auch im MSDN zu finden sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#5

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 19:02
Interessant aber nicht das was ich meine.

Ich habe nämlich das herausgefunden...
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?
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 19:05
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 19:08
Moin Neo,



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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 19:08
Ein Danke nach Thüringen!

Darauf kann ich aufbauen!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 19:27
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
Angehängte Dateien
Dateityp: zip test_140.zip (269,9 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#10

Re: Text von Writeln -> Speicherblock

  Alt 23. Okt 2003, 19:30
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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