Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
13.01.2007, 16:20
Felheart



Vieleicht bin ich einfach gerade nur zu blöd aber ich kriegs einfach ned hin:
Also es geht darum,
ich hab 2 funktionen:

die erste ist sozusagen eine "Html-erzeug-verwaltungs" engine :)
Hier der Code...

Quellcode:void AddHTML(char* text, char* color="black" , int Size=10, bool FETT=false, bool KURSIV=false, bool UNDERLINED=false, int newline=0)
{
    char buffer[512];
    ofstream logfile("datei.htm", ios::app);// Erzeugen oder anhängen

    strcat(buffer,"<font size=");    strcat(buffer,(char*)Size);    strcat(buffer,">"); // Size
    strcat(buffer,"<font color=");    strcat(buffer,(char*)color);    strcat(buffer,">"); // Color

    if(FETT)        {strcat(buffer,"<b>");}    // Fetter text
    if(KURSIV)        {strcat(buffer,"<i>");}    // Schräger Text
    if(UNDERLINED)    {strcat(buffer,"<u>");}    // Unterstrichner Text

    strcat(buffer,text);                    // Der übergebene Text
    
    if(UNDERLINED)    {strcat(buffer,"</u>");}
    if(KURSIV)        {strcat(buffer,"</i>");}
    if(FETT)        {strcat(buffer,"</b>");}

    strcat(buffer,"</font> </font>");
    
    if(newline)                                // Zeilenumbruch
    {
        for(int i=0;i<=newline;i++)
            strcat(buffer,"<br>");
    }

    logfile << buffer;
    logfile.close();
}
Und diese funktion soll überprüfen ob plain text in der Zwischen ablage ist.
wenn ja, wird der text in nem buffer gespeichert und der HTML funktionn übergeben.
Wenn die funktion das nächste mal (per while(1) in nem thread)
ausgerufen wird soll sie überprüfen ob NEUER text in der Zwischenablage ist.
Wenn ja -> wieder zur HTML funktion.
Wenn nein -> return 0;

