gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:27:02 25 4
gpt4 key购买 nike

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

  1. 使用Timer1将分离LeftMostCharacter并更改颜色,然后将其添加到Label1Label1 将从右向左滚动。
  2. 使用Timer2RightMostCharacter将被分离并更改颜色,然后将其添加到Label1Label1 将从左向右滚动。

所以我写了以下代码:
单元单元1;

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.

但我的问题是,字体颜色根据整个String(即Label1)的颜色 slider 而变化code> 和 Label2) 而不是单个字符。

最佳答案

TLabel 控件不会为您提供逐个字符的样式。您不能希望使用 TLabel 来实现您的目标。一些选项:

  • 自己绘制文本,也许使用 TPaintBox 控件。逐个字符地绘制文本。
  • 使用无窗口的丰富编辑控件,并对每个角色应用不同的样式。
  • 使用提供此类功能的现有库。例如,graphics32 带有 GR32_Text .

关于delphi - 如何从字符串中设置单个字符颜色并在 TLabel 中显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com