// Dieser Code dient der Erstellung einer Label-Komponente, die es
// erlaubt jeden Buchstaben in einer anderen Farbe darzustellen.
// Um grössere Rechenarbeiten zu umgehen, werden einige Eigenschaften
// nicht unterstützt
(wie z.B. Font.Style). Dafür kann aber der Text auch mit
// einem Farbverlauf angezeigt werden. Gesteuert wird das Ganze über
// die Eigenschaft
Bunt. Hier wird angegeben, wieviel Zeichen in welcher
// Farbe dargestellt werden:
// BLabel1.Bunt:='1 clblue 5 $0055FF 1 $99FFFF';
// Ergebnis: der erste Buchstabe ist blau, die nächsten fünf sind rötlich
// und der siebente ist gelblich.
// Für Farbverläufe werden Anfangsfarbe und Endfarbe hinter dem
// Wort "Verlauf1" bzw. "Verlauf2" angegeben:
//
BLabel1.Bunt:='verlauf1 clyellow clred'; oder
// BLabel1.Bunt:='verlauf2 0 cllime';

//
unit BLabel; 
 
interface 
 
uses 
  Windows, 
  SysUtils, 
  Classes, 
  Graphics, 
  StdCtrls; 
 
type 
  TBlabelChange = procedure(Sender: TObject; TextBreite: Integer) of object; 
  TBLabel = class(TCustomLabel) 
  private 
    FChange: TBlabelChange; 
    farb, merk: string; 
    sl: TStringlist; 
    bu: TFontname; 
    gr, l, verl, vrt, wl: integer; 
    bld: boolean; 
    links, rechts: TColor; 
  protected 
    procedure setfarb(s: string); 
    procedure setbu(f: TFontname); 
    procedure setgr(i: integer); 
    procedure dazu; 
    procedure machvrt; 
    procedure setbld(b: boolean); 
    procedure verlauf; 
    function wandeln(s: string): TColor; 
    procedure position; 
    procedure loaded; override; 
  public 
    procedure paint; override; 
    constructor Create(Owner: TComponent); override; 
    destructor Destroy; override; 
  published 
    property OnCaptionChange: TBlabelChange read fchange write fchange; 
    property Bunt: string read farb write setfarb; 
    property FontName: TFontname read bu write setbu; 
    property FontSize: integer read gr write setgr; 
    property FontBold: boolean read bld write setbld; 
    property Autosize; 
    property Color; 
    property Enabled; 
    property Caption; 
    property Visible; 
    property Transparent; 
    property OnClick; 
    property OnDblClick; 
    property OnMouseDown; 
    property OnMouseMove; 
    property OnMouseUp; 
    property Alignment; 
    property Layout; 
  end; 
 
procedure Register; 
 
implementation 
 
constructor TBLabel.Create(Owner: TComponent); 
begin 
  inherited Create(Owner); 
  farb := '1 CLBLUE 5 $55FF 2 $9900'; 
  sl := TStringlist.create; 
  bu := font.name; 
  gr := font.size; 
  sl.commatext := farb; 
  dazu; 
end; 
 
procedure TBLabel.dazu; 
begin 
  if odd(sl.count) then sl.add('0'); 
  sl.add('255'); 
  sl.add('0'); 
end; 
 
destructor TBLabel.Destroy; 
begin 
  sl.free; 
  inherited Destroy; 
end; 
 
procedure TBLabel.loaded; 
begin 
  merk := caption; 
  inherited; 
end; 
 
procedure TBLabel.setbu(f: TFontname); 
begin 
  if f = bu then exit; 
  bu := f; 
  canvas.font.name := bu; 
  font.name := bu; 
end; 
 
procedure TBLabel.setgr(i: integer); 
begin 
  if i = gr then exit; 
  gr := i; 
  canvas.font.size := gr; 
  font.size := gr; 
end; 
 
procedure TBlabel.machvrt; 
var h: integer; 
begin 
  h := canvas.textheight(caption); 
  case layout of 
    tlBottom: vrt := height - h; 
    tlCenter: vrt := (height - h) div 2; 
    tlTop: vrt := 0; 
  end; 
