[gelöst][wxWidgets] redirect std stream in wxTextCtrl ... WXUSINGDLL
-
Hallo,
ich würde gerne die std streams in meinen logging view umleiten. Laut der wxWidgets doc functioniert das auf 2 Arten.
a)
wxStreamToTextRedirector redirect( (wxTextCtrl *) myTextCtrl );[cpp]
b)
std::cout.rdbuf( (wxTextCtrl *) myTextCtrl );
Dazu nötig wäre aber
#define wxHAS_TEXT_WINDOW_STREAM 1
welches wiederrum wie folgt auf 0 gesetzt wird.
#if defined(__WATCOMC__) || \ defined(__MWERKS__) || \ (defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL))) #define wxHAS_TEXT_WINDOW_STREAM 0
Also keine Chance wenn ich das dynamisch linke.
Nun meine Frage: Gibt es eventuell noch einen anderen Weg? Ich wäre durchaus in der Lage das erstmal nur eine Funktion zu pipen die mir dann einen std::string logged o.ä.
Der Hintergrund ist folgender, ich möchte die Ausgaben, Fehler etc. die mir Python generiert in der Applikation ausgeben.
Wäre super wenn jemand einen Rat für mich haette.
-
Kaum gepostet fällt mir eine neue Variante ein wie ich nach dem Problem suchen kann und finde prompt eine Ideale Hilfestellung.
Gefunden hier, gepostet von dave: http://www.devmaster.net/forums/showthread.php?t=7037
#include <streambuf> class BufferedStringBuf : public std::streambuf { public: BufferedStringBuf(int bufferSize) { if (bufferSize) { char *ptr = new char[bufferSize]; setp(ptr, ptr + bufferSize); } else setp(0, 0); } virtual ~BufferedStringBuf() { sync(); delete[] pbase(); } virtual void writeString(const std::string &str) = 0; private: int overflow(int c) { sync(); if (c != EOF) { if (pbase() == epptr()) { std::string temp; temp += char(c); writeString(temp); } else sputc(c); } return 0; } int sync() { if (pbase() != pptr()) { int len = int(pptr() - pbase()); std::string temp(pbase(), len); writeString(temp); setp(pbase(), epptr()); } return 0; } };
const int LineSize = 256; class wxBuf : public BufferedStringBuf { public: wxBuf() : BufferedStringBuf(LineSize) {} virtual void writeString(const std::string &str) { if ( str.size() > 1 ) // message box doesnt care about single characters wxLogMessage( str.c_str() ); } };
wxBuf *debug_buffer = new wxBuf(); std::streambuf *old_buffer = std::cout.rdbuf(debug_buffer); std::cout << "to wxWidgets" << std::endl; // restore the old buffer std::cout.rdbuf(old_buffer); delete debug_buffer;