如何从字符串中设置单个字符颜色并在TLabel中显示?

时间:2013-08-28 13:44:10

标签: delphi

我有一个Delphi XE2项目。我的目标是将单个字符与字符串分开,然后在滚动Font Color后显示所有字符后更改TLabel
基本上我的项目是显示Scrolling Tex,每个字符的颜色与prevoius字符不同。字符颜色将根据Color Slider而有所不同 Color Slider 所以我实现了以下逻辑:

  1. 使用Timer1 LeftMostCharacter将被分开,颜色将被更改,然后它将被添加到Label1Label1将从右向左滚动。
  2. 使用Timer2 RightMostCharacter将被分开,颜色将被更改,然后它将被添加到Label1Label1将从左向右滚动。
  3. 所以我写了以下代码:
        单位Unit1;

    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
    
    type
      TMainForm = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Timer1: TTimer;
        Timer2: TTimer;
        Button1: TButton;
        Button2: TButton;
        procedure Timer1Timer(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      MainForm: TMainForm;
    
    implementation
    
    {$R *.dfm}
    
    procedure TMainForm.Button1Click(Sender: TObject);
    begin
      Timer1.Enabled := true;
      Timer2.Enabled := true;
    end;
    
    procedure TMainForm.Button2Click(Sender: TObject);
    begin
      Timer1.Enabled := false;
      Timer2.Enabled := false;
    end;
    
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      MainForm.Color := RGB(41, 41, 41);
      Timer1.Interval := 100;
      Label1.Font.Color := RGB(000, 255, 000);
      Label1.Caption := ' Koushik Halder''s Left Scrolling Text Effect Example 001 Koushik Halder''s Left Scrolling Text Effect Example 001 ';
      Timer2.Interval := 100;
      Label2.Font.Color := RGB(000, 000, 255);
      Label2.Caption := ' Koushik Halder''s Right Scrolling Text Effect Example 001 Koushik Halder''s Right Scrolling Text Effect Example 001 ';
    end;
    
    procedure TMainForm.Timer1Timer(Sender: TObject);
    var
      StringLength01: integer;
      LeftScrollingText: string;
      LeftMostCharacter: string;
    
      R1, G1, B1: Integer;
      IncrementalFactor, DecrementalFactor: Integer;
    begin
      IncrementalFactor := 15;  //  May Be '01', '05', '15'
      DecrementalFactor := 15;  //  May Be '01', '05', '15'
    
      // Get The Leftmost Character From Label1.Caption
      StringLength01 := Length(Label1.Caption);
      LeftMostCharacter  := Label1.Caption[1];
    
      R1 := GetRValue(ColorToRGB(Label1.Font.Color));
      G1 := GetGValue(ColorToRGB(Label1.Font.Color));
      B1 := GetBValue(ColorToRGB(Label1.Font.Color));
      if (R1 = 255) and (G1 = 000) and (B1 < 255) then
        begin
          B1 := B1 + IncrementalFactor;
        end
      else if (R1 > 000) and (G1 = 000) and (B1 = 255) then
        begin
          R1 := R1 - DecrementalFactor;
        end
      else if (R1 = 000) and (G1 < 255) and (B1 = 255) then
        begin
          G1 := G1 + IncrementalFactor;
        end
      else if (R1 = 000) and (G1 = 255) and (B1 > 000) then
        begin
          B1 := B1 - DecrementalFactor;
        end
      else if (R1 < 255) and (G1 = 255) and (B1 = 000) then
        begin
          R1 := R1 + IncrementalFactor;
        end
      else if (R1 = 255) and (G1 > 000) and (B1 = 000) then
        begin
          G1 := G1 - DecrementalFactor;
        end
      else
        begin
          Timer1.Enabled := false;
        end;
      Label1.Font.Color := RGB(R1, G1, B1);
    
      // Trim The Strings
      Label1.Caption := Copy(Label1.Caption, 2, StringLength01 -1);
      LeftScrollingText := Label1.Caption + LeftMostCharacter;
      Label1.Caption := LeftScrollingText;
    end;
    
    procedure TMainForm.Timer2Timer(Sender: TObject);
    var
      StringLength02: integer;
      RightScrollingText: string;
      RightMostCharacter: string;
    
      R2, G2, B2: Integer;
      IncrementalFactor, DecrementalFactor: Integer;
    begin
      IncrementalFactor := 15;  //  May Be '01', '05', '15'
      DecrementalFactor := 15;  //  May Be '01', '05', '15'
    
      // Get The Rightmost Character From Label2.Caption
      StringLength02 := Length(Label2.Caption);
      RightMostCharacter  := Label2.Caption[StringLength02];
    
      R2 := GetRValue(ColorToRGB(Label2.Font.Color));
      G2 := GetGValue(ColorToRGB(Label2.Font.Color));
      B2 := GetBValue(ColorToRGB(Label2.Font.Color));
      if (R2 = 255) and (G2 = 000) and (B2 < 255) then
        begin
          B2 := B2 + IncrementalFactor;
        end
      else if (R2 > 000) and (G2 = 000) and (B2 = 255) then
        begin
          R2 := R2 - DecrementalFactor;
        end
      else if (R2 = 000) and (G2 < 255) and (B2 = 255) then
        begin
          G2 := G2 + IncrementalFactor;
        end
      else if (R2 = 000) and (G2 = 255) and (B2 > 000) then
        begin
          B2 := B2 - DecrementalFactor;
        end
      else if (R2 < 255) and (G2 = 255) and (B2 = 000) then
        begin
          R2 := R2 + IncrementalFactor;
        end
      else if (R2 = 255) and (G2 > 000) and (B2 = 000) then
        begin
          G2 := G2 - DecrementalFactor;
        end
      else
        begin
          Timer2.Enabled := false;
        end;
      Label2.Font.Color := RGB(R2, G2, B2);
    
      //Trim The Strings
      Label2.Caption := Copy(Label2.Caption, 1, StringLength02 -1);
      RightScrollingText := RightMostCharacter + Label2.Caption;
      Label2.Caption := RightScrollingText;
    end;
    
    end.    
    

    但我的问题是,Font Color根据整个Color Slider StringLabel1Label2)的{{1}}而不是个别字符而有所不同。

1 个答案:

答案 0 :(得分:5)

TLabel控件不会为您提供字符样式。您无法希望使用TLabel实现目标。一些选择:

  • 自己绘制文本,可能使用TPaintBox控件。逐个绘制文本字符。
  • 使用无窗口的富编辑控件,并为每个角色应用不同的样式。
  • 使用提供此类功能的现有库。例如带有GR32_Text的图形32。