On 2013-10-23 18:58, Sven Barth wrote:
Am 23.10.2013 17:50, schrieb ListMember:
This is far too (incredibly) elaborate.

It's a bit like giving me plans to set up an army to invade a country when all I want to do is to visit it as a tourist :)
No, this is the officially supported way to interfere with Pascal's IO system.

I gathered as much. But, at least for me, writing a 'textdriver' simply to redirect the output of WriteLn is too complicated.

As I mentioned in my first post, I am prepared to alter the compiler sources; and I had this in mind:

I would like to add these to a common unit --such as globals.pas

What would adding a callback to "globals.pas" provide? The string that is written by Writeln is created at runtime and not at compile time.

And, that's precisely what I want to do: Get/redirect the string (that Writeln would write to console) back to my application in run time.


type
  TMyWriteLnCallback = procedure(AText: String);

var
  GMyWriteLnCallback: TMyCallback = nil;

and then, wherever the 'compiler magic' for WriteLn is, use something like

if Assigned(GMyWriteLnCallback) then GMyWriteLnCallback(TextStuff)
else {do the usual console output}

So, could someone tell me where I have to inject these lines.
I've already written you how you can do it. Write a text driver which uses your callback function.

This is much easier than trying to understand how the compiler handles Writeln plus you don't need to manipulate the compiler or the RTL for that.

Frankly, I agree that I should not have to modify the compiler or the RTL; especially for something like redirecting the WriteLn output from console to my own application.

But, doing it through text drivers etc. is --how can I put it-- almost inhuman.

I don't want to do it through

Procedure AssignStream(var F: Textfile; Stream: TStream);

as it exists in StreamIO unit because I don't want to fiddle around with streams as it doesn't have an OnChange event. It means I need to wait for the whole app to finish, or I need to keep polling for what has changed in the stream. Totally useless in my case.

I could use the sample code you posted a link to (and, thank you also for that), and I adapted it to use TMemo for my use.

But, why would I have to write 100+ lines of code just to capture the output of WriteLn.

Plus, I keep getting segfaults when I close the application --something is calling InOutFunc when the app closes and still tries to write to a destroyed TMemo.

I think I'll go with Leledumbo's solution --and yes, will alter the globals.pas in the compiler's source.

--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to