das problem dabei ist leider das ich ja nie wissen kann wie groß der text im CLP
ist, ist das ja dann -> index out of bounds :(

aber ich kann ned einfach char[] machen weil ich ja die initialisierte variable baruch um beim aller ersten aufruf schon überprüfen muss ob sich der text geändert hat

teufelskreis...
>__< was jetzt ?

hier noch der (vermukste: nich mal ein return drinne...) code um text aus dem CLP (Zwischneablage) zu holen...

Quellcode:void CheckCLP()
{
    HWND r = FindWindowA("ConsoleWindowClass",NULL);
    if (OpenClipboard(r))
    {
        if (::IsClipboardFormatAvailable(CF_TEXT) || ::IsClipboardFormatAvailable(CF_OEMTEXT))
        {
            // Retrieve the Clipboard data
            HANDLE hClipboardData = GetClipboardData(CF_TEXT);

            char *pchData = (char*)GlobalLock(hClipboardData);
            GlobalUnlock(hClipboardData);
            CloseClipboard();

            if(curr_clpdata!=pchData)
                curr_clpdata = pchData;
            AddHTMLBox(curr_clpdata);
        }

        else
        {
            static char curr_clpdata[] = "*** NO TEXT DATA IN CLIPBOARD! ***";
            AddHTML(curr_clpdata,"black",10,false,false,false,0);
        }
    }
}
ich bin am verzwifeln ! waaaaa..

--


Dieser Beitrag wurde am 13.01.2007 um 16:24 von Felheart bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
13.01.2007, 17:04
theDon



Zitat:
Quellcode:strcat(buffer,(char*)Size);
Optimal, du schreibst so viel Text in den Buffer, wie gerade an der Adresse, die dem Wert von Size entspricht (standardmaessig 10, also 0xA) steht. Das funktioniert so circa nie.

Nutz einfach std::string, dann hast du da schon einmal einige Probleme weniger (zum Beispiel die Konversion von Int nach char*, die naemlich mit einem Cast ziemlich genau nicht das macht, was du erwartest. Dafuer braeuchtest du naemlich sprintf())

Zudem solltest du zusehen, dass buffer gross genug ist, 512 duerfte da ziemlich sicher eng werden. Auch das Problem wuerde mit std::string nicht auftreteten.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 13.01.2007 um 17:05 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
13.01.2007, 17:20
Felheart



Also aus

char buffer[512]; -> string buffer="";

und aus

strcat(buffer,"<font size="); strcat(buffer,(char*)Size); strcat(buffer,">");
wird dann
buffer.append("<font size="); buffer.append(Size); buffer.append(">");

oder was? ist das beispiel so richitg?

Edit: wie ist es mit dem übergeben von parametern?
ist da irgenwas zu beachtn ?oder kann ich es so machen?

string Funktion(string txt){
return txt;}

edit2:

thedon: Nutz einfach std::string, dann hast du da schon einmal einige Probleme weniger (zum Beispiel die Konversion von Int nach char*, die naemlich mit einem Cast ziemlich genau nicht das macht, was du erwartest.

Quellcode:buffer.append(Size); -->
(Size ist ein übergebener INT parameter)
Quellcode:error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::append(const std::basic_string<_Elem,_Traits,_Ax> &)': Konvertierung des Parameters 1 von 'int' in 'const std::basic_string<_Elem,_Traits,_Ax> &' nicht möglich Edit3:

Quellcode:logfile.write(buffer,sizeof(buffer)); ->

Quellcode:error C2664: 'std::basic_ostream<_Elem,_Traits>::write': Konvertierung des Parameters 1 von 'std::string' in 'const char *' nicht möglich

--


Dieser Beitrag wurde am 13.01.2007 um 18:29 von Felheart bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
13.01.2007, 18:34
theDon



Wie waers denn zum Beispiel einfach mit logfile << buffer, das funktioniert dann naemlich auch. Statt append kannst du einfach += nutzen: buffer += size (da wird dann auch konvertiert).

Ansonsten koenntest du auch einfach direkt in den ofstream schreiben, dann sparst du dir den gesamten Overhead, den du durch die doppelte Pufferung hast.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
004
13.01.2007, 19:29
Felheart



logfile << buffer;

genau so hab ich es ja auch schon am anfang gemacht, aber dann kommt eben:

error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)

genauso ist es mit den folgenden:

buffer.append(time.wHour); time ist die variabele SYSTEMTIME

erzeugt den fehler:
Quellcode:error C2678: Binärer Operator '!=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich) und bei
buffer.append(time.wMinute);
Quellcode:error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::append(const std::basic_string<_Elem,_Traits,_Ax> &)': Konvertierung des Parameters 1 von 'WORD' in 'const std::basic_string<_Elem,_Traits,_Ax> &' nicht möglich :/

std::string macht da doch etwas viele probleme ^^

wie kann ich die ganzen dinger denn so konvertieren das sie der strign annimmt?

ich bin wirklich total ratlos...

Edit:

das mit dem buffer += (irgendwas) ist gut ;)
jetzt sind aber immer noch die fehler wegen: "<<" und "!=" da.

Edit:
oftopic: in meinem MVS 05 Pro wird jeder Kompilierfehler doppelt angezeigt...
(gleiche zeilen nummer aber verschiedene fehler nummern aber gleicher fehler oO)
/offtopic

--


Dieser Beitrag wurde am 13.01.2007 um 21:22 von Felheart bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
14.01.2007, 00:35
theDon



Zitat:
Felheart postete
error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)
Besorg dir einen Compiler, der nicht kaputt ist.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
006
14.01.2007, 11:54
Felheart



Sorry aber ich weis jetzt ned was du meinst oO

was ist an meinem Compiler den kaputt ?
kann ich das fixen ? (setup -> neu installen / repair) oder muss ich einen anderen nehmen ???

