Q&A

  • 이미지문제..답변부탁합니다.(제발)
안녕하십니까..

프로젝트를 진행하다

..한군데 막히는 부분이 생겨서

이렇게 글을 올려 도움을 받을까 합니다..



막히는 부분은 이미지위에 Text을 흐르게 하는

부분입니다. text를 흐르게하는 effect는 leftToRight면 좋겠는데요..

단색으로 text를 흐르게는 성공을 했는데..

여러 다른색을 써서 다른 text가 함께 흐르는

부분을 하지 못해서 이렇게 조언을 부탁합니다.



혹시 이런 기능을 가진 component를 어디서 구할수

있는지도..



만일 도움이 될 말씀이 계시면..

email 이나 질문에 대한 답변을 부탁드립니다.









1  COMMENTS
  • Profile
    조규춘 2000.05.03 01:42
    각시탈 wrote:

    > 안녕하십니까..

    > 프로젝트를 진행하다

    > ..한군데 막히는 부분이 생겨서

    > 이렇게 글을 올려 도움을 받을까 합니다..

    >

    > 막히는 부분은 이미지위에 Text을 흐르게 하는

    > 부분입니다. text를 흐르게하는 effect는 leftToRight면 좋겠는데요..

    > 단색으로 text를 흐르게는 성공을 했는데..

    > 여러 다른색을 써서 다른 text가 함께 흐르는

    > 부분을 하지 못해서 이렇게 조언을 부탁합니다.

    >

    > 혹시 이런 기능을 가진 component를 어디서 구할수

    > 있는지도..

    >

    > 만일 도움이 될 말씀이 계시면..

    > email 이나 질문에 대한 답변을 부탁드립니다.

    >

    >

    >

    >



    그 콤포넌트의 소스 이옵니다.

    unit MoveText;



    interface



    uses

    Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms,

    Dialogs, ExtCtrls;



    type

    TAlignment = (taCenter, taLeftJustify, taRightJustify);

    TTextStyle = (tsNormal, tsRaised, tsLowered, tsShaddow);

    TMoveDirection = (mdStatic, mdRightToLeft, mdLeftToRight, mdTopToBottom, mdBottomToTop);



    TCustomMoveText = class(TGraphicControl)

    private

    FAlignment: TAlignment;

    FTextStyle: TTextStyle;

    FMoveDirection: TMoveDirection;

    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: TMoveDirection);

    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 MoveDirection: TMoveDirection read FMoveDirection

    write SetDirection default mdRightToLeft;

    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 MoveStart(StartingStep: Integer);

    procedure MoveStop;

    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;



    // TCustomMoveText의 계승을 받는 TMoveText 객체의 선언

    TMoveText = class(TCustomMoveText)

    published

    property Align;

    property Alignment;

    property Font;

    property MoveDirection;

    property ShowHint;

    property Speed;

    property Steps;

    property Visible;

    property OnBegin;

    property OnStep;

    property OnEnd;

    property Color;

    property Depth;

    property Items;

    property TextStyle;

    property ParentShowHint;

    end;



    procedure Register;



    implementation



    procedure Register;

    begin

    RegisterComponents('VCL예제', [TMoveText]);

    end;



    // 컴포넌트객체의 생성

    constructor TCustomMoveText.Create(AOwner: TComponent);

    begin

    inherited Create(AOwner);

    ControlStyle := ControlStyle - [csOpaque];

    // 기본적으로 움직일 텍스트의 설정

    FItems := TStringList.Create;

    FItems.Add('텍스트를 움직입니다.');



    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 := '굴림체';

    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;



    FMoveDirection := mdRightToLeft;

    // 화면상에서 텍스트를 움직이기을 시작한다.

    SetDirection(FMoveDirection);

    end;



    // 컴포넌트 객체의 해제

    destructor TCustomMoveText.Destroy;

    begin

    FItems.Free;

    FTimer.Free;

    FFont.Free;

    inherited Destroy;

    end;



    // 텍스트의 내용을 지정한다.

    procedure TCustomMoveText.SetItems(Value: TStringList);

    begin

    if FItems <> Value then

    begin

    FItems.Assign(Value);

    DataChanged;

    end;

    end;



    // 화면에 텍스트를 출력한다.

    procedure TCustomMoveText.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 TCustomMoveText.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 FMoveDirection of

    mdRightToLeft: begin

    StartYPos := YPos;

    StartXPos := Round((FTextWidth + Width) *

    (1 - PercentDone)) - FTextWidth;

    end;

    mdLeftToRight: begin

    StartYPos := YPos;

    StartXPos := Round((FTextWidth + Width) *

    PercentDone) - FTextWidth;

    end;

    mdBottomToTop: begin

    StartXPos := XPos;

    StartYPos := Round((FTextHeight + Height) *

    (1 - PercentDone)) - FTextHeight;

    end;

    mdTopToBottom: begin

    StartXPos := XPos;

    StartYPos := Round((FTextHeight + Height) *

    PercentDone) - FTextHeight;

    end;

    else // 텍스트가 정지해 있으면

    begin

    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 TCustomMoveText.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 TCustomMoveText.SetContinuous(Value: Boolean);

    begin

    if FContinuous <> Value then

    begin

    FContinuous := Value;

    if FMoveDirection <> mdStatic then

    MoveStart(FCurrentStep);

    end;

    end;



    // 움직이는 텍스트가 이동할 값의 지정

    procedure TCustomMoveText.SetSteps(Value: Integer);

    begin

    if FSteps <> Value then

    begin

    FSteps := Value;

    // 디자인시에 는 다시그린다.

    if csDesigning in ComponentState then

    Invalidate;

    end;

    end;



    // 텍스트의 이동속도를 지정한다.

    procedure TCustomMoveText.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 TCustomMoveText.SetColor(Value: TColor);

    begin

    if FColor <> Value then

    begin

    FColor := Value;

    DataChanged;

    end;

    end;



    // 텍스트의 폰트가 변경되면

    procedure TCustomMoveText.FontChanged(Sender: TObject);

    begin

    DataChanged;

    end;



    // 텍스트의 폰트를 지정한다.

    procedure TCustomMoveText.SetFont(Value: TFont);

    begin

    if FFont <> Value then

    begin

    FFont.Assign(Value);

    DataChanged;

    end;

    end;



    // 텍스트의 움직임을 취소한다.

    procedure TCustomMoveText.MoveStop;

    begin

    FTimer.Enabled := False;

    end;



    // 움직이는 텍스트의 방향을 반전시킨다.

    procedure TCustomMoveText.ReverseDirection;

    begin

    if FMoveDirection = mdStatic then Exit;

    FCurrentStep := FSteps - FCurrentStep;

    case FMoveDirection of

    mdLeftToRight: FMoveDirection := mdRightToLeft;

    mdRightToLeft: FMoveDirection := mdLeftToRight;

    mdTopToBottom: FMoveDirection := mdBottomToTop;

    mdBottomToTop: FMoveDirection := mdTopToBottom;

    end;

    end;



    // 타이머를 조절한다.

    procedure TCustomMoveText.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

    MoveStart(FCurrentStep);

    end;

    end;



    // 지정된 텍스트 정보가 변경되면

    procedure TCustomMoveText.DataChanged;

    begin

    SetSizeParams;

    Invalidate;

    end;



    // 텍스트의 스타일을 변경한다.

    procedure TCustomMoveText.SetTextStyle(Value: TTextStyle);

    begin

    if FTextStyle <> Value then

    begin

    FTextStyle := Value;

    DataChanged;

    end;

    end;



    // 텍스트가 움직이는 위치를 지정한다.

    procedure TCustomMoveText.SetDirection(Value: TMoveDirection);

    begin

    if FMoveDirection <> Value then

    FMoveDirection := Value;

    if FMoveDirection = mdStatic then

    MoveStop

    else

    MoveStart(FCurrentStep);

    end;



    // 텍스트의 정렬상태를 지정한다.

    procedure TCustomMoveText.SetAlignment(Value: TAlignment);

    begin

    if FAlignment <> Value then

    begin

    FAlignment := Value;

    DataChanged;

    end;

    end;



    // 텍스트의 굴곡을 지정한다.

    procedure TCustomMoveText.SetDepth(Value: Integer);

    begin

    if FDepth <> Value then

    begin

    FDepth := Value;

    DataChanged;

    end;

    end;



    // 텍스트의 이동을 시작한다.

    procedure TCustomMoveText.MoveStart(StartingStep: Integer);

    begin

    if FTimer.Enabled then Exit;

    if (StartingStep >= 0) and (StartingStep <= FSteps) then

    FCurrentStep := StartingStep;

    FTimer.Enabled := True;

    end;



    end.



    조규춘 올림....

    • 이정욱
      2000.05.03 01:55
      Application.ShowMainForm := False; 흐.. 생각보다는 모르시는 분들이 많은 팁입니다~ 초심자 ...
    • 박용
    • 2000.05.03 01:46
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 정병근
      2000.05.03 01:57
      박용 wrote: > > 안녕하세요. > 델파이를 공부하는 학생입니다.(왕초보) > Q&A에서 아무리 ...
    • nilriri
      2000.05.03 01:56
      var qry_sum : TQuery; begin qry_sum := TQuery.create(nil); with qry_sum do begin D...
    • 준희
    • 2000.05.03 01:20
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.05.03 02:49
      안녕하세요. 최용일입니다. ShowModal로 띄운 폼의 Ok버트을 눌렸는데 종료가 된다는 말씀이죠. 아마도 ...
    • 준희
      2000.05.03 05:02
      안녕하십니까. 이문제는 해결되었습니다. Project Option에서 Call 되는 Form을 Availible...에 넣...
    • zoro
      2000.05.03 01:43
      안녕하셔요 괜히 하수가 답변하게 되어 고수님의 자세한 답변을 못들을 것 같아 죄송합니다... 어찌
    • 조규춘
      2000.05.03 01:50
      준희 wrote: > 안녕하세요 > 델코초보인데요.. > > DB에 Insert/Edit하는 Form을 만들려고 하는데 문...
    • 김태균
      2000.05.03 01:36
      Try ... finally 대신에 Try ... except 문을 쓰세요.
    • 정수현
    • 2000.05.03 00:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김일영
      2000.05.03 01:45
      올려주신 내용만으로는 SQL문 어디에도 buy_code라는 필드를 select해 오지 않는군요. 그러므로 비교를 할...
    • 조규춘
      2000.05.03 01:18
      델초보 wrote: > 패널 콤포넌트에다가 색깔을 파랑으로 지정하고 > 그 위에다가 스피드 버튼을 놓으니 ...
    • 황원석
    • 2000.05.03 00:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김태균
      2000.05.03 01:34
      음... SQL Server에서도 한글은 2바이트로 인식합니다. 황원석 wrote: > sql 서버에서 한글을 1자리로...
    • 델_맹
    • 2000.05.03 00:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 윤석천
      2000.05.03 02:42
      델_맹 wrote: > > 안녕하세요, 여러분들 또 질문을 올립니다. > > *인터베이스로 데이터베이스를 연...
    • 델_맹
      2000.05.03 07:45
      윤석천 wrote: > 델_맹 wrote: > > > > 안녕하세요, 여러분들 또 질문을 올립니다. > > > > *인터...
    • 정형모
    • 2000.05.02 23:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.05.03 01:24
      정형모 wrote: > DBGrid의 내용을 그래프로 보여줄수 있는 방법을 > 아시는 분 부탁드립니다. 질문을...
    • 각시탈
    • 2000.05.02 23:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.05.03 01:42
      각시탈 wrote: > 안녕하십니까.. > 프로젝트를 진행하다 > ..한군데 막히는 부분이 생겨서 > 이렇게 글...
    • KJB
    • 2000.05.02 23:33
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 하늘맥
    • 2000.05.02 23:32
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 델피언
      2000.05.03 00:14
      하늘맥 wrote: > 별다른것은 아니고 다음과 같은 sql 이 있슴다.. > > select a.fileno,a.qty,b.colorn...
    • 2000.05.02 23:31
    • 3 COMMENTS
    • /
    • 0 LIKES
    • zoro
      2000.05.03 01:17
      //이렇게 동적으로 생성하면 되고요~~ procedure TForm1.FormCreate(Sender: TObject); begin TabCont...
    • 최용일
      2000.05.03 01:11
      안녕하세요. 최용일입니다. // 탭 추가 TabControl1.Tabs.Add('탭이름'); // 지정된 위치에 탭 추...
    • 2000.05.04 03:30
      최용일 wrote: > 안녕하세요. 최용일입니다. > > // 탭 추가 > TabControl1.Tabs.Add('탭이름'); >...
    • Macgyver
    • 2000.05.02 23:07
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 공성환
      2000.05.03 02:38
      Macgyver wrote: > 카데시안 Join이 뭐예요? > Sql Server에도 적용되나여? > 알고싶어요 답변이 될...
    • zoro
    • 2000.05.02 22:12
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김명술
    • 2000.05.02 21:20
    • 1 COMMENTS
    • /
    • 0 LIKES
    • HART
      2000.05.03 01:13
      일단 퀵리포트로 출력이 가능합니다. 단 추가 소스를 작성해야합니다. 방법은 아래 소스와 같음.. p...
    • 최은창
      2000.05.02 22:04
      절사가 버림을 뜻하는 거지요? procedure TForm1.Button1Click(Sender: TObject); var f: real; b...
    • 강민주
      2000.05.02 21:45
      박설화 wrote: > label에서 계산된 값이 실수값인데 그 값을 (10원 미만 절사)를 해야 합니다. > 어떻게 ...
    • 하늘맥
    • 2000.05.02 20:57
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박종일
      2000.05.02 21:50
      하늘맥 wrote: > SELECT A.FILENO, B.ITEM, A.DESIGN,B.UNIT,A.COLORNO,A.GSUSER, C.USNAME, D.COLORNAME,...
    • 박종일
      2000.05.02 21:50
      하늘맥 wrote: > SELECT A.FILENO, B.ITEM, A.DESIGN,B.UNIT,A.COLORNO,A.GSUSER, C.USNAME, D.COLORNAME,...
    • 하늘맥
      2000.05.02 23:23
      답변고맙습니다.. a 와 b 두군데다 null 값이 있으면 어떡하죠.. 박종일 wrote: > null 값의 che...