property String^ Rtf der RichTextBox nicht schreibbar (Die zweite)



  • Hallo
    Ich habs zwar in nem anderen Thread schonmal angesprochen, der war aber noch an nen anderen Thread angeschlossen ...

    In einer WinForm habe ich eine RichTextBox eingefügt (mit dem Visual C++ 2005 Express Designer)
    Wenn ich jetzt versuche, die Rtf property der RichTextBox zu schreiben, dann ändert sich nichts
    Das Format, das ich einfüge entspricht dem Rtf Syntax, das habe ich schon mit einer MessageBox::Show(...) getestet

    Die Beschreibung der property Rtf sagt, dass ich Lesen und Schreiben kann, aber der Rtf Text ändert sich nicht

    Hier der Code

    private: System::Void Initialize(System::Object^  sender, System::EventArgs^  e) {
    				 infocontainer+=gcnew XTLItem("gitte",14,62,21);
    				 infocontainer+=gcnew XTLItem("gatte",23,14,63);
    
    				 ctprov->Create(infocontainer);
    				 String^ iss=ctprov->InsertionString();
    				 MessageBox::Show(iss);
    				 rtxTextbox->Rtf=iss;
    				 MessageBox::Show(rtxTextbox->Rtf);
    			 }
    

    Und hier die Ausgabe
    http://lhtech.lh.funpic.de/ws_image/bild.JPG



  • Ein

    richTextBox2->Rtf = richTextBox1->Rtf;
    

    funktioniert Tadellos. Also würde ich schon sagen, das die Eigenschaft beschrieben werden kann.



  • Kontrolliert die Set-Funktion vielleicht die Herkunft des System::String?
    Die Ref Classes habe doch so viele Basisvariablen, ich guck gleich mal alle Durch



  • Schluckst Du eventuell eine Exception ?
    Schalte im Debugger mal alle Exceptions an (Debuggen -> Ausnahmen) und da alles anhaken.

    Mit Deinem Code kann ich nichts anfangen, zu viel unbekannte Typen als das man es genau so zum testen aufbauen kann.



  • Nein er gibt nichts zurück

    Ich kann dir die Dll schicken, aber wenn iss einmal mit dem InsertionString() initialisiert wird, dann änderts sich doch nichts, wenn ich eine MessageBox anzeige ...



  • Ich hab nie mit ner RFT gearbeitet, Dein Quellcode zeigt das Problem nicht. Irgendwo stecken wohl Seiteneffekte die man hier nicht sieht.

    Mach ein neues Minimalprojekt das man Übersetzen kann zum Nachvollziehen und stell es mal zum Download.

    1. könnte es sein das es Dir selbst auffällt was nicht stimmt
    2. man kann man ein wenig damit spielen und sieht das Problem eventuell eher.



  • Ich werds mal probieren ich machs dann auf den Server



  • Ich machs heut Abend drauf ich muss weg , aber ich glaub es bringt nichts



  • Naja, wenn man sich nich helfen lassen will bringts auch nix ;o)

    - RTF lässt sich nicht beschreiben
    - geht tadellos, mach nen Minimalbeispiel zum testen
    - ich glaub das bringt nichts

    Bin gerne für Vorschläge offen wie man Dir bei dem Problem helfen soll



  • Wenn ich sag ich muss weg ich machs heut Abend drauf, aber ich glaube, dass es nichts bringt, dann heißt dass nicht, dass ich mir nicht Helfen lassen will, ich versteh deinen Gedankengang nicht

    Wenn du Erfahrungen damit hast, Strings in Rtf properties einzufügen, egal woher, dann verat mir warums nicht geht, dass man es einfach mir ..->Rtf=L"....." ändern kann ist mir auch klar nur möcht ich nicht schreiben

    if(red=0&&green=0&&blue=0)...->Rtf=L"...{\\colortbl ;red0green0blue;}..."
    

    Sondern die Generieren lassen

    Bin gerne für Vorschläge offen wie man Dir bei dem konstruktiven Antworten auf Fragen helfen soll



  • Jetzt kannstes aber eh vergessen, denn anstatt von irgendjemandem geholfen zu bekommen habe ichs selbst rausgefunden
    Die RTBox hat den String nicht angenommen, weil ich einen kleinen Tag vergessen hatte-.-



  • Helfen kann man nur dem, der hilfe haben will.

    Du zeigst ständig nur wie Du irgendwas in das Property schiebst und behauptest das es nicht beschreibbar ist.

    Solange Du auf diesem Standpunkt stehst wird sich da nichts ändern.

    dann verat mir warums nicht geht, dass man es einfach mir ..->Rtf=L"....." ändern kann ist mir auch klar

    Naja, ich würde sagen das etwas im restlichen Quellcode nicht stimmt den Du nicht liefern willst. Mir fällt da nicht ein was man Dir da erzählen soll.

    Btw.: Wenn ich mir die Mühe mache das was Du in der MessageBox stehen hast an ein rtf zu übergeben, erhalte ich die Exception ungültiges Dateiformat.
    Aber die Exceptions hast Du ja schon geprüft.



  • Ich weiß nicht warum der Compiler nichts zu meinem falschen Code sagte, aber die MessageBox sagte mir
    http://lhtech.lh.funpic.de/ws_image/bild.JPG

    Du gehst immer davon aus, dass andere schlechter programmieren als du, dabei habe ich noch nie vorher mit Rtf gearbeitet und kann garnicht wissen, dass die Set-Methode den Syntax überprüft und Colortables, die nicht irgendwo Referenziert werden, einfach löscht



  • Ich gehe nicht davon aus das andere schlechter Programmieren.
    Mit RTF habe ich ebenfalls nie etwas zu tun gehabt. Ich kann also nur die Informationen verwenden die Du hier postest, damit ein Testprojekt aufmachen und die Doku lesen. (Alles was ich dann machen kann ist Tips zur Fehlersuche geben - oder im selteneren Fall - mal das gesammte Projekt bzw. Beispiel im Debugger untersuchen).

    Nach der Aussage, das Du nicht in das Property schreiben kannst, es generell jedoch funktioniert, lag es nahe, das entweder eine Exception fliegt oder in einer der nicht gezeigten Codestellen etwas schief läuft.

    In der Dokumentation zum Property steht kein Hinweis auf das Verhalten oder einer Exception
    ( http://msdn2.microsoft.com/de-de/library/system.windows.forms.richtextbox.rtf(VS.80).aspx ) .

    Wäre aber noch die Sache mit der Exception zu klären, denn ohne diese dürfte das Framework viele Rätsel aufwerfen.

    Bitte in einem frischen (und später in dem aktuellen) Projekt mal folgendes machen:

    richTextBox1->Rtf = "aas";
    

    Bei der Zeile muss dann eine Exception fliegen:

    "System.ArgumentException: Ungültiges Dateiformat.
    bei System.Windows.Forms.RichTextBox.StreamIn(Stream data, Int32 flags)
    bei System.Windows.Forms.RichTextBox.StreamIn(String str, Int32 flags)
    bei System.Windows.Forms.RichTextBox.set_Rtf(String value)
    bei rtftest.Form1.button1_Click(Object sender, EventArgs e) in z:\t\rtftest\rtftest\form1.h:Zeile 111."

    (Wenn nicht lass uns das Problem mal suchen, Du stehst sonst immer wieder vor solchen Problemen).

    Ich hab keine Idee wie man es schaffen kann alle Exceptions zu ignorieren. Spätestens bei Debuggen -> Ausnahmen (http://www.rothmichael.de/cpp/Ausnahmen.png) bekommt man jede Exception um die Ohren gehauen noch bevor man diese irgendwo fangen kann.

    Ein

    Ich machs heut Abend drauf ich muss weg , aber ich glaub es bringt nichts

    Kann man dann so interpretieren:
    [subjektive interpretation]
    Schön das Du Dir gedanken darüber machst was nicht stimmen könnte, die Doku liest, googelst und Testprojekte aufbaust, aber ich hab so recht keine Lust ein Testprojekt aufzubauen, Vorschläge zu verfolgen oder mehr Details zu liefern. Ich glaube das es nichts bringt.
    [/subjektive interpretation]

    Zugegeben ist es mein Problem wen nich es so interpretiere, es ist aber auch meine Zeit die ich in eine Problemfindung stecke. Wenn man dann feststeckt tritt man halt mal nach damit es weiter geht. Das Ziel ist IMHO nicht verfehlt. Du hast Dich über meine Posts aufgeregt und Dich wieder mit Deinem Code beschäftigt und den Fehler gefunden und nicht einfach auf nette Posts und ner Kristallkugel gewartet.

    dass die Set-Methode den Syntax überprüft und Colortables, die nicht irgendwo Referenziert werden, einfach löscht

    Ok, das würde eine fehlende Exception erklären. Da ich mit RTF nie etwas gemacht habe, kann ich dies nicht nachvollziehen. (Wobei ich bei exakter eingabe dessen was in der MessageBox in Deinem Bild steht ne Exception gefangen habe.)

    try
    				 {
    					// richTextBox1->Rtf = "{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0{\fnil\charset0 Courier New;}}{\colortbl ;\red13\green62\blu21;\red23\green14\blue63;}viewkind4\uc1\pard\f0\fs18\pra}";
    					 richTextBox1->Rtf = "{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0{\fnil\charset0 Courier New;}}{\colortbl ;\red13\green62\blu21;\red23\green14\blue63;}\r\n\viewkind4\uc1\pard\f0\fs18\pra\r\n}";
    				 }
    				 catch (System::Exception ^ ex)
    				 {
    					 System::String ^ t = ex->ToString();
    					 t->ToString();
    					 MessageBox::Show(t);
    				 }
    			 }
    


  • Dann hast dus wohl eher falsch abgetippt, ich hab zu der Zeit keine exception bekommen, warscheinlich war der Syntax der Eingefügten Colortable richtig, ich hab mir ja die Specifications 1.6 Angekuckt und es so umgesetzt, aber da stand nichts davon, das unbenutzte Farben in der Colortable gelöscht werden, weil man normalerweise die Colortable erst einfügt, nachdem man ein Wort zum farbig machen ausgewählt hat, nur leider Brauch ich die Table schon vorher

    Ps.: Das Beispiel da unten funktioniert ohne Exception, auch nachdem ich alle im Debug-Menü aktiviert habe, nur wenn ich Rtf auf "aas" setze,krieg ich die File Format Exception



  • Das hier

    richTextBox1->Rtf = "aas";
    

    oder das mit dem abgetippten Text ?

    Ich habe den Text eben mehrmals kontrolliert.
    http://www.rothmichael.de/cpp/rtftest.zip

    Dort ist es exakt das was man in Deinem Screenshot sieht (mal mit und mal ohne Zeilenumbrüche).

    Wenn der Post nicht zu den Fehlern passt oder völlig wirr ist (siehe den Ursprungsthread) wirst Du Dir auch gemaule anhören.

    Wenn Du Dir nicht mal die Mühe gibst vernünftig das Problem zu beschreiben, warum sollte jemand Stunden damit vergeuden eine Lösung zu suchen ?



  • Ich hätt dir das Problem gerne näher beschrieben aber da ich keine Ahnung von Rtf habe und erst mit C++\Cli angefangen habe, kann ich das Problem nicht beschreiben

    Aber noch mal zu deinem Testprojekt:
    Seit 2001 Registriert, mehr als Dreitausend Beiträge und du hast noch nie was von Ansi Escape Sequenzen gehört?
    Der Compiler übersetzt zwischen den beiden Anführungszeichen (") alle Buchstaben/Zahlen, die hinter einem \ stehen, so wird \r\n zu einem Windows\Mac\Linux kompatiblen Linefeed( Neue Zeile, im C++ CarriageReturn(\r) oder Newline(\n) genannt), \0 beendet eine Char-Array, \" wird zu einem " und beendet nicht den String und \\ wird zu einem Kompatiblen, nicht übersetzten \, aber eigentlich müsste der Compiler dir folgendes sagen:

    ------ Build started: Project: rtftest, Configuration: Release Win32 ------
    Compiling...
    rtftest.cpp
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'd' : unrecognized character escape sequence
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'd' : unrecognized character escape sequence
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'c' : unrecognized character escape sequence
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'g' : unrecognized character escape sequence
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'g' : unrecognized character escape sequence
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'p' : unrecognized character escape sequence
    c:\gaspdev2\rtf_xt_test\rtftest\rtftest\Form1.h(112) : warning C4129: 'p' : unrecognized character escape sequence
    Linking...
    Generating code
    Finished generating code
    Embedding manifest...
    Build log was saved at "file://c:\gaspDev2\rtf_xt_test\RTFTest\rtftest\Release\BuildLog.htm"
    rtftest - 0 error(s), 7 warning(s)
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    !!!Ganze 7 Warnings!!! Ich bin schockiert
    

    Richtig heißts nämlich:

    richTextBox1->Rtf = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\\fonttbl{\\f0\\fnil\\fcharset0 Courier New;}}{\\colortbl ;\\red14\\green62\\blue21;\\red23\\green14\\blue63;}\\viewkind4\\uc1\\pard\\f0\\fs18\\par}";
    


  • Na dann sei mal froh das Du es - mit knapp 150 Posts - alleine geschafft hast auf die Idee zu kommen, das ein Fehler im RTF String sein kann und das Property doch beschreibbar ist. (oder haben die Posts vllt. garnichts damit zu tun ?)

    Vllt möchtest Du aber noch den vollständigen RTF String Posten damit später Leute die in einer RTF Box Text farbig machen wollen und den Thread nicht aus belustigung lesen, eine Lösung finden. Wie Du an mir erkennen kannst gibt es hier ja meist nur Trolle, die zu viel Zeit haben und wild raten wo das Problem sein könnte. Wir wollen ja schließlich die Qualität waren .



  • Ich meine nur dass man, wenn mann mindestens 6 Jahre mit C++ programmiert, dass man Escape Sequenzen kennt, nicht alle, aber ein paar, die Dinger sind ja nicht unwichtig, aber du Schreibst den Text 1 zu 1 ab, ohne auf die Escape Sequenzen zu achte. Wenn dann bei dir ein Fehler kommt, dann bin ich zu blöd, weil ich keine Exception bekomme, du machst ja keine Fehler

    Hier der String

    "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\\fonttbl{\\f0\\fnil\\fcharset0 Courier New;}}\ //Normaler Rtf-Header, nach dem ersten ;}} Colortable einfügen
    {\\colortbl ;\\red14\\green62\\blue21;\\red23\\green14\\blue63;}\ // \ Wird übringens auch als Zeilenfortsatz in Strings oder #defines ... verwendet
    \\viewkind4\\uc1\\pard\\cf1\\\//cf1 als Standartvordergrundfarbe setzen
    f0\\fs18 \\cf2 Ein Text in Farbe2 \\cf1 Und einer in Farbe1\\par}"
    

    Oder so



  • Ich weiß nicht wie man anhand des Registrierdatums oder der Anzahl der Posts auf kentnisse in C++ schliessen kann.

    Vermutlich fehlt mir einfach Deine Hellseherische fähigkeiten. Dann hätte ich sicherlich auch erkannt, das Dein Problem nicht:

    Der Text des Propertys RTF ändert sich nicht (schreibgeschützt ?)

    sondern

    Der Text des Propertys ist nach der Zuweisung anderst als in der Quelle

    war.

    Die Herrangehensweise der Fehlersuche ist in diesen zwei Fällen völlig unterschiedlich.

    Erstere lässt nach Exceptions suchen , letztere lässt durch die Vermutung eines eventuellen Parsens in eine völlig andere Richtung zu.

    Angesichts der Fehlerbeschreibung lag die Suche nach einer verschollenen Exception sehr nahe.

    Die Information:

    dabei habe ich noch nie vorher mit Rtf gearbeitet und kann garnicht wissen, dass die Set-Methode den Syntax überprüft und Colortables, die nicht irgendwo Referenziert werden, einfach löscht

    kam erst später und hat eine völlig andere Bedeutung als "da ändert sich nichts".

    Ich hätt dir das Problem gerne näher beschrieben aber da ich keine Ahnung von Rtf habe und erst mit C++\Cli angefangen habe, kann ich das Problem nicht beschreiben

    Das hat sicherlich auch nichts damit zu tun, das C++/CLI für Dich neu ist.

    Letzendlich hat es nun aber allen was gebracht:

    - Der Beitrag dürfte für mitlesende mehr Entertainment als Fachdiskussion gewesen sein
    - Du hast den Fehler gefunden und ggf. die Option "Debuggen -> Ausnahmen" kennen gelernt und eventuell gemerkt das manchmal eine genaue Fehlerbeschreibung eher ans Ziel führt
    - Ich vergesse Escapesequenzen nach all den Jahren C++ Pause sicherlich nicht mehr so schnell, hab etwas über RTF und RTBox gelernt und ruhiger werden muss.

    Btw.: Fehler mache ich ne menge und hier im Forum meist weil ich zu flüchtig über die Texte lese.

    Also vielen Dank für den RTF String (und Kommentare)

    "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\\fonttbl{\\f0\\fnil\\fcharset0 Courier New;}}\ //Normaler Rtf-Header, nach dem ersten ;}} Colortable einfügen
    {\\colortbl ;\\red14\\green62\\blue21;\\red23\\green14\\blue63;}\ // \ Wird übringens auch als Zeilenfortsatz in Strings oder #defines ... verwendet
    \\viewkind4\\uc1\\pard\\cf1\\\//cf1 als Standartvordergrundfarbe setzen
    f0\\fs18 \\cf2 Ein Text in Farbe2 \\cf1 Und einer in Farbe1\\par}"
    

    so hab ich an der Sache mehr gelernt als beigetragen.


Log in to reply