soll ich dir mal den source von meinem Projekt per PM senden ? :/

--

zum Seitenanfang zum Seitenende Profil || Suche
007
14.01.2007, 14:09
HammerBlade



theDon meint mit 'kaputt', dass er nicht standardkonform sei.

Edit:

Zitat:
theDon postete
Statt append kannst du einfach += nutzen: buffer += size (da wird dann auch konvertiert).
Welche STL Implementierung soll das können? Meine hier mit MinGW kann das nicht. An einen String kann ich nur weiter Strings konkatenieren.

Felheart, was theDon eigentlich meint, ist, dass du dir das Schreiben in den String sparen sollst, weil du damit 1. eine unnötige Zwsichenspeicherung hast und man 2. ohne Aufwand an einen String nur String, char* und char konkatenieren kann.

Ein ofstream ist da viel besser der hat << für viel mehr Typen:

Quellcode:void AddHTML(char* text, char* color = "black", int size = 10, bool bold = false, bool italic = false, bool underlined = false, int newline = 0)
{
    std::ofstream logfile("datei.htm", std::ios::app);
    
    logfile << "<font size=\"" << size << "\" color=\"" << color << "\">";
    
    if(bold)       logfile << "<b>";
    if(italic)     logfile << "<i>";
    if(underlined) logfile << "<u>";
    
    logfile << text;
    
    if(underlined) logfile << "</u>";
    if(italic)     logfile << "</i>";
    if(bold)       logfile << "</b>";
    
    logfile << "</font>";
    
    for(int i = 0; i < newline; i++)
        logfile << "<br>";
    
    logfile.close();
}
So könnte das aussehen. Neben bei, HTML-Attributewerte stehen in Anführungszeichen.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 14.01.2007 um 14:37 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
14.01.2007, 14:51
theDon



Zitat:
HammerBlade postete
Zitat:
theDon postete
Statt append kannst du einfach += nutzen: buffer += size (da wird dann auch konvertiert).
Welche STL Implementierung soll das können? Meine hier mit MinGW kann das nicht. An einen String kann ich nur weiter Strings konkatenieren.
Eine konforme Implementierung kann das, weil der entsprechende Konstruktor nicht explicit ist und Konkatenierung keine Memberfunktion von basic_string ist.

Edit: Das funktioniert so natuerlich nur, wenn size ein string oder ein char* ist. Fuer entsprechende Konversion braeuchte man da einen stringstream.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 14.01.2007 um 15:17 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
14.01.2007, 15:43
Felheart



Zitat:
theDon meint mit 'kaputt', dass er nicht standardkonform sei.
gibt es einen patch oder ein update für mein MSVS05 damit der Compiler "standartkonform" wird ?

oder muss ich da gleich die ganze IDE wechseln ? ich würde eben schon gerne bei Microsoft VS bleiben :/

--

zum Seitenanfang zum Seitenende Profil || Suche
010
14.01.2007, 15:53
HammerBlade



Nein nein, ist alles okay. Bleib bei MSVS05, der ist schon mal um längen besser als MSVS6.

Um die Verwirrung, die hier herschte mal zu beseitigen:

Ein ofstream hat << für alle möglichen Typen, string hat << nur für andere string's.
wenn du z.B. int's mit << an einen string anhegen willst brauchst du einen stringstream, wie theDon schon sagte.

Abgesehen davon solltest du wie ich oben schon sagt gleich in den ofstream schreiben und nicht erst in einen string und diesen dann in den ofstream.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way

zum Seitenanfang zum Seitenende Profil || Suche
011
14.01.2007, 21:37
K-Putt



Hab jetzt aus Zeitmangel nicht alles gelesen, will daher nur anmerken, dass du - sofern du es in ne Variable, schreiben, und nicht ausgeben willst - mit ostringstream machen kannst.
Ist ein String, der man Inhalt im Style von ofstream zuweisen kann.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche