Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
문자열을 움직이는 것처럼 보이게 ...
Windows의 화면보호기 중 [사용자 입력문구]와 같은 기능을 하게 하고 싶은데
어떻게 해야 할까요?
즉,문자열은 15줄 정도로 한줄씩 화면 아래에서 위로 또는 좌에서 우로
움직이도록 하고 싶은데요....
Label Component를 15개 놓고 .Top과 .Visible 속성을 바꿔가면서 해봤는데,
화면이 너무 깜빡깜빡하게 나와서요.
다른 좋은 방법이 없을까요?
여러가지 의견 부탁드립니다.
3
COMMENTS
한
•
1999.05.21 21:33
july wrote:
> Windows의 화면보호기 중 [사용자 입력문구]와 같은 기능을 하게 하고 싶은데
> 어떻게 해야 할까요?
> 즉,문자열은 15줄 정도로 한줄씩 화면 아래에서 위로 또는 좌에서 우로
> 움직이도록 하고 싶은데요....
>
> Label Component를 15개 놓고 .Top과 .Visible 속성을 바꿔가면서 해봤는데,
> 화면이 너무 깜빡깜빡하게 나와서요.
>
> 다른 좋은 방법이 없을까요?
> 여러가지 의견 부탁드립니다.
관련 콤포넌트 소스입니다.
{----------------------------------------------------------
TScrollText: Version 1.0 14 October, 1996.
by Darryl West (dwest@dot.net.au)
----------------------------------------------------------
This component is released as Freeware. It was developed
using Delphi 2. If you have any suggestions, comments or
bugs please E-mail me.
----------------------------------------------------------}
unit ScrollText;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls;
type
TTextStyle = (tsNormal, tsRaised, tsLowered, tsShaddow);
TScrollDirection = (sdStatic, sdRightToLeft, sdLeftToRight, sdTopToBottom, sdBottomToTop);
TAlignment = (taCenter, taLeftJustify, taRightJustify);
TCustomScrollText = class(TGraphicControl)
private
FAlignment: TAlignment;
FTextStyle: TTextStyle;
FScrollDirection: TScrollDirection;
FTimer: TTimer;
FItems: TStringList;
FColor: TColor;
FContinuous: Boolean;
FFont: TFont;
FOnBegin, FOnStep, FOnEnd: TNotifyEvent;
FSteps, FSpeed, FDepth, LineHi, FCurrentStep, FTextWidth,
FTextHeight, XPos, YPos: Integer;
procedure SetAlignment(Value: TAlignment);
procedure SetContinuous(Value: Boolean);
procedure SetItems(Value: TStringList);
procedure DataChanged;
procedure SetTextStyle(Value: TTextStyle);
procedure SetDirection(Value: TScrollDirection);
procedure SetSteps(Value: Integer);
procedure SetSpeed(Value: Integer);
procedure SetColor(Value: TColor);
procedure SetFont(Value: TFont);
procedure SetDepth(Value: Integer);
procedure SetSizeParams;
procedure FontChanged(Sender: TObject);
procedure DoTextOut(ACanvas: TCanvas; X, Y: Integer; AText: string);
protected
procedure Paint; override;
procedure TimerTick(Sender: TObject);
property Alignment: TAlignment read FAlignment write SetAlignment;
property Depth: Integer read FDepth write SetDepth default 1;
property ScrollDirection: TScrollDirection read FScrollDirection
write SetDirection default sdRightToLeft;
property Items: TStringList read FItems write SetItems;
property OnBegin: TNotifyEvent read FOnBegin write FOnBegin;
property OnStep: TNotifyEvent read FOnStep write FOnStep;
property OnEnd: TNotifyEvent read FOnEnd write FOnEnd;
public
property CurrentStep: Integer read FCurrentStep;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReverseDirection;
procedure ScrollStart(StartingStep: Integer);
procedure ScrollStop;
published
property TextStyle: TTextStyle read FTextStyle write SetTextStyle default tsNormal;
property Steps: Integer read FSteps write SetSteps default 66;
property Speed: Integer read FSpeed write SetSpeed default 200;
property Color: TColor read FColor write SetColor default clBtnFace;
property Continuous: Boolean read FContinuous write SetContinuous;
property Font: TFont read FFont write SetFont;
end;
TScrollText = class(TCustomScrollText)
published
property Align;
property Alignment;
property Color;
property Depth;
property Items;
property TextStyle;
property ParentShowHint;
property Font;
property ScrollDirection;
property ShowHint;
property Speed;
property Steps;
property Visible;
property OnBegin;
property OnStep;
property OnEnd;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Additional', [TScrollText]);
end;
constructor TCustomScrollText.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csOpaque];
FItems := TStringList.Create;
FItems.Add('ScrollText');
Width := 200;
Height := 20;
FColor := clBtnFace;
FSteps := 80;
FCurrentStep := 0;
FDepth := 1;
FContinuous := True;
FTextStyle := tsNormal;
FAlignment := taCenter;
FFont := TFont.Create;
with FFont do begin
Name := 'Arial';
Size := 10;
Color := clBlack;
end;
FFont.OnChange := FontChanged;
FTimer := TTimer.Create(Self);
FSpeed := 100;
with FTimer do begin
Enabled := False;
OnTimer := TimerTick;
Interval := FSpeed;
end;
FScrollDirection := sdRightToLeft;
SetDirection(FScrollDirection); { Start scrolling if necessary. }
end;
destructor TCustomScrollText.Destroy;
begin
FItems.Free;
FTimer.Free;
FFont.Free;
inherited Destroy;
end;
procedure TCustomScrollText.SetItems(Value: TStringList);
begin
if FItems <> Value then begin
FItems.Assign(Value);
DataChanged;
end;
end;
procedure TCustomScrollText.DoTextOut(ACanvas: TCanvas; X, Y: Integer; AText: string);
var TextAdjustment: Integer;
begin
with ACanvas do begin
Font := FFont;
Brush.Style := bsClear;
if FAlignment = taCenter then
TextAdjustment := Round((FTextWidth / 2) - (TextWidth(AText) / 2))
else if FAlignment = taRightJustify then
TextAdjustment := Round(FTextWidth - TextWidth(AText))
else TextAdjustment := 0;
case FTextStyle of
tsRaised: begin
Font.Color := clBtnHighlight;
TextOut(X - FDepth + TextAdjustment, Y - FDepth, AText);
Font.Color := clBtnShadow;
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
tsLowered: begin
Font.Color := clBtnShadow;
TextOut(X - FDepth + TextAdjustment, Y - FDepth, AText);
Font.Color := clBtnHighlight;
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
tsShaddow: begin
Font.Color := clBtnShadow;
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
end;
Font.Color := FFont.Color;
TextOut(X + TextAdjustment, Y, AText);
end;
end;
procedure TCustomScrollText.Paint;
var TmpBmp: TBitMap;
StartXPos, StartYPos, I: Integer;
PercentDone: Double;
begin
SetSizeParams;
TmpBmp := TBitMap.Create;
try
TmpBmp.Width := Width;
TmpBmp.Height := Height;
with TmpBmp.Canvas do begin
Font := FFont;
Brush.Color := FColor;
Brush.Style := bsSolid;
FillRect(ClipRect);
end;
if FTextWidth >= Width then XPos := 0 else XPos := (Width - FTextWidth) div 2;
if FTextHeight >= Height then YPos := 0 else YPos := (Height - FTextHeight) div 2;
if csDesigning in ComponentState then PercentDone := 0.5
else PercentDone := FCurrentStep / FSteps;
case FScrollDirection of
sdRightToLeft: begin
StartYPos := YPos;
StartXPos := Round((FTextWidth + Width) * (1 - PercentDone)) - FTextWidth;
end;
sdLeftToRight: begin
StartYPos := YPos;
StartXPos := Round((FTextWidth + Width) * PercentDone) - FTextWidth;
end;
sdBottomToTop: begin
StartXPos := XPos;
StartYPos := Round((FTextHeight + Height) * (1 - PercentDone)) - FTextHeight;
end;
sdTopToBottom: begin
StartXPos := XPos;
StartYPos := Round((FTextHeight + Height) * PercentDone) - FTextHeight;
end;
else begin { static }
StartXPos := XPos;
StartYPos := YPos;
end
end;
I := 0;
while I < FItems.Count do begin
DoTextOut(TmpBmp.Canvas, StartXPos, StartYPos, FItems.Strings[I]);
Inc(StartYPos, LineHi);
Inc(I);
end;
Canvas.Draw(0, 0, TmpBmp);
finally
TmpBmp.Free;
end;
end;
procedure TCustomScrollText.SetSizeParams;
var S: String;
I, SWidth: Integer;
Metrics: TTextMetric;
begin
with Canvas do begin
Font := FFont;
GetTextMetrics(Handle, Metrics);
LineHi := Metrics.tmHeight + Metrics.tmInternalLeading;
if FTextStyle in [tsRaised, tsLowered] then LineHi := LineHi + 2 * FDepth
else if FTextStyle in [tsShaddow] then LineHi := LineHi + FDepth;
end;
FTextWidth := 0;
I := 0;
while I < FItems.Count do begin
S := FItems.Strings[I];
SWidth := Canvas.TextWidth(S);
if FTextStyle in [tsRaised, tsLowered] then SWidth := SWidth + 2 * FDepth
else if FTextStyle in [tsShaddow] then SWidth := SWidth + FDepth;
if FTextWidth < SWidth then FTextWidth := SWidth;
Inc(I);
end;
FTextHeight := LineHi * FItems.Count;
if FTextWidth >= Width then XPos := 0 else XPos := (Width - FTextWidth) div 2;
if FTextHeight >= Height then YPos := 0 else YPos := (Height - FTextHeight) div 2;
end;
procedure TCustomScrollText.DataChanged;
begin
SetSizeParams;
Invalidate;
end;
procedure TCustomScrollText.SetTextStyle(Value: TTextStyle);
begin
if FTextStyle <> Value then begin
FTextStyle := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.SetDirection(Value: TScrollDirection);
begin
if FScrollDirection <> Value then begin
FScrollDirection := Value;
end;
if FScrollDirection = sdStatic then ScrollStop
else ScrollStart(FCurrentStep);
end;
procedure TCustomScrollText.SetContinuous(Value: Boolean);
begin
if FContinuous <> Value then begin
FContinuous := Value;
if FScrollDirection <> sdStatic then ScrollStart(FCurrentStep);
end;
end;
procedure TCustomScrollText.SetSteps(Value: Integer);
begin
if FSteps <> Value then begin
FSteps := Value;
if csDesigning in ComponentState then Invalidate;
end;
end;
procedure TCustomScrollText.SetSpeed(Value: Integer);
begin
if FSpeed <> Value then begin
if Value > 1000 then Value := 1000
else if Value < 1 then Value := 1;
FSpeed := Value;
if FTimer <> nil then FTimer.Interval := FSpeed;
end;
end;
procedure TCustomScrollText.SetColor(Value: TColor);
begin
if FColor <> Value then begin
FColor := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.FontChanged(Sender: TObject);
begin
DataChanged;
end;
procedure TCustomScrollText.SetFont(Value: TFont);
begin
if FFont <> Value then begin
FFont.Assign(Value);
DataChanged;
end;
end;
procedure TCustomScrollText.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.SetDepth(Value: Integer);
begin
if FDepth <> Value then begin
FDepth := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.ScrollStart(StartingStep: Integer);
begin
if FTimer.Enabled then Exit;
if (StartingStep >= 0) and (StartingStep <= FSteps) then FCurrentStep := StartingStep;
FTimer.Enabled := True;
end;
procedure TCustomScrollText.ScrollStop;
begin
FTimer.Enabled := False;
end;
procedure TCustomScrollText.ReverseDirection;
begin
if FScrollDirection = sdStatic then Exit;
FCurrentStep := FSteps - FCurrentStep;
case FScrollDirection of
sdLeftToRight: FScrollDirection := sdRightToLeft;
sdRightToLeft: FScrollDirection := sdLeftToRight;
sdTopToBottom: FScrollDirection := sdBottomToTop;
sdBottomToTop: FScrollDirection := sdTopToBottom;
end;
end;
procedure TCustomScrollText.TimerTick(Sender: TObject);
begin
if not FTimer.Enabled then Exit;
if (FCurrentStep = 0) and Assigned(FOnBegin) then FOnBegin(Self);
Inc(FCurrentStep);
Paint;
if Assigned(FOnStep) then FOnStep(Self);
if FCurrentStep > FSteps then begin
FTimer.Enabled := False;
if Assigned(FOnEnd) then FOnEnd(Self);
FCurrentStep := 0;
if FContinuous then ScrollStart(FCurrentStep);
end;
end;
end.
0
0
삭제
수정
댓글
kbna
•
1999.05.22 02:56
잘 받아 사용해 보았습니다. 감사합니다.
그런데 추가 질문이 있어 이렇게 다시 글을 올립니다.
배경에 그림이 있어 Label Component처럼 Transparent기능까지 할수 있으면
좋겠는데 안되네요.
어떻게 하죠? 고친다고 고쳐보는데 잘 안되네요...
조언 부탁드립니다.
0
0
삭제
수정
댓글
한
•
1999.05.26 02:23
kbna wrote:
> 잘 받아 사용해 보았습니다. 감사합니다.
>
> 그런데 추가 질문이 있어 이렇게 다시 글을 올립니다.
>
> 배경에 그림이 있어 Label Component처럼 Transparent기능까지 할수 있으면
> 좋겠는데 안되네요.
>
> 어떻게 하죠? 고친다고 고쳐보는데 잘 안되네요...
>
> 조언 부탁드립니다.
음냐...
답변이 늦었죠...죄송합니다.
요즘 하도 바빠서...긁적긁적...
이 콤포넌트의 소스를 잘 보시면
canvas를 사용해서 텍스트를 뿌려줍니다.
그 말은 곧 그래픽이라는 얘기죠....
제가 아직 그래픽에 대해서 잘 몰라서 Transparent
기능을 넣기는 힘들겠네요....긁적긁적...북북북...죄송...
그럼.... 꾸벅
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
이종근
•
1999.05.22 16:42
2
COMMENTS
/
0
LIKES
초보가 궁금해서요 db 처리에 관한...
윤석천
•
1999.05.23 20:30
이종근 wrote: > 프로그램을 하다가 궁금한게 있어서요. > 1.퀵리포트에서 > 원하는 레코만 출력하고 ...
종모
•
1999.05.22 20:56
이종근 wrote: > 프로그램을 하다가 궁금한게 있어서요. > 1.퀵리포트에서 > 원하는 레코만 출력하고 ...
Francis
1999.05.22 06:19
0
COMMENTS
/
0
LIKES
dos 실행파일을 실행하면서
정 명섭
•
1999.05.22 05:03
1
COMMENTS
/
0
LIKES
db로 만든 프로그램의 이동, 실행에러
신인재
•
1999.05.22 11:00
음냐..... BDE엔진도 같이 아버님컴퓨터에 인스톨해야 합니다. 뭐 간단하게 델파이 씨디가 있다면 커스...
땡글이
•
1999.05.22 04:27
1
COMMENTS
/
0
LIKES
어떻하든 소계를 구하고 싶습니다...*.*
신인재
•
1999.05.22 11:05
글쎄요...쩝 제생각에는 dbware인 Xpower가 해결방법 같군요. 거기에 필요한 기능이 있을꺼 같습니다. 나...
최석원
1999.05.22 03:26
0
COMMENTS
/
0
LIKES
원하는 단어로 이동하려면...
Musa Lee
•
1999.05.22 01:39
1
COMMENTS
/
0
LIKES
콤보박스 리스트와 실제 파일을...
이정욱
•
1999.05.22 01:57
광고게시판은 쓰는사람이 적지만 조회수는 월등히 많습니다. 왜냐하면 델파이에 관련되지 않는 것들은 제...
summe
1999.05.22 01:24
0
COMMENTS
/
0
LIKES
Stroed Procedure
김해옥
•
1999.05.22 01:17
1
COMMENTS
/
0
LIKES
local interbase 접속이 안됩니다.
강지영
•
1999.05.24 19:49
김해옥 wrote: > delphi 4.0에 내장되어 있는 interbase5.0을 깔았는데요. > 실행시키니까 서버로만 접속...
김봉재
•
1999.05.22 00:51
1
COMMENTS
/
0
LIKES
ListView질문있습니다.
이정욱
•
1999.05.22 01:21
BeginUpdate와 EndUpdate를 사용해 보세요. 이것을 사용하면 더해지는 중간에는 업데이트가 내부에서 되고...
박근영
•
1999.05.22 00:23
1
COMMENTS
/
0
LIKES
폼전체를 프린트 하는 방법은?????
한
•
1999.05.22 00:29
박근영 wrote: > 안녕하세요... 선배 델피언 여러분.... > 저는 이제 막 델파이에 대해서 눈을 뜨가고 ...
윤상필
•
1999.05.21 23:35
1
COMMENTS
/
0
LIKES
Send Mail 매우급합
윤상필
•
1999.05.25 00:08
윤상필 wrote: > 이정욱님 고맙습지만 > 저는 델파이 3.0에서 제공하는 SMTP 컴포넌트를 이용하고 있습...
박승록
•
1999.05.21 23:24
2
COMMENTS
/
0
LIKES
메모장에 그림파일 삽입
류
•
1999.05.22 03:58
박승록 wrote: > 메모장에 text문서사이에 > > 이미지 파일을 넣는 방법을 알고싶습니다. > > 이미...
한
•
1999.05.22 00:33
박승록 wrote: > 메모장에 text문서사이에 > > 이미지 파일을 넣는 방법을 알고싶습니다. > > 이미...
이미영
•
1999.05.21 21:52
4
COMMENTS
/
0
LIKES
윈도우의 모든 메세지를 인식하는 방법
한
•
1999.05.22 00:37
이미영 wrote: > 프로그램에서 윈도우에서 발생하는 모든 메세지를 잡을 수 있나요? > > 예로든다면 A....
이정욱
•
1999.05.21 23:08
물론 가능합니다. 단순히 아래와 같은 기능이라면 그냥 RegisterHotkey라는 함수를 참고하세요. 그것을 ...
이미영
•
1999.05.21 23:58
파워러브델파이 97년 6월호(4호)의 채팅도우미 만들기는 어디에 가면 볼수 있어요..??? 답변 고마워요....
이정욱
•
1999.05.22 01:15
http://www.nilex.net에 가시면 구입하실 수 있습니다. 5500원입니다. 이미영 wrote: > 파워러브델파...
이재구
•
1999.05.21 20:55
1
COMMENTS
/
0
LIKES
문자열(연산식)을 어떻게 해야될지..
이정욱
•
1999.05.21 21:07
음.. 저의 짧은 지식으로는 꼭 파싱을 하셔야 할것 같네요. 제가 보기에는 sik이라는곳에 연산식을 넣어주...
july
•
1999.05.21 20:24
3
COMMENTS
/
0
LIKES
문자열을 움직이는 것처럼 보이게 ...
Windows의 화면보호기 중 [사용자 입력문구]와 같은 기능을 하게 하고 싶은데 어떻게 해야 할까요? 즉,문자열은 15줄 정도로 한줄씩 화면 아래에서 위로 또는 좌에서 우로 움직이도록 하고 싶은데요.... Label Component를 15개 놓고 .Top...
한
•
1999.05.21 21:33
july wrote: > Windows의 화면보호기 중 [사용자 입력문구]와 같은 기능을 하게 하고 싶은데 > 어떻게 해...
kbna
•
1999.05.22 02:56
잘 받아 사용해 보았습니다. 감사합니다. 그런데 추가 질문이 있어 이렇게 다시 글을 올립니다. 배경...
한
•
1999.05.26 02:23
kbna wrote: > 잘 받아 사용해 보았습니다. 감사합니다. > > 그런데 추가 질문이 있어 이렇게 다시 글...
지니
•
1999.05.21 20:17
1
COMMENTS
/
0
LIKES
문자위치 찾기(조건설정)
한
•
1999.05.21 21:50
지니 wrote: > > 초보입니다. Pos함수를 사용하여 문자의 위치를 > 알아낼수 있습니다만, 조건이 있을 ...
강신구
•
1999.05.21 19:49
1
COMMENTS
/
0
LIKES
Application.OnHint에 대해?
이정욱
•
1999.05.21 19:54
물론 가능합니다. 그러니까 다르게 생긴 풍선 도움말같은것이 가능하죠.. ^^; 강신구 wrote: > 안녕하...
김정수
•
1999.05.21 19:31
1
COMMENTS
/
0
LIKES
[요청]우편번호자료
이정욱
•
1999.05.21 22:31
한델(http://www.delphi.co.kr)자료실에 업로드를 해놓았습니다. 에구.. 조합형으로 되어있던것을 완성형...
북해
•
1999.05.21 18:26
1
COMMENTS
/
0
LIKES
디비그리드에서 수평,수직 이동바...
김영대
•
1999.05.21 21:00
북해 wrote: > 안녕하세요. DBGrid에서 수평,수직 이동바를 나타나지 않게 할 수는 없나요? > 볼랜드...
북해
•
1999.05.21 18:23
1
COMMENTS
/
0
LIKES
인스톨쉬드로 설치 디스켓을 만들었는데...
이정욱
•
1999.05.21 22:52
흐.. 물론 정확한 원인은 알수없지만... 제일 가능성 많은것은 Alias가 존재하지 않을때 입니다. 개발시 ...
july
1999/05/21 20:24
Views
203
Likes
0
Comments
3
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
> Windows의 화면보호기 중 [사용자 입력문구]와 같은 기능을 하게 하고 싶은데
> 어떻게 해야 할까요?
> 즉,문자열은 15줄 정도로 한줄씩 화면 아래에서 위로 또는 좌에서 우로
> 움직이도록 하고 싶은데요....
>
> Label Component를 15개 놓고 .Top과 .Visible 속성을 바꿔가면서 해봤는데,
> 화면이 너무 깜빡깜빡하게 나와서요.
>
> 다른 좋은 방법이 없을까요?
> 여러가지 의견 부탁드립니다.
관련 콤포넌트 소스입니다.
{----------------------------------------------------------
TScrollText: Version 1.0 14 October, 1996.
by Darryl West (dwest@dot.net.au)
----------------------------------------------------------
This component is released as Freeware. It was developed
using Delphi 2. If you have any suggestions, comments or
bugs please E-mail me.
----------------------------------------------------------}
unit ScrollText;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls;
type
TTextStyle = (tsNormal, tsRaised, tsLowered, tsShaddow);
TScrollDirection = (sdStatic, sdRightToLeft, sdLeftToRight, sdTopToBottom, sdBottomToTop);
TAlignment = (taCenter, taLeftJustify, taRightJustify);
TCustomScrollText = class(TGraphicControl)
private
FAlignment: TAlignment;
FTextStyle: TTextStyle;
FScrollDirection: TScrollDirection;
FTimer: TTimer;
FItems: TStringList;
FColor: TColor;
FContinuous: Boolean;
FFont: TFont;
FOnBegin, FOnStep, FOnEnd: TNotifyEvent;
FSteps, FSpeed, FDepth, LineHi, FCurrentStep, FTextWidth,
FTextHeight, XPos, YPos: Integer;
procedure SetAlignment(Value: TAlignment);
procedure SetContinuous(Value: Boolean);
procedure SetItems(Value: TStringList);
procedure DataChanged;
procedure SetTextStyle(Value: TTextStyle);
procedure SetDirection(Value: TScrollDirection);
procedure SetSteps(Value: Integer);
procedure SetSpeed(Value: Integer);
procedure SetColor(Value: TColor);
procedure SetFont(Value: TFont);
procedure SetDepth(Value: Integer);
procedure SetSizeParams;
procedure FontChanged(Sender: TObject);
procedure DoTextOut(ACanvas: TCanvas; X, Y: Integer; AText: string);
protected
procedure Paint; override;
procedure TimerTick(Sender: TObject);
property Alignment: TAlignment read FAlignment write SetAlignment;
property Depth: Integer read FDepth write SetDepth default 1;
property ScrollDirection: TScrollDirection read FScrollDirection
write SetDirection default sdRightToLeft;
property Items: TStringList read FItems write SetItems;
property OnBegin: TNotifyEvent read FOnBegin write FOnBegin;
property OnStep: TNotifyEvent read FOnStep write FOnStep;
property OnEnd: TNotifyEvent read FOnEnd write FOnEnd;
public
property CurrentStep: Integer read FCurrentStep;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReverseDirection;
procedure ScrollStart(StartingStep: Integer);
procedure ScrollStop;
published
property TextStyle: TTextStyle read FTextStyle write SetTextStyle default tsNormal;
property Steps: Integer read FSteps write SetSteps default 66;
property Speed: Integer read FSpeed write SetSpeed default 200;
property Color: TColor read FColor write SetColor default clBtnFace;
property Continuous: Boolean read FContinuous write SetContinuous;
property Font: TFont read FFont write SetFont;
end;
TScrollText = class(TCustomScrollText)
published
property Align;
property Alignment;
property Color;
property Depth;
property Items;
property TextStyle;
property ParentShowHint;
property Font;
property ScrollDirection;
property ShowHint;
property Speed;
property Steps;
property Visible;
property OnBegin;
property OnStep;
property OnEnd;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Additional', [TScrollText]);
end;
constructor TCustomScrollText.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csOpaque];
FItems := TStringList.Create;
FItems.Add('ScrollText');
Width := 200;
Height := 20;
FColor := clBtnFace;
FSteps := 80;
FCurrentStep := 0;
FDepth := 1;
FContinuous := True;
FTextStyle := tsNormal;
FAlignment := taCenter;
FFont := TFont.Create;
with FFont do begin
Name := 'Arial';
Size := 10;
Color := clBlack;
end;
FFont.OnChange := FontChanged;
FTimer := TTimer.Create(Self);
FSpeed := 100;
with FTimer do begin
Enabled := False;
OnTimer := TimerTick;
Interval := FSpeed;
end;
FScrollDirection := sdRightToLeft;
SetDirection(FScrollDirection); { Start scrolling if necessary. }
end;
destructor TCustomScrollText.Destroy;
begin
FItems.Free;
FTimer.Free;
FFont.Free;
inherited Destroy;
end;
procedure TCustomScrollText.SetItems(Value: TStringList);
begin
if FItems <> Value then begin
FItems.Assign(Value);
DataChanged;
end;
end;
procedure TCustomScrollText.DoTextOut(ACanvas: TCanvas; X, Y: Integer; AText: string);
var TextAdjustment: Integer;
begin
with ACanvas do begin
Font := FFont;
Brush.Style := bsClear;
if FAlignment = taCenter then
TextAdjustment := Round((FTextWidth / 2) - (TextWidth(AText) / 2))
else if FAlignment = taRightJustify then
TextAdjustment := Round(FTextWidth - TextWidth(AText))
else TextAdjustment := 0;
case FTextStyle of
tsRaised: begin
Font.Color := clBtnHighlight;
TextOut(X - FDepth + TextAdjustment, Y - FDepth, AText);
Font.Color := clBtnShadow;
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
tsLowered: begin
Font.Color := clBtnShadow;
TextOut(X - FDepth + TextAdjustment, Y - FDepth, AText);
Font.Color := clBtnHighlight;
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
tsShaddow: begin
Font.Color := clBtnShadow;
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
end;
Font.Color := FFont.Color;
TextOut(X + TextAdjustment, Y, AText);
end;
end;
procedure TCustomScrollText.Paint;
var TmpBmp: TBitMap;
StartXPos, StartYPos, I: Integer;
PercentDone: Double;
begin
SetSizeParams;
TmpBmp := TBitMap.Create;
try
TmpBmp.Width := Width;
TmpBmp.Height := Height;
with TmpBmp.Canvas do begin
Font := FFont;
Brush.Color := FColor;
Brush.Style := bsSolid;
FillRect(ClipRect);
end;
if FTextWidth >= Width then XPos := 0 else XPos := (Width - FTextWidth) div 2;
if FTextHeight >= Height then YPos := 0 else YPos := (Height - FTextHeight) div 2;
if csDesigning in ComponentState then PercentDone := 0.5
else PercentDone := FCurrentStep / FSteps;
case FScrollDirection of
sdRightToLeft: begin
StartYPos := YPos;
StartXPos := Round((FTextWidth + Width) * (1 - PercentDone)) - FTextWidth;
end;
sdLeftToRight: begin
StartYPos := YPos;
StartXPos := Round((FTextWidth + Width) * PercentDone) - FTextWidth;
end;
sdBottomToTop: begin
StartXPos := XPos;
StartYPos := Round((FTextHeight + Height) * (1 - PercentDone)) - FTextHeight;
end;
sdTopToBottom: begin
StartXPos := XPos;
StartYPos := Round((FTextHeight + Height) * PercentDone) - FTextHeight;
end;
else begin { static }
StartXPos := XPos;
StartYPos := YPos;
end
end;
I := 0;
while I < FItems.Count do begin
DoTextOut(TmpBmp.Canvas, StartXPos, StartYPos, FItems.Strings[I]);
Inc(StartYPos, LineHi);
Inc(I);
end;
Canvas.Draw(0, 0, TmpBmp);
finally
TmpBmp.Free;
end;
end;
procedure TCustomScrollText.SetSizeParams;
var S: String;
I, SWidth: Integer;
Metrics: TTextMetric;
begin
with Canvas do begin
Font := FFont;
GetTextMetrics(Handle, Metrics);
LineHi := Metrics.tmHeight + Metrics.tmInternalLeading;
if FTextStyle in [tsRaised, tsLowered] then LineHi := LineHi + 2 * FDepth
else if FTextStyle in [tsShaddow] then LineHi := LineHi + FDepth;
end;
FTextWidth := 0;
I := 0;
while I < FItems.Count do begin
S := FItems.Strings[I];
SWidth := Canvas.TextWidth(S);
if FTextStyle in [tsRaised, tsLowered] then SWidth := SWidth + 2 * FDepth
else if FTextStyle in [tsShaddow] then SWidth := SWidth + FDepth;
if FTextWidth < SWidth then FTextWidth := SWidth;
Inc(I);
end;
FTextHeight := LineHi * FItems.Count;
if FTextWidth >= Width then XPos := 0 else XPos := (Width - FTextWidth) div 2;
if FTextHeight >= Height then YPos := 0 else YPos := (Height - FTextHeight) div 2;
end;
procedure TCustomScrollText.DataChanged;
begin
SetSizeParams;
Invalidate;
end;
procedure TCustomScrollText.SetTextStyle(Value: TTextStyle);
begin
if FTextStyle <> Value then begin
FTextStyle := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.SetDirection(Value: TScrollDirection);
begin
if FScrollDirection <> Value then begin
FScrollDirection := Value;
end;
if FScrollDirection = sdStatic then ScrollStop
else ScrollStart(FCurrentStep);
end;
procedure TCustomScrollText.SetContinuous(Value: Boolean);
begin
if FContinuous <> Value then begin
FContinuous := Value;
if FScrollDirection <> sdStatic then ScrollStart(FCurrentStep);
end;
end;
procedure TCustomScrollText.SetSteps(Value: Integer);
begin
if FSteps <> Value then begin
FSteps := Value;
if csDesigning in ComponentState then Invalidate;
end;
end;
procedure TCustomScrollText.SetSpeed(Value: Integer);
begin
if FSpeed <> Value then begin
if Value > 1000 then Value := 1000
else if Value < 1 then Value := 1;
FSpeed := Value;
if FTimer <> nil then FTimer.Interval := FSpeed;
end;
end;
procedure TCustomScrollText.SetColor(Value: TColor);
begin
if FColor <> Value then begin
FColor := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.FontChanged(Sender: TObject);
begin
DataChanged;
end;
procedure TCustomScrollText.SetFont(Value: TFont);
begin
if FFont <> Value then begin
FFont.Assign(Value);
DataChanged;
end;
end;
procedure TCustomScrollText.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.SetDepth(Value: Integer);
begin
if FDepth <> Value then begin
FDepth := Value;
DataChanged;
end;
end;
procedure TCustomScrollText.ScrollStart(StartingStep: Integer);
begin
if FTimer.Enabled then Exit;
if (StartingStep >= 0) and (StartingStep <= FSteps) then FCurrentStep := StartingStep;
FTimer.Enabled := True;
end;
procedure TCustomScrollText.ScrollStop;
begin
FTimer.Enabled := False;
end;
procedure TCustomScrollText.ReverseDirection;
begin
if FScrollDirection = sdStatic then Exit;
FCurrentStep := FSteps - FCurrentStep;
case FScrollDirection of
sdLeftToRight: FScrollDirection := sdRightToLeft;
sdRightToLeft: FScrollDirection := sdLeftToRight;
sdTopToBottom: FScrollDirection := sdBottomToTop;
sdBottomToTop: FScrollDirection := sdTopToBottom;
end;
end;
procedure TCustomScrollText.TimerTick(Sender: TObject);
begin
if not FTimer.Enabled then Exit;
if (FCurrentStep = 0) and Assigned(FOnBegin) then FOnBegin(Self);
Inc(FCurrentStep);
Paint;
if Assigned(FOnStep) then FOnStep(Self);
if FCurrentStep > FSteps then begin
FTimer.Enabled := False;
if Assigned(FOnEnd) then FOnEnd(Self);
FCurrentStep := 0;
if FContinuous then ScrollStart(FCurrentStep);
end;
end;
end.