Lauftext - Ticker



  • hallo..

    ich schreibe grade an einen news ticker fuer slashdot.org oder andere.
    meine frage ..
    wie wuerdet ihr eine laufschrift schreiben 😕
    mit TLabels ????
    DDraw wollte ich nicht verwenden .. wegen NT4

    danke gruss rene

    [ Dieser Beitrag wurde am 11.05.2002 um 22:35 Uhr von Jansen editiert. ]



  • Mit Labels usw. ist es bestimmt am einfachsten.

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      String str = Label1->Caption;
      str += str[1];
      str.Delete(1, 1);
      Label1->Caption = str;
      Application->ProcessMessages();
    }
    

    Allerdings wird das immer etwas ruckelig und unruhig wirken, da ja stets komplette Buchstaben ausgetauscht werden, die zudem unterschiedlich breit sein können.

    Vielleicht könnte man mit direktem Zeichnen auf dem Canvas per TextOut o.ä. ein besseres Ergebnis erzielen, 'ne richtige Idee habe ich aber im Moment auch nicht.



  • naja ruckelig sollte es nicht sein ..
    ich wollte das schon pixel fuer pixel verschieben



  • Schau mal (mit hilfe der Suchfunktion!) im Forum nach "Doublebuffering". Das sollte dir auch etwas helfen (:

    -junix



  • das habe ich schon gemacht.. leider.. finde ich nur einen thread

    geht denn Doublebuffering mit TLabels.. (sinnvoll)

    versucht habe ich das schon ..
    lS1 und lS2 sind zwei labels ..

    void __fastcall Taddon::scrTimerTimer(TObject *Sender)
    {
      if(lS1->Visible)
      {
            lS1->Visible = false;
            lS2->Visible = true;
            lS1->Left = lS2->Left - 1;
            lS1->Repaint();
      }
      else
      {
            lS2->Visible = false;
            lS1->Visible = true;
            lS2->Left = lS1->Left - 1;
            lS2->Repaint();
      }
      if((lS1->Width + lS1->Left)<0)
      {
        lS1->Left = 200;
        lS2->Left = 200;
      }
    }
    

    leider ist das auch kein schoenes ergebniss..



  • Ich hab mal auf die Schnelle mit einem TLabel was gebastelt.
    Form mit einem TLabel und einem Text drinnen.
    Definiere unter private: der Form folgende Variablen:

    Graphics::TBitmap *SaveBitmap;
    TRect SrcRect;
    TRect DestRect;
    TRect LeftRect;
    TRect RightRect;
    

    In FormCreate der Form kommt folgender Code:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        SaveBitmap=new Graphics::TBitmap();
        SaveBitmap->Height=Label1->Height;
        SaveBitmap->Width=1;
    
        SrcRect.left=1;
        SrcRect.top=0;
        SrcRect.right=Label1->Width;
        SrcRect.bottom=Label1->Height;
    
        DestRect.left=0;
        DestRect.top=0;
        DestRect.right=Label1->Width-1;
        DestRect.bottom=Label1->Height;
    
        LeftRect.left=0;
        LeftRect.top=0;
        LeftRect.right=1;
        LeftRect.bottom=Label1->Height;
    
        RightRect.left=Label1->Width-1;
        RightRect.top=0;
        RightRect.right=Label1->Width;
        RightRect.bottom=Label1->Height;
    }
    

    Im FormDestroy der Form nicht vergessen:

    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
        delete SaveBitmap;
    }
    

    Jetzt noch nen TTimer auf die Form ziehen, Intervall auf 25 oder so und in das TimerEvent:

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        SaveBitmap->Canvas->CopyRect(LeftRect, Label1->Canvas, LeftRect);
        Label1->Canvas->CopyRect(DestRect, Label1->Canvas, SrcRect);
        Label1->Canvas->CopyRect(RightRect, SaveBitmap->Canvas, LeftRect);
    }
    

    Jetzt erfolgt Smooth-Scrolling des Textes. Bei mir hats nicht mehr geruckelt.
    (Keine Garantie auf Fehlerfreiheit images/smiles/icon_wink.gif )



  • Bisher bei weitem die beste Lösung!
    Noch ein Tip zur Tipp-Ersparnis beim Initialisieren der Rects:

    SrcRect = Bounds(1, 0, Label1->Width, Label1->Height);
    


  • Seehhr geil! So ähnlich hatte ich mir das auch gedacht. Es ist einfach besser, wenn man Zeichenoperationen sich im Hintergrund abspielen lässt. Man muß bloß aufpassen, daß man TLabel::AutoSize auf false setzt.

    Mir ist aber gerade aufgefallen, daß das alles sehr langsam geht. Und wenn man während der Laufzeit den Cursor über den Quellcode-Editor des Builders bewegt, dann läuft der Text schneller. Ist alles noch nicht so ausgereift.

    [ Dieser Beitrag wurde am 18.02.2002 um 21:37 Uhr von WebFritzi editiert. ]



  • daß das alles sehr langsam geht

    Kann ich nicht bestätigen.
    Hier läuft das sowohl auf'm Athlon 1700+/Voodoo5/Win2000 als auch auf'm alten Notebook mit P133 und Cirrus Billiggrafik unter Win98 flüssig.

    Auch einen Zusammenhang zwischen Mausbewegungen und Scrollgeschwindigkeit kann ich nicht feststellen.

    Das einzige Problem, das ich sehe, ist, dass bei Überdeckungen durch andere Fenster das Label ab und zu nicht wieder ordentlich neugezeichnet wird.



  • hey Peter das ist geht echt super so..

    DANKE DANKE DANKE
    images/smiles/icon_smile.gif



  • nur ein problem gibts noch.. images/smiles/icon_sad.gif
    was machen ich, wenn ich einen text habe der laenger ist als meine Form oder sogar mein screen.

    kann man das auch im hintergrund abarbeiten ?



  • Dann wirds etwas umfangreicher. Hab leider keine Zeit um eine Lösung auszuarbeiten. Ich denke aber da spontan an einen "virtuellen" Canvas in dem der Text gespeichert ist. Dieser Text wird dann "fensterweise" ausgelesen, das "Fenster" muss so gross sein wie das Label und wird dann ins Label kopiert. Das "Fenster" wird dann pixelweise im Quellcanvas verschoben. Nur so ganz grob, wie ich an eine Lösung rangehen würde. Vielleicht gibts ja auch noch andere Ansätze ...



  • danke Peter..
    aber ich werde einfach in das SaveBitmap
    ein

    SaveBitmap->Canvas->TextOutA(0,0,text);
    

    schreiben und aus dem ins label kopieren..

    DANKE nochmal



  • Jou, so hab ich mir das auch gedacht und dann halt ausschnittsweise ins Label kopieren. Wenn Du auf einen Rundlauf des Textes verzichten kannst, dann mach am Anfang und am Schluss des SaveBitmaps ein leeres Stück in der Länge des Labels rein. So kannst Du den Ausschnitt vom Anfang bis zum Ende "durchschieben" und dann gleich wieder von vorne beginnen, wenn Du verstehst was ich meine images/smiles/icon_wink.gif



  • ja genau so habe ich das im moment..
    geht prima..

    images/smiles/icon_smile.gif


Anmelden zum Antworten