TStringList LoadFromFile Zeilenumbruch



  • Hallo,
    ich habe da ein Problem mit einem fehlenden Zeilenumbruch nach dem Einlesen einer Textdatei.
    Ich nutze eine Vorlagendatei (Bodytext.txt), um den Inhalt der Datei als EMail-Bodytext zu verschicken. Für die Mail nutze ich "TOutlookApplication".

    Hier mal mein Code:

            _MailItemPtr MItem = DataModule2->ola->CreateItem(0);	
            TStringList *body=new TStringList();
    	body->LoadFromFile(sBODYFILE);
    	MItem->HTMLBody = body->GetText();
    

    In der Textdatei gibt es einen dreizeiligen Text. Dieser wird in der Mail nun in einer Zeile ohne Zeilenumbruch angezeigt. Wie bekomme ich also den Zeilenumbruch dort rein?

    Danke und Gruß
    Torsten



  • Morchn,

    versuch mal das hier:

        TStringList *body=new TStringList;
    body->LoadFromFile(sBODYFILE);
    for( int i = 0; i < body->Count; i++ )
           MItem->HTMLBody = body->Strings[i];
    

    Nur mal so aus der Hüfte geschossen, muss also noch angepasst werden.

    Ach ja, schau dir mal TStrings::GetText in der BCB Hilfe an.



  • @Smitty sagte in TStringList LoadFromFile Zeilenumbruch:

    new
    

    Schmerzen. Große. Schmerzen.



  • @Swordfish sagte in TStringList LoadFromFile Zeilenumbruch:

    @Smitty sagte in TStringList LoadFromFile Zeilenumbruch:

    new
    

    Schmerzen. Große. Schmerzen.

    Dafür gibts Aspirin. Und delete

    🙂



  • @Smitty sagte in TStringList LoadFromFile Zeilenumbruch:

    TStringList *body=new TStringList;
    body->LoadFromFile(sBODYFILE);
    for( int i = 0; i < body->Count; i++ )
       MItem->HTMLBody = body->Strings[i];
    

    nicht eher sowas wie

    TStringList *body=new TStringList;
    body->LoadFromFile(sBODYFILE);
    for( int i = 0; i < body->Count; i++ ) {
        MItem->HTMLBody += body->Strings[i]; // TODO: Escape HTML special chars
        MItem->HTMLBody += "<br/>";
    }
    


  • Hi,

    war bereits auch auf dem Weg dass man Steuerzeichen mit einbringen muss. Habe es nun wie du beschrieben hast umgesetzt:

    	TStringList *body=new TStringList();
    	body->LoadFromFile(sBODYFILE);
    	String sVALUE;
    	for(int i = 0; i < body->Count; i++)
    	{
    		//MItem->HTMLBody = body->GetText(); //--> hier wird der Text OHNE Zeilenumbruch ausgegeben
    		MItem->HTMLBody += body->Strings[i].w_str();
    		MItem->HTMLBody += "<br/>";
    
    	}
    

    Bekomme aber diesen Fehler:

    [BCC32 Fehler] UnUeber_Tag.cpp(586): E2085 Unzulässige Zeigeraddition
    

    Gruß
    Torsten



  • @torsten_156 sagte in TStringList LoadFromFile Zeilenumbruch:

    MItem->HTMLBody += "<br/>"

    1. Stell dein Projekt auf den clang-Compiler bcc32c um!*
    2. Probier mal
    MItem->HTMLBody += L"<br/>";
    

    oder

    MItem->HTMLBody += String( "<br/>" );
    

    PS:

    • Wenn du das RAD Studio 10.x benutzen solltest.


  • Bekomme den Feher bereits hier:

    MItem->HTMLBody += body->Strings[i].w_str();
    

    Ich nutze C++Builder 2010. In den Compiler-Optionen finden ich eine Umstellung auf "bcc32c" leider nicht. Kann es sein, dass ich das in meiner Version nicht umstellen kann?



  • @torsten_156
    Ne, im RAD Studio 2010 gibt´s den clang-Compiler noch nicht.
    Welchen Typ hat denn MItem->HTMLBody?



  • _MailItemPtr MItem = DataModule2->ola->CreateItem(0);
    

    Wobei ola = TOutlookApplication ist...



  • Habe jetzt gesehen, dass es auch

    MItem->set_HTMLBody()
    

    gibt. Damit kann ich schon mal einen zweizeiligen Text verfassen:

    MItem->set_HTMLBody(L"Zeile 1 <br/> Zeile 2");
    

    Jetzt versuche ich es mal damit meine StringList in die Mail zu bekommen.



  • @torsten_156
    Nein, das meinte ich nicht. MItem->HTMLBody ist ein Delphi Property, das zum Lesen get_HTMLBody und zum setzen set_HTMLBody() aufruft. Zwischen MItem->HTMLBody = L"Zeile 1 <br> Zeile 2" und MItem->set_HTMLBody( L"Zeile 1 <br> Zeile 2" ) gibt es keinen Unterschied. Der Typ von MItem->HTMLBody ist BSTR, deswegen darfst du da auch nicht einfach zwei Zeiger addieren. Ich bin mir da nicht ein Mal sicher, ob du da direkt einen Zeiger zuweisen darfst, oder ob du den per Zuweisung setzen darfst. Und ob du den vorherigen Speicher nicht freigeben musst, oder ob das der Delphi Wrapper für dich erledigt. Ich kenne mich damit aber auch nicht wirklich aus, vielleicht weiß da jemand mehr.
    Aber wirf mal einen Blick hierauf:
    Allocating and Releasing Memory for a BSTR und
    SysAllocString function



  • @torsten_156: Du stellst dich da aber ein wenig unbeholfen an - du solltest dir wirklich die Mühe machen, die einzelnen Datentypen zu unterscheiden lernen (insb. eben durch die gelieferten Fehlermeldungen).

    Erzeuge einfach eine temporäre String-Variable und füge dort in der Schleife die einzelnen Zeilen hinzu.
    Und nach der Schleife weist du diese String-Variable dann dem HTMLBody zu.



  • Genau das habe ich jetzt gemacht:

    	for(int i = 0; i < body->Count; i++)
    	{
    		sVALUE += body->Strings[i];
    		sVALUE += "<br/ ";
    
    		//MItem->HTMLBody = body->GetText(); //--> hier wird der Text OHNE Zeilenumbruch ausgegeben
    //		MItem->HTMLBody += body->Strings[i].w_str();
    //		MItem->HTMLBody += "<br/>";
    
    
    	}
    
    	MItem->set_HTMLBody(WideString(sVALUE).c_bstr());
    

    Compiliert wird das ganze. Doch die Ausgabe in der Mail zeigt lediglich die erste Zeile an. Hier mal der Inhalt der drei Zeilen;

    Zeile 1 = "Sehr geehrte Damen und Herren,"
    Zeile 2 = "anbei die Liste der letzen Woche."
    Zeile 3 = " Mit freundlichen Grüßen"

    Wenn ich mir den String im Debugger ansehe, wird er korrekt gebildet. Nach jeder Zeile wird ein <br/> eingefügt. Nur die Ausgabe in der Mail zeigt nur die erste Zeile an!



  • @torsten_156 sagte in TStringList LoadFromFile Zeilenumbruch:

    sVALUE += "<br/ ";

    Fehlt da nicht eine Klammer-zu (>)?

    Edit: Falls das nur ein Schreibfehler hier im Forum war, dann schau dir mal den HTML-Quelltext der erzeugten Mail an.



  • Ups, stimmt. Ist korrigiert...

    Einen ersten Zeilenumbruch habe ich jetzt schon mal.Leider wird nicht der ganze Text eingefügt!? Er stoppt hier:

    Sehr geehrte Damen und Herren,
    anbei die Liste d
    
    

    Was ist das denn jetzt???



  • Warum <br/> und nicht <br>?



  • Ich tippe auf ANSI/WideString-Probleme.
    Brauchst du wirklich WideString?

    Gib mal mehr Zeilen aus. Erhältst du dann einen längeren Text?



  • Das Ding ist ein BSTR! Wer besitzt den denn? Und wird bei der Zuweisung wirklich eine Kopie der Zeichenkette erzeugt oder wird nur der Pointer auf die Zeichenkette gesetzt und wird nach Zerstörung des temp. Strings zu einem dangling pointer?



  • @Th69 sagte in TStringList LoadFromFile Zeilenumbruch:

    Ich tippe auf ANSI/WideString-Probleme.
    Brauchst du wirklich WideString?

    Gib mal mehr Zeilen aus. Erhältst du dann einen längeren Text?

    Ich habe jetzt mal in der Vorlagendatei zehn Zeilenümbrüche (ENTER) angefügt. Nun wird mit der gesamte Text der Vorlagendatei ausgegeben. 🙂

    Verstehe aber nicht warum???

    Danke und Gruß
    Torsten


Log in to reply