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