Mit Blocksatz auf TLabel schreiben



  • Hallo zusammen,
    ich habe ein Label mit der Eigenschaft WordWrap = true. Nun möchte ich mit Blocksatz darauf schreiben. Gibt es da eine Möglichkeit oder muss ich das selbst mühsam mit \n machen?

    Danke



  • Blocksatz musst Du schon selbst implementieren, das kann ein Label nicht. Allerdings ist das schon ein bißchen mehr Arbeit, als nur ein paar Zeilenumbrüche zu machen, zumindest so lange Du die Standardschrift verwendest. Mit Zeilenumbrüchen funktioniert das nur, wenn Du eine Schriftart mit fester Zeichenbreite verwendest.

    Vielleicht gibt es ja was in der WinAPI...



  • Ich meine bei TLabel kann man mit der Eigenschaft Alignment rumspielen, dann wird der Text link-rechts-mittig positioniert.

    Setze zuerst die Eigenschaft AutoSize=false
    dann ziehe das TLabel etwas auseinander und
    setze Alingment=taCenter.
    ggf. noch mit WordWrap rumspielen.

    Gruß Hawk



  • Sorry, habe es missverstanden.

    Blocksatz geht nicht so einfach, da hat Joe_M schon recht, da musst du mit der WinAPI rumspielen, fange am besten mit den WM-Messages eines Labels an, oder mit SetWindowLong.



  • EDIT: Hat sich schon erledigt...



  • Hawkxxx schrieb:

    da musst du mit der WinAPI rumspielen, fange am besten mit den WM-Messages eines Labels an, oder mit SetWindowLong.

    Messages brauchts nich...
    zum Ziel gehts mit
    Win-Api : SetTextJustification



  • Danke schonmal! Und wie würde ein Beispielaufruf von SetTextJustification aussehen?



  • Hi,

    im meinem Beispiel werden die Strings aus einem Memo ausgelesen, für den Blocksatz formatiert und auf ein Panel
    gezeichnet:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        HWND hWnd  = Panel1->Handle;
        HDC  hDC   = GetDC( hWnd );
        int  yline = 10;
    
        for ( int i = 0; i < Memo1->Lines->Count; i++ ) {
            String Txt = Memo1->Lines->Strings[i];
    
            SIZE   size;
            int    spaces = 0;
            bool getTEP32 = GetTextExtentPoint32( GetDC(Memo1->Handle), Txt.c_str(), Txt.Length(), &size );
            for ( int j = 1; j < Txt.Length(); j++) {
                if ( Txt[j] == ' ')
                    spaces++;
            }
            SetTextJustification( hDC, Panel1->Width - 20 - size.cx, spaces );
            TextOut( hDC, 5, yline, Txt.c_str(), Txt.Length() );
            yline += 15;
        }
    }
    

    Mit einem TLabel wirds so nicht gehen.
    TODO: Schriftfont und Hintergrundfarbe der Schrift anpassen.

    mfg
    kpeter



  • Hallo,

    muss noch ein Posting nachsenden.
    Mit einem cast auf das Canvas eines TLabels ist auch dieses bereit, Blocksatz darzustellen.
    Der darzustellende Text kann natürlich aus einem Array o.ä. geladen werden.

    Naja, das ganze wäre ein Anlass, um eine entsprechende eigene Komponente zu schreiben; 😉
    mE. hat keine der BCB-Kompos eine Textausrichtung im Block...

    void __fastcall TForm1::btn1Click(TObject *Sender)
    {
        TCanvas* cv = dynamic_cast<TCanvas*>(Label1->Canvas);
        int  yline  = 10;  
        for ( int i = 0; i < Memo1->Lines->Count; i++ ) {
            String Txt = Memo1->Lines->Strings[i];
            SIZE   size;
            int    spaces = 0;    // Ermitteln der Leerzeichen
            GetTextExtentPoint32( cv->Handle, Txt.c_str(), Txt.Length(), &size );
            for ( int j = 1; j < Txt.Length(); j++) {
                if ( Txt[j] == ' ')
                    spaces++;
            }
            int dist = 20;       // Seitendistanz, margin; ausprobieren
            SetTextJustification( cv->Handle, Label1->Width - dist - size.cx, spaces );
            TextOut( cv->Handle, 5, yline, Txt.c_str(), Txt.Length() );
    
            yline += 15;  // Zeilendistanz
        }
    }
    

    edit Kommentare

    mfg
    kpeter


Anmelden zum Antworten