end; 
 
function TBLabel.wandeln(s: string): TColor; 
begin 
  try 
    result := StringToColor(s); 
  except 
    result := $FFFFFF; 
  end; 
end; 
 
procedure TBLabel.position; 
var x, lks: integer; 
begin 
  wl := 0; 
  l := length(caption); 
  with canvas do begin 
    for x := 1 to l do wl := wl + textwidth(caption[x]); 
    if (width < wl) and autosize then begin 
      if alignment = tarightjustify then left := left - wl + width; 
      width := wl; 
    end; 
    if alignment = tarightjustify then lks := width - wl else 
      if alignment = tacenter then lks := (width - wl) div 2 else 
        lks := 0; 
    moveto(lks, vrt); 
  end; 
end; 
 
procedure TBLabel.verlauf; 
var x, r1, r2, g1, g2, b1, b2, r, g, b: integer; 
begin 
  r1 := getrvalue(links); 
  g1 := getgvalue(links); 
  b1 := getbvalue(links); 
  r2 := getrvalue(rechts); 
  g2 := getgvalue(rechts); 
  b2 := getbvalue(rechts); 
  r := (r2 - r1) div l; 
  g := (g2 - g1) div l; 
  b := (b2 - b1) div l; 
  with canvas do begin 
    for x := 1 to (l div verl) do begin 
      font.color := rgb(r1, g1, b1); 
      textout(penpos.x, vrt, caption[x]); 
      inc(r1, r * verl); 
      inc(g1, g * verl); 
      inc(b1, b * verl); 
    end; 
    if verl = 2 then 
      for x := (l div 2) + 1 to l do begin 
        font.color := rgb(r1, g1, b1); 
        textout(penpos.x, vrt, caption[x]); 
        dec(r1, r * 2); 
        dec(g1, g * 2); 
        dec(b1, b * 2); 
      end; 
  end; 
end; 
 
procedure TBLabel.Paint; 
var x, j, k: integer; 
  b: byte; 
begin 
  if (not enabled) then inherited 
  else begin 
    machvrt; 
    with canvas do begin 
      if transparent then brush.style := bsclear 
      else begin 
        brush.color := color; 
        brush.style := bssolid; 
        canvas.fillrect(canvas.cliprect); 
      end; 
      position; 
      if merk <> caption then begin 
        if assigned(fchange) then fchange(self, wl); 
        merk := caption; 
      end; 
      if caption <> '' then begin 
        if verl > 0 then 
          verlauf else begin 
          j := 0; k := 1; 
          repeat 
            if j < sl.count then 
              font.color := wandeln(sl.strings[j + 1]); 
            try 
              b := abs(strtoint(sl.strings[j])); 
            except b := 0; end; 
            for x := 0 to b - 1 do begin 
              textout(penpos.x, vrt, caption[x + k]); 
              if x + k = l then exit; 
            end; 
            inc(k, b); 
            inc(j, 2); 
          until false; 
        end; 
      end; 
    end; 
  end; 
end; 
 
procedure TBLabel.setbld(b: boolean); 
begin 
  if b = bld then exit; 
  bld := b; 
  if b then font.style := font.style + [fsbold] 
  else font.style := font.style - [fsbold]; 
  canvas.font.style := font.style; 
end; 
 
procedure TBLabel.setfarb(s: string); 
begin 
  if farb = s then exit; 
  farb := s; 
  sl.commatext := farb; 
  dazu; 
  sl.strings[0] := uppercase(sl.strings[0]); 
  if (sl.strings[0] = 'VERLAUF1') 
    or (sl.strings[0] = 'VERLAUF2') 
    then begin 
    verl := strtoint(sl.strings[0][8]); 
    links := wandeln(sl.strings[1]); 
    rechts := wandeln(sl.strings[2]); 
  end else verl := 0; 
  repaint; 
end; 
 
procedure Register; 
begin 
  RegisterComponents('DBR', [TBLabel]); 
end; 
 
end.


Zugriffe seit 6.9.2001 auf Delphi-Ecke