Q&A

  • 문자열을 움직이는 것처럼 보이게 ...
Windows의 화면보호기 중 [사용자 입력문구]와 같은 기능을 하게 하고 싶은데

어떻게 해야 할까요?

즉,문자열은 15줄 정도로 한줄씩 화면 아래에서 위로 또는 좌에서 우로

움직이도록 하고 싶은데요....



Label Component를 15개 놓고 .Top과 .Visible 속성을 바꿔가면서 해봤는데,

화면이 너무 깜빡깜빡하게 나와서요.



다른 좋은 방법이 없을까요?

여러가지 의견 부탁드립니다.

3  COMMENTS
  • Profile
    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.







  • Profile
    kbna 1999.05.22 02:56
    잘 받아 사용해 보았습니다. 감사합니다.



    그런데 추가 질문이 있어 이렇게 다시 글을 올립니다.



    배경에 그림이 있어 Label Component처럼 Transparent기능까지 할수 있으면

    좋겠는데 안되네요.



    어떻게 하죠? 고친다고 고쳐보는데 잘 안되네요...



    조언 부탁드립니다.

  • Profile
    1999.05.26 02:23
    kbna wrote:

    > 잘 받아 사용해 보았습니다. 감사합니다.

    >

    > 그런데 추가 질문이 있어 이렇게 다시 글을 올립니다.

    >

    > 배경에 그림이 있어 Label Component처럼 Transparent기능까지 할수 있으면

    > 좋겠는데 안되네요.

    >

    > 어떻게 하죠? 고친다고 고쳐보는데 잘 안되네요...

    >

    > 조언 부탁드립니다.





    음냐...



    답변이 늦었죠...죄송합니다.



    요즘 하도 바빠서...긁적긁적...



    이 콤포넌트의 소스를 잘 보시면



    canvas를 사용해서 텍스트를 뿌려줍니다.



    그 말은 곧 그래픽이라는 얘기죠....



    제가 아직 그래픽에 대해서 잘 몰라서 Transparent



    기능을 넣기는 힘들겠네요....긁적긁적...북북북...죄송...



    그럼.... 꾸벅

    • 이종근
    • 1999.05.22 16:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 윤석천
      1999.05.23 20:30
      이종근 wrote: > 프로그램을 하다가 궁금한게 있어서요. > 1.퀵리포트에서 > 원하는 레코만 출력하고 ...
    • 종모
      1999.05.22 20:56
      이종근 wrote: > 프로그램을 하다가 궁금한게 있어서요. > 1.퀵리포트에서 > 원하는 레코만 출력하고 ...
    • Francis
    • 1999.05.22 06:19
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.22 11:00
      음냐..... BDE엔진도 같이 아버님컴퓨터에 인스톨해야 합니다. 뭐 간단하게 델파이 씨디가 있다면 커스...
    • 땡글이
    • 1999.05.22 04:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.22 11:05
      글쎄요...쩝 제생각에는 dbware인 Xpower가 해결방법 같군요. 거기에 필요한 기능이 있을꺼 같습니다. 나...
    • 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
    • 김해옥
    • 1999.05.22 01:17
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 강지영
      1999.05.24 19:49
      김해옥 wrote: > delphi 4.0에 내장되어 있는 interbase5.0을 깔았는데요. > 실행시키니까 서버로만 접속...
    • 김봉재
    • 1999.05.22 00:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      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
    • 윤상필
      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
    • 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
    • 이정욱
      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 22:52
      흐.. 물론 정확한 원인은 알수없지만... 제일 가능성 많은것은 Alias가 존재하지 않을때 입니다. 개발시 ...