// Eine Laufschrift
wird links- und/oder rechtsseitig weich ausgeblendet. type ausbl = (abLinks, abRechts, abBeide, abNichts); var schrift: string = ' + + + Laufschrift'; auslaufzone: integer = 60; fontsize: integer = 10; fase: integer = 0; step: integer = 1; // empfohlen fontname: string = 'MS Sans Serif'; fontstyle: TFontstyles; ausblendFarbe, hintergrund, schriftFarbe: TColor; rh, gh, bh, ra, ga, ba: byte; bm: TBitmap; sbreite, links, oben: integer; breite: integer = 0; // 0 = Schrift komplett anzeigen wo: ausbl = abLinks; // welche Seite(n) nachricht: boolean = True; // True = Abbruch bei Konfigurationsfehler procedure TForm1.config; var size: TSize; begin Timer1.enabled := false; ausblendFarbe := colortorgb(ausblendFarbe); hintergrund := colortorgb(hintergrund); self.refresh; with bm, bm.canvas do begin pixelformat := pf24bit; font.size := fontsize; font.name := fontname; font.style := fontstyle; canvas.font.color := schriftFarbe; size := TextExtent(schrift); height := 3 + size.cy; sbreite := size.cx + ord(fsItalic in fontstyle) * (fontsize div 5); if breite = 0 then breite := sbreite else if breite > sbreite then begin if nachricht then raise exception.create('Breite für Text zu groß!') else breite := sbreite; end; width := breite; end; if fase <= -sbreite then fase := 0; ra := getrvalue(ausblendFarbe); ga := getgvalue(ausblendFarbe); ba := getbvalue(ausblendFarbe); rh := getrvalue(hintergrund); gh := getgvalue(hintergrund); bh := getbvalue(hintergrund); if ((wo in [abLinks, abRechts]) and (bm.width < auslaufzone) or (wo = abBeide) and (bm.width < auslaufzone * 2)) then begin if nachricht then raise exception.create('Auslaufzone zu groß!'); end else Timer1.enabled := true; end; procedure TForm1.FormCreate(Sender: TObject); begin bm := TBitmap.create; hintergrund := color; ausblendFarbe := hintergrund; schriftfarbe := clGreen; fontstyle := []; links := 100; oben := 20; config; // immer zu Anfang (nach Festlegung von Werten) aufrufen Timer1.Interval := 55; end; procedure TForm1.FormDestroy(Sender: TObject); begin bm.free; end; procedure TForm1.ausblenden; var p: PByteArray; x, y, a, b, c, z, b3: integer; begin b3 := bm.width * 3; b := auslaufzone * 3; c := b3 - b; for y := 0 to bm.height - 1 do begin p := bm.scanline[y]; if wo in [abLinks, abBeide] then begin x := 0; while x < b do begin if ((p[x] <> bh) or (p[x + 1] <> gh) or (p[x + 2] <> rh)) then begin a := b - x; p[x] := (p[x] * x + ba * a) div b; p[x + 1] := (p[x + 1] * x + ga * a) div b; p[x + 2] := (p[x + 2] * x + ra * a) div b; end; inc(x, 3); end; end; if wo in [abRechts, abBeide] then begin x := b3; while x >= c do begin if ((p[x] <> bh) or (p[x + 1] <> gh) or (p[x + 2] <> rh)) then begin a := b3 - x; z := x - c; p[x] := (p[x] * a + ba * z) div b; p[x + 1] := (p[x + 1] * a + ga * z) div b; p[x + 2] := (p[x + 2] * a + ra * z) div b; end; dec(x, 3); end; end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin with bm do begin // --- entweder --- canvas.brush.color := hintergrund; canvas.fillrect(canvas.cliprect); // --- oder ------- // canvas.draw(0, 0, aPicture); // ----------------- canvas.brush.style := bsClear; canvas.TextOut(fase, 1, schrift); canvas.TextOut(fase + sbreite, 1, schrift); end; ausblenden; canvas.draw(links, oben, bm); dec(fase, step); if fase <= -sbreite then fase := 0; end; // Beispiel für Änderungen procedure TForm1.Button4Click(Sender: TObject); begin wo := abBeide; breite := 82; // Breite des Laufschriftfeldes schrift := ' + + + Das ist ein Test für eine ' + 'Laufschrift, welche breiter ist als der Wert in der Variablen "Breite" '; step := 2; auslaufzone := 25; hintergrund := $DA; schriftfarbe := clYellow; ausblendfarbe := clBlack; fontname := 'Times New Roman'; fontstyle := [fsBold]; fontsize := 12; Timer1.Interval := 35; config; // unbedingt immer nach Änderungen aufrufen end; |
Zugriffe seit 6.9.2001 auf Delphi-Ecke