우선 CodeTyphon 을 다운받습니다. (www.pilotlogic.com)

  현재 최신 버전은 2.20 버전이네요.

  다운로드 속도가 좀 많이 느려요...
  (좀 빠른 서버에 올려주면 안되니... ㅠㅠ)

  다운을 받아 파일의 압축을 풉니다.
  C:\CodeTyphon\ 폴더에 풀어 줍시다.
  (위 폴더는 사용되는 폴더니 설치 끝났다고 지우면 안되요.)

  그리고 "\setup.bat" 를 실행합니다.
  (Linux, FreeBSD 경우 \setup.sh 를 실행합니다.)


  *주의 * 

    관리자 모드로 실행하셔야 합니다.
    아니면 설치 중간에 ERROR 납니다.

    ("RUN AS" administrator)

    CMD > cd CodeTyphon > setup.bat
    Or    
    C:\CodeTyphon\binCenter\CodeTyphon_????.ex?
 




CMD 창이 열리면 "1> Run CodeTyphon Center" 를 선택해 줍니다. (바로 8번 눌러도 됩니다.)
그럼 다음과 같은 창이 열리는걸 볼 수 있습니다.

* 주의 *
   (Linux, FreeBSD 의 경우 "0> Install System Libraries" 을 눌러 라이브러리를 먼저 설치하셔야 합니다.)




이제 본격적으로 설치를 시작합니다.
상단 "Main Menu > CodeTyphon > Remove and Build ALL (FPC and Lazarus)" 를 선택합니다.






위와 같이 "CommandBox" 에서 설치정보를 볼 수 있습니다.
설치 시간이 10~30분 정도  걸리니 "Please wait... Executing Script:..." 메세지가 끝날때 까지 기다립시다.

설치가 완료 되면 아래와 같이 바탕화면에 아이콘이 생깁니다.
이제 라자루스(Lazarus)를 통해 파스칼을 마음껏 즐깁시다 ^^



참고로 라자루스는 "Cross-Build"를 지원합니다.
지원 OS 는 Windows, WinCE, Linux, FreeBSD 이며 32/64bit 모두 지원 합니다.
FPC에서 지원하는것 까지 합하면 solaris, haiku, gba, nds, embedded 등이 있습니다.

-----

다음은 설정해두면 코딩이 편한 옵션들 입니다. (개인 취향에 따라 선택 하시면됩니다.^^)

1) 체크하시면 저장시 사용하지 않는 메소드를 제거해 줍니다.
   > Tools > Editor > Completion and Hints > Auto remove empty methods > [check]

2) 체크하시면 코드의 시작과 끝을 묶어 접었다/폈다 할 수 있어 아래로 긴 코드가 보기 편해집니다.
   > Tools > Editor > Code folding > Code folding > [check]

3) 체크하시면 체크된 코드의 아래 부분에 선으로 나누어 끝을 표시해 줍니다.
   > Tools > Editor > Divider drawing > Items > [check]

4) FCL, LCL 디버깅(debugging) 하기.
  > Project > Compiler Options > Linking > Generate Debugging Info For GDB (-g) > [check] 
  > Project > Compiler Options > Linking > Link Smart (-XX) > [check] 
 
5) 실행 파일 크기 줄이기
  > Project > Compiler Options > Linking > Generate Debugging Info For GDB > [uncheck]
  > Project > Compiler Options > Linking > Debugging > Strip Symbols From Executable (-Xs) > [check]
  > Project > Compiler Options > Linking > Debugging > Link Style > Link Smart (-XX) > [check]
  > Project > Compiler Options > Code > Debugging > Smart Linkable (-CX) > [check]

마지막은 라자루스(Lazarus)를 실행한 모습


출처 : http://blog.foxb.kr/266


델파이의 web browser 컨트롤에 오픈한.. HTML 웹 페이지 내의 버튼이벤트로

 

델파이의 이벤트를 처리할수 있는 방법이 있다..

 

약간의 꽁수 인듯하나.. 괜찮은 방법이다.

 

기본구조는  HTML  웹페이지 내에서 메뉴 이벤트가 일어날때 자바 스크립트를 이용해 브라우져의 상태바(Status Bar) 를 변경시키면 델파이에서 그 상태바를 읽어 이벤트를 처리하는 방법이다.. 

 기본구조는 상당히 심플하다.

 

간단한 기본 구조 처럼  코드 처리 또한.. 간단하다...

 

 1. HTML 에서의 상태바 처리

 

    <script language="javascript">
      function closewin(num) 
     {
         window.status='close';
         window.status='';
         window.close();
     }
    </script>

     .....

     ...

    <input type=image src="img/c_btn.gif" style=cursor:hand; border=0 onclick="closewin()">

 

 2. 델파이 에서의  브라우져 컨트롤 상태바 변경 처리

     WebBrowser 컨트롤 이벤트중  'wbStatusTextChange ' 이벤트가 있다..

     브라우져 컨트롤의 상태바의 Text가 변경되면 이벤트가 실행된다..

     이 이벤트 프로시져 내에 다음과 같이 처리 한다.

 

procedure TRegistDlg.wbStatusTextChange(Sender: TObject;
  const Text: WideString);
var sItem : string;
begin
  sItem := Text;
  if sItem = 'close' then
  begin
    close;
  end;
end;

 

   Text는 브라우져 컨트롤의 상태바의 Text 를 넘겨준다.  따라서

   Text의 내용에 따라 이벤트 처리를 해주면 웹 브라우져의 메뉴 버튼 이벤트를

   구분하여 처리해줄수 있다.

출처 : http://blog.naver.com/webmcr/50011429949

안녕하세요..
델을 사랑하는 사람입니다.

쓸만한 힌트컴포넌트가 있어서 소개를 드립니다.
원래 어떤분이 만드셨던것인데 ( EllipticHint : 힌트가 타원형으로 나옴 )
약간의 수정을 가해서 올려봅니다.

기능 :
힌트의 색, 폰트등의 변경이 가능..
가령 검정바탕에 흰색의 글자가 나오는데 굴림체에 20포인트로 할수가 있죠..

기본적으로 힌트의 모양은 타원형, 하지만 OnDrawHint라는 이벤트에서 마음대로
조작이 가능...

OnDrawHint외에 OnHint(마우스커서가 컨트롤 위에 위치할때 나오는 메시지)와
OnShowHint(힌트 뜨려고 할때 나오는 메시지)의 이벤트를 가지고 있습니다...
브러쉬, 폰트, 펜을 프로퍼티에서 바로 조작할 수 있습니다.
물론 힌트가 떠있는 시간도 조절할 수 있죠..(HintPauseTime)
이정도면 힌트에 대한 거의 모든 조작을 할 수 있을겁니다.

아래에 간단한 예제와 컴포넌트 소스를 함께 올립니다.
소스를 보시고 공부해 보시는 것도 좋겠지요..

그럼... 좋은 코딩하세요..


procedure TForm1.FormCreate(Sender: TObject);
begin
CCHint1.Font.Name := '굴림';
CCHint1.Font.Size := 40;
CCHint1.FontColor := clTeal;
CCHint1.HintColor := clLime;
end;

procedure TForm1.CCHint1DrawHint(Sender: TObject; Canvas: TCanvas;
var R: TRect);
var PT : Array [0..10] of TPoint;
begin

PT[0] := Point( 0, 0 );
PT[1] := Point( R.Right, 0 );
PT[2] := Point( R.Right-10, R.Bottom div 2 );
PT[3] := Point( R.Right, R.Bottom-1 );
PT[4] := Point( R.Left, R.Bottom-1 );
PT[5] := Point( R.Left+10, R.Bottom div 2 );
PT[6] := Point( 0, 0 );

Canvas.Polygon( Slice( PT, 7 ) );
{}
// Canvas.CopyRect( R, Image1.Canvas, R );
end;




unit CCHint;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs;

Const
Sqrt2 = 1.4142135624;

type
TDrawHint =
procedure (Sender : TObject; Canvas : TCanvas; var R : TRect) of object;
TOnHint =
procedure (Sender : TObject; Hint : string) of object;

TCCHint = class(TComponent)
private
{ Private declarations }
FHintPauseTime : Integer;
FFontColor : TColor;
FHintColor : TColor;
FPen : TPen;
FBrush : TBrush;
fFont : TFont;

fDrawHint : TDrawHint;
fOnShowHint : TShowHintEvent;
fOnHint : TOnHint;

procedure SetHintPauseTime(Value:Integer);
Procedure SetPen(Value : TPen);
Procedure SetBrush(Value : TBrush);
procedure fSetFont(Font : TFont);

procedure DoOnShowHint(var HintStr: string; var CanShow:
Boolean; var HintInfo: THintInfo);
procedure DoOnHint(Sender: TObject);

protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner:TComponent); Override;
destructor Destroy; Override;
published
{ Published declarations }
property HintPauseTime : Integer read FHintPauseTime
write SetHintPauseTime default 600;
property Pen : TPen Read FPen Write SetPen;
property Brush : TBrush Read FBrush Write SetBrush;
property FontColor : TColor Read FFontColor
Write FFontColor Default clBlack;
property HintColor : TColor Read FHintColor
Write FHintColor Default clYellow;
property Font : TFont read fFont write fSetFont;

property OnDrawHint : TDrawHint read fDrawHint write fDrawHint;
property OnHint : TOnHint read fOnHint write fOnHint;
property OnShowHint : TShowHintEvent read fOnShowHint write fOnShowHint;

end;

TNxHintWindow = class(THintWindow)
private
{ Private declarations }
FNxHint : TCCHint;
function FindNxHint : TCCHint;
protected
{ Protected declarations }
procedure Paint; Override;
procedure CreateParams(var Params: TCreateParams); Override;
public
{ Public declarations }
procedure ActivateHint(Rect: TRect; const AHint: string); Override;
published
{ Published declarations }
end;

procedure Register;

implementation

var
MemBmp : TBitmap;

procedure Register;
begin
RegisterComponents('C쟁이네', [TCCHint]);
end;

Constructor TCCHint.Create(AOwner:TComponent);
begin
inherited Create(AOwner);

FPen := TPen.Create;
FBrush := TBrush.Create;
fFont := TFont.Create;
FBrush.Color := clYellow;
FFontColor := clBlack;
FHintColor := clYellow;

FHintPauseTime := 600;

if not (csReading in ComponentState) then
begin
Application.OnShowHint := DoOnShowHint;
Application.OnHint := DoOnHint;

Application.HintPause := FHintPauseTime;
HintWindowClass := TNxHintWindow;
Application.ShowHint := not Application.ShowHint;
Application.ShowHint := not Application.ShowHint;
end;
end;

destructor TCCHint.Destroy;
begin
FPen.Free;
FBrush.Free;
fFont.Free;
inherited Destroy;
end;


Procedure TCCHint.fSetFont(Font : TFont);
begin
fFont := Font;
end;

Procedure TCCHint.SetHintPauseTime(Value : Integer);
Begin
If (Value <> FHintPauseTime) Then Begin
FHintPauseTime := Value;
Application.HintPause := Value;
End;
End;

Procedure TCCHint.SetPen(Value : TPen);
Begin
FPen.Assign(Value);
End;

Procedure TCCHint.SetBrush(Value : TBrush);
Begin
FBrush.Assign(Value);
End;

Function TNxHintWindow.FindNxHint : TCCHint;
var
I : Integer;
begin
Result := nil;
For I := 0 To Application.MainForm.ComponentCount-1 Do
If Application.MainForm.Components[I] Is TCCHint Then Begin
Result := TCCHint(Application.MainForm.Components[I]);
Exit;
End;
End;

procedure TNxHintWindow.CreateParams(var Params : TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style-WS_BORDER;
end;

procedure TNxHintWindow.Paint;
var
R : TRect;
OfstX,OfstY : Integer;
begin
R := ClientRect;
With MemBMP.Canvas Do Begin
Pen.Assign(FNxHint.FPen);
Brush.Assign(FNxHint.FBrush);
Font.Assign(FNxHint.FFont);

Brush.Color := FNxHint.FHintColor;
Font.Color := FNxHint.FFontColor;

OfstX := (R.Right-R.Left-TextWidth(Caption)) Div 2;
OfstY := (R.Bottom-R.Top-TextHeight(Caption)) Div 2;

if Assigned (FNxHint.fDrawHint) then
FNxHint.fDrawHint(self, MemBMP.Canvas, R)
else
begin
Ellipse(R.Left,R.Top,R.Right,R.Bottom);
{
RoundRect( R.Left,R.Top,R.Right,R.Bottom,
(R.Bottom - R.Right) div 3, (R.Bottom - R.Right) div 3);
}
end;

Brush.Style := bsClear;
TextOut(R.Left+OfstX,R.Top+OfstY,Caption);
End;
Canvas.CopyMode:=cmSrcCopy;
Canvas.CopyRect(ClientRect,MemBmp.Canvas,ClientRect);
MemBmp.Free;
end;

procedure TNxHintWindow.ActivateHint(Rect: TRect; const AHint: string);
var
ScreenDC : HDC;
Pnt : TPoint;
OfstX,OfstY : Integer;
begin
MemBmp := TBitmap.Create;

Caption := AHint;
FNxHint := FindNxHint;

MemBmp.Canvas.Font := FNxHint.FFont ;
Rect.Right := Rect.Left + MemBmp.Canvas.TextWidth(AHint);
Rect.Bottom := Rect.Top + MemBmp.Canvas.TextHeight(AHint);

OfstX := Round((Rect.Right-Rect.Left-4)*(Sqrt2-1)*0.5);
OfstY := Round((Rect.Bottom-Rect.Top-4)*(Sqrt2-1)*0.5);
With Rect Do Begin
Top := Top-OfstY;
Left := Left-OfstX;
Right := Right+OfstX;
Bottom := Bottom+OfstY;
End;
BoundsRect := Rect;
MemBmp.Width := Width;
MemBmp.Height := Height;
ScreenDC := CreateDC('DISPLAY',nil,nil,nil);
Pnt.X := 0;
Pnt.Y := 0;
Pnt := ClientToScreen(Pnt);
BitBlt(MemBmp.Canvas.Handle,0,0,Width,Height,ScreenDC,Pnt.X,Pnt.Y,SRCCOPY);
SetWindowPos(Handle,HWND_TOPMOST,Pnt.X,Pnt.Y,0,0,
SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE);
BitBlt(Canvas.Handle,0,0,Width,Height,MemBmp.Canvas.Handle,0,0,SRCCOPY);
DeleteDC(ScreenDC);
end;

procedure TCCHint.DoOnShowHint(var HintStr: string; var CanShow: Boolean;
var HintInfo: THintInfo);
begin
if Assigned(fOnShowHint) then fOnShowHint(HintStr, CanShow, HintInfo);
end;

procedure TCCHint.DoOnHint(Sender: TObject);
begin
if Assigned(fOnHint) then fOnHint(Sender, Application.Hint);
end;

end.

출처 : 델마당  

델파이에서 새 프로젝트를 했을 때 생기는 폼의 디폴트폰트는 1.0에서는 
Alial로 되어있고 2.0 3.0에서는 MS Sans Serif으로 되어있죠 그리고
델파이 옵션을 아무리 뒤져봐도 그것을 조정할 수 있게 되어있지는 않고요
그래서 델파이를 사용하는 사람들중의 99%는 그것이 조정되지 않는다라고
생각하고 있더라고요 그래서 밑의 글중 성기님은 소스를 고치라고 하셨는데..
초기 디폴트폰트는 수정 할 수 있습니다. 초기 폼의 폰트 뿐만 아니라
델파이자체의 힌트(풍선도움말)의 색상도 수정 할 수 있고요 오브젝트 인스
펙터의 오른쪽(값)부분의 글꼴색도 수정 할 수 있고요 특히 소스코드에디터
의 초기 가로,세로 크기도 수정 할 수 있습니다. 다만 그것들의 내용이 옵션
에 나와 있지 않다는것이죠 그럼 어떻게 수정하느냐 1.0에서는 윈도디렉토리
에 있는 Delphi.ini에 해당 내용을 추가 하면 되고요 2.0 3.0에서는 윈도
레지스트리에 해당 내용을 추가 하면 됩니다. 이해가 안가는것은 왜 볼랜드
에서는 델파이에 이런내용들을 옵션에 추가 안 하고 사용자가 직접 ini나 
레지스트리에 추가 하게 해 놓았는지 도무지 이해가 안가는군요

** 1.0에서는...
윈도디렉토리에 있는 Delphi.ini를 열고 다음 내용을 추가한다.


[FormDesign]
디폴트 폰트 바꾸기
DefaultFont=글꼴이름,사이즈,스타일 예)DefaultFont=굴림체,10,Bold,Italic


[Globals]
델파이 힌트 색 바꾸기
HintColor=힌트색 예) HintColor=clRed

오브젝트인스펙터의 값 글꼴색 바꾸기
PropValueColor=글꼴색 예) PropValueColor=clBlue


[Editor]
소스코드에디터크기 바꾸기
DefaultWidth=크기 예) DefaultWidth=500
DefaultHeight=크기 예) DefaultHeight=500


***2.0 3.0에서는...
윈도 레지스트리를 연다. 시작에서 실행을 선택하고 regedit를 치고 엔터를
친다 그럼 레지스트리 편집기가 실행 되는데(다들알겠지만..) 다음 항목을
찾아서 추가한다.

HKEY_CURRENT_USER
SoftWare
Borland {이 밑에 C++Builder도 있으며 똑같이 구성되어있음}
Delphi
2.0 {3.0은 3.0, 역시 동일함}
FormDesign
디폴트 폰트 바꾸기 
DefaultFont=글꼴이름,사이즈,스타일
MainWindow
델파이 힌트 색 바꾸기
HintColor=힌트색
오브젝트인스펙터의 값 글꼴색 바꾸기
PropValueColor=글꼴색
Editor
DefaultWidth=크기
DefaultHeight=크기

레지스트리 구조를 잘 아시는 분은 이것만 보고도 바로 하겠지만 잘 모르
시는분은 레지스트리를 알고 나서 건드리는게 좋은겁니다. 그렇다고 레지
스트리파일을 다른 컴퓨터에서 복사 해 오는 그런 엄청난일을 저지르는
사람은 없겠지요? 이 외에도 더 있는것 같은데 별로 도움이 안되는것들입
니다. 이 내용들은 델파이1.0에 Doc디렉토리에 inifile.txt가 있는데 거
기에 자세히 나왔습니다(한글일리가 없죠..)물론 그건 1.0에만 해당 되는데
2.0 3.0에서는 같은 내용으로 ini파일이 아니라 레지스트리라는 것만다릅니다.
그외 조금씩 다른것도 있네요.. 그럼
평안하시길~

출처 : 델마당 

ListView에서 Row별로  힌트를 다르게 주려고 한다면

MouseMove 이벤트에 처리해야 하는것은 맞습니다.


1. 먼저 OnMouseMove이벤트에서 현재 마우스 위치에 Row 즉 ListItem을 알아야 겠죠?

    그것은 ListView에 GetItemAt 이라는 함수가 있습니다.
 
   procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
   var
      item: TListItem;
    begin
       item:=ListView1.GetItemAt(X,Y);
       ....
   end;

   문론 GetItemAt으로 item을 구했는데 nil 인경우도 있습니다. 
   이럴경우도 처리해야죠

2. Mouse위치의 Item을 알았으니 ListView의 Hint를 바꿔줘야 겠죠
    다음과 같이 마우스 위치의 ListItem을 구해서 ListView의 Hint를 바꿔줄수 있습니다.
 

procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item: TListItem;
begin
  item:=ListView1.GetItemAt(X,Y);

  if Assigned(item)then
  begin
      ListView1.Tag:= item.Index ;
      ListView1.Hint:='ListView Items= '+item.Caption;
  end
......
end;
 

     그런데 Hint를 바꾼다고 해서 바로 변경된 Hint가 보여지는것이 아니죠

3.  Hint를 보여주고/ 말고 하는것은 Application객체가 담당합니다.
     
     대게 Hint가 보여지는것은 마우스위치에 있는 Control이 바뀌었을때 해당Control의 힌트를 보여주죠

      그런데 listview에서 mouse만을 움직였을때는 item만 바뀌지 control을 여전히 같은 listview이기때문에
      hint가 보여지지 않는것입니다.


4. 즉각적으로 Hint를 다시 보여주려면 Application의 Hint관련 함수를 이용하면 됩니다.
 
    // 현재 떠있는 힌트를 닫습니다.
    Application.CancelHint;    
   
    // 넘겨준 TPoint위치에 hint를 보여줍니다.
   Application.ActivateHint( point );

5. 결론적으로 listveiw의 hint를 바꾼뒤에
     위 Application 의 CancelHint  , ActivateHint 를 한번씩 호출해주면 됩니다.
 

procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item: TListItem;
begin
  item:=ListView1.GetItemAt(X,Y);

  if Assigned(item)then
  begin
      ListView1.Hint:='ListView Items= '+item.Caption;
      Application.CancelHint;
      Application.ActivateHint(Mouse.CursorPos);
  end;
end;
 

6. 그러데 MouseMove 이벤트가 같은 item위치에서 여러번 발생할수있죠
    마우스위치의 item이 바뀌지 않았는데 반복해서 CancelHint , ActivateHint 를 띄우면
    좀 이상하겠쬬

    그러니 현재 hint로 띄운 item을 기억하고 있을 필요가 있을것입니다.
    
   즉 item이 변경되면 hint를 새로 띄우는것이 아니라
    hint가 변경되면 hint를 새로띄우는것이죠

procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  item: TListItem;
begin
  item:=ListView1.GetItemAt(X,Y);

  if Assigned(item)then
  begin
    if(item.Index <>ListView1.Tag ) then
    begin
      //item의 index를 ListView.Tag에 기억해두고 tag가 같지 않는경우에만 ...
      ListView1.Tag:= item.Index ; 
      ListView1.Hint:='ListView Items= '+item.Caption;
      Application.CancelHint;
      Application.ActivateHint(Mouse.CursorPos);
    end;
  end;

end;   

     뭐 대충 이런식으로 하면 됩니다.

     이 방식으로 listview뿐만 아니라 VCL의 모든 Control에 적용할수 있습니다.
     마우스 위치의 control이 변경되지 않았는데
     hint를 바꾸고 싶을경우에는 

     1)  먼저 hint를 바꾼후에 
     2)  Application.CancelHint;
     3)  Application.ActivateHint(Mouse.CursorPos);
       해주면 됩니다.
     
6. 마지막으로  Application 객체에는 hint관련해서 프로퍼티와 함수가 몇가지 더 있습니다.

      Application.Hint;
      Application.HintColor:=clRed;  //힌트 보여지는 Color
      Application.HintPause; //Control위에 마우스가 들어간뒤에 Hint가 보여지기까지 delay
      Application.HintHidePause; //hint가 나타난후에 사라지기까지 시간
      Application.HintShortCuts;
      Application.HintShortPause;

7.  hint를 좀더 발전된 형태로 보여주고 싶다면

     THintWindow 를 상속받아서 hint 클래스를 새로만드시구요   
     TMyHintWindow = class(THintwindow) 
   
     다음과 같이 HintWindowClass 에 설정해주시면 
     HintWindowClass := TMyHintWindow 
     Application객체가 HintWindowClass 에 등록된 class를 생성해서 보여줍니다.

 flashax.zip

Flash 파일을 폼에 박아넣는 Component.
dpk 를 설치하면 TShockWaveFlash, TShockWaveFlashEx, TShockWaveFlashList 3개의 Component 가 생김.
 
TShockWaveFlash 를 하나 폼에 박고,
Movie 라는 프로퍼티에 경로를 지정하면 일단 기본적으로 Flash 파일이 재생됨.
 
...그냥 쓰면 됨..-_-;
 
[관련사이트]


평상시 동영상을 볼 필요가 있는 경우 ,A Player(Windows95/98/Me/화상&사운드)를 사용하고 있습니다. 여러 가지 시험했습니다만 , 이것이 제일 쓰기 쉽다고 생각합니다. 그리고 , 상황에 따라 ,Windows Media Player 9 시리즈나 ,Real.com - RealOnePlayer is now RealPlayer를 사용하기도 하고 있습니다. 물론 후자의2개는 비정상으로 무겁습니다만. 


그것은 그것으로서Delphi로부터TWindowsMediaPlayer를 사용하고 싶어졌습니다. RealPlayer(분)편은 놔 두어 ,Windows Media Player 9 를Delphi로부터 이용하고 싶으면 그런 것입니다. 

기본방침으로서는 , 인터넷상의 파일이 아니고 , 로컬에 보존되고 있는 파일을 재생하는 것만을 생각합니다. 이라고 할까 , 실제로 시험해 본 결과 , 네트워크상의 파일을 취급하려면 어쩐지 여러 가지 방해 냄새가 난 것 같았던 것과 그런 일은 본가에 맡기고 녹아라고 하는 근처로부터 , 역산된 방침이기도 합니다. 

참고 사이트TOP


다음의 링크가 , 참고로 한 사이트입니다만 , 대부분이 「Windows Media Player 7 SDK」을 바탕으로 하고 있습니다. 「9」은 아니고 「7」입니다. 개발 환경은 「9」이 들어가 있으므로 돌이킬 수 없습니다만 , 「7」을 사용하고 있는 경우에서도 , 그대로 샘플 코드를 사용할 수 있을 것입니다. 「9밖에 없는 메소드나 프롭퍼티나 이벤트는 모두 사용하고 있지 않습니다」로부터. 



ActiveX의 읽어들이기TOP


우선 ,Windows Media Player 을 컴퍼넌트로서 사용하기 위해서(때문에) , 컴퍼넌트 팔레트에 표시시킬 필요가 있습니다(라고 생각한다). 현재형은 기본적인 순서로 , 과거형이 되어 있는 것은 혹시 변경해야할 것인가도 모르는 순서입니다. 


  1. Delphi의 메뉴로 「파일(F)>모두 닫는다(L)」를 클릭합니다. 
  2. Delphi의 메뉴로 「컴퍼넌트(C)>ActiveX컨트롤의 혼잡(X)...」을 클릭합니다. 
  3. 「ActiveX의 읽어들이기」라고 하는 화면이 열립니다. 

  4. 「Windows Media Player (Version 1.0)」을 선택했습니다. 
  5. 「인스톨(I)...」을 클릭합니다. 
  6. ※한 번 인스톨 하고 있으므로 「옮겨놓습니까?」라고 (들)물었습니다. 「네」로. 
  7. 「인스톨」이라고 하는 화면이 열립니다. 여기는 그대로 변경하지 않고(「기존의 패키지에 추가」라고 하는 탭으로 , 파일명이 「...¥dclusr.dpk」)에 「OK」을 클릭했습니다. 
  8. 「패키지 - dclusr.dpk」라고 하는 화면이 열렸습니다. 
  9. 「인스톨」버튼을 클릭하고 싶은데 사용 불가가 되어 있으므로 「컴파일」을 클릭했습니다. 
  10. 컴파일 후 , 「인스톨」버튼이 사용 가능하게 되었으므로 클릭했습니다. 
  11. 개 버튼으로 닫으려고 하면(자) , 보존할까 (들)물어졌으므로 , 보존했습니다. 
  12. 「ActiveX」탭에 「TWindowsMediaPlayer」이 추가되었습니다. 


그렇다고 하는 것 같은 느끼고로 , 대체로로 인스톨 합니다. 필요없게 되었을 때의 지우는 방법입니다만 , 실은 잘 모릅니다. 다만 , 다음과 같이 하는 것이 올바른 삭제의 이상접근인 방법이라고 생각합니다. 


  1. Delphi의 메뉴로 「파일(F)>모두 닫는다(L)」를 클릭합니다. 

  2. Delphi의 메뉴로 「프로젝트(P)>옵션(O)...」을 클릭합니다. 
  3. 「프로젝트 옵션」이라고 하는 화면이 열립니다. 
  4. 「패키지」탭을 선택해 , 「설계시 패키지」일람으로 「Borland User Components」의 체크를 뗍니다. 
  5. 「OK」을 클릭합니다. 
  6. 「ActiveX」탭으로부터 「TWindowsMediaPlayer」이 없어졌습니다. 


전제 조건TOP


이후의 샘플에서는 , 폼에 배치한 「TWindowsMediaPlayer」의 Name 는 「player」이라고 합니다. 


다음과 같은 함수를 사용해 , 취득한 값을 표시합니다. 

//  ---------------------------------------------------------------------------
// 디버그용 메세지 표시
procedure TForm1.ShowMsg(const S: string);
begin
if (Assigned(Memo1)) then

begin
if (S <> '') then Memo1.Lines.Add(S);
if (Memo1.Lines.Count > 100) then Memo1.Lines.Delete(0);
end;

end;


다음과 같은 배열을 사용해 , 취득한 값을 표시합니다. 

//  ---------------------------------------------------------------------------
// ON/OFF표시용 문자 배열
const
ON_OFF: array[Boolean] of string = ('OFF', 'ON');
OK_NG: array[Boolean] of string = ('NG', 'OK');


플레이어의 설정을 조사하는TOP


//  ---------------------------------------------------------------------------
// 플레이어의 설정을 조사하는
procedure TForm1.Button14Click(Sender: TObject);

var
b: Boolean;
s: string;
i: integer;
d: double;

begin
// 단락선
ShowMsg(StringOfChar('-', 20));

// 버젼
s := player.versionInfo;
ShowMsg(s);

// 자동 재생(변경 가능)

b := player.settings.autoStart;
s := Format('자동 재생 = %s', [ON_OFF[b]]);
ShowMsg(s);

// 밸런스(변경 가능)
i := player.settings.balance;
s := Format('스테레오 밸런스(-100..100) = %d', [i]);
ShowMsg(s);

// 에러 다이얼로그(변경 가능)
b := player.settings.enableErrorDialogs;

s := Format('에러 다이얼로그 표시 = %s', [ON_OFF[b]]);
ShowMsg(s);

// 뮤트(변경 가능)
b := player.settings.mute;
s := Format('뮤트 = %s', [ON_OFF[b]]);
ShowMsg(s);

// 재생 회수(변경 가능)
i := player.settings.playCount;
s := Format('재생 회수 = %d', [i]);
ShowMsg(s);

// 재생 속도(변경 가능)

d := player.settings.rate;
s := Format('재생 속도 = %f', [d]);
ShowMsg(s);

b := player.settings.isAvailable['Rate'];
if (b) then
s := '재생 속도 변경 = 가능'
else

s := '재생 속도 변경 = 불가';
ShowMsg(s);

// 음량(변경 가능)
i := player.settings.volume;
s := Format('음량 = %d', [i]);
ShowMsg(s);

// 루프 모드(변경 가능)
b := player.settings.getMode('loop');
s := Format('루프 재생 모드 = %s', [ON_OFF[b]]);
ShowMsg(s);

// 상후르모드(변경 가능)

b := player.settings.getMode('shuffle');
s := Format('랜덤 재생 모드 = %s', [ON_OFF[b]]);
ShowMsg(s);

// 단락선
ShowMsg(StringOfChar('-', 20));
end;


플레이 리스트에 미디어를 추가하는TOP


TWindowsMediaPlayer에서는 , 재생 대상의 파일은 플레이 리스트로 관리되고 있습니다. 플레이 리스트는 , 본가의 플레이어에서는 , 직접 파일을 드롭 하면(자) 「재생 리스트1」같은 성적 매력이 없는 이름의 플레이 리스트가 작성됩니다만 ,Delphi그리고 사용할 때도 마찬가지로 ,player.currentPlaylist 그리고 꺼낼 수 있는 플레이 리스트는 표시를 보는 한 「재생 리스트1」에 해당하는 것 같습니다. 아마 보존하거나 하면(자) 화제가 바뀌겠지요지만. 

그리고 , 문제는 , 플레이 리스트에 파일을 추가하는 방법입니다. 왜 문제인가 , 라고 하면(자) , 플레이 리스트에 추가하는 메소드는 , 인수를 ,IWMPMedia 이라고 하는 형태로 받기 때문으로 , 이것을 단순하게 파일 패스로부터 만들어 낼 방법을 잘 모릅니다. 

그리고 , 여러가지 검색하거나SDK를 바라보거나 하고 있으면(자) ,player.mediaCollection.add 라고 하는 메소드가 ,IWMPMedia 를 돌려주는 것을 알 수 있었습니다. 그리고 , 다음의 코드는 이것을 이용하고 있다는 것입니다. 

본래의 것 player.mediaCollection 은 , 미디어일 추가해 나가 , 저작권자라든지 장르등으로 좁힌 플레이 리스트를 작성하는 메소드가 있으므로 , 이것을 이용해 대량의 미디어로부터 보고 싶은 미디어를 비식과 꺼내 , 그 만큼을 재생한다 , 라고 하는 것 같은 목적으로 사용하지만 같습니다. 

그리고 , 훨씬 훗날을 위해서(때문에) , 플레이 리스트에 무엇이 들어가 있을까를 알아 둘 필요가 있으므로 ,ListBox에 추가한 미디어를 표시하고 있습니다. 

//  ---------------------------------------------------------------------------
// 플레이 리스트에 파일을 추가
procedure TForm1.Button17Click(Sender: TObject);
var
i: integer;
Media: IWMPMedia;

begin
// 파일을 선택시키는
if OpenDialog1.Execute then
begin
// 가장 간단한 추가 방법(다만1파일 한정)

//player.URL := OpenDialog1.FileName;
// 모든 파일에 대해
for i := 0 to OpenDialog1.Files.Count - 1 do
begin

try
// 플레이 리스트에 추가하기 위한Media오브젝트를 작성하는
Media := player.mediaCollection.add(OpenDialog1.Files[i]);
// 플레이 리스트에 추가하는
player.currentPlaylist.appendItem(Media);
// 조작용의 리스트 박스에도 추가하는

ListBox1.Items.Add(Media.name + '=' + Media.sourceURL);
except
// 미대응 파일은 무시하는
;
end;
end;
end;
end;


플레이 리스트 조작TOP


이하의2개의 「선택한 미디어를...한다」라고 하는 처리로 , 리스트 박스와 플레이 리스트의 대응이 필요하게 됩니다. 그렇다고 할까 이 때문에 리스트 박스에 추가하고 있습니다. 

플레이 리스트중의 액티브한 미디어를 변경하는 것도 , 미디어를 삭제하는 것도 , 변함 없이 IWMPMedia 로 지정할 필요가 있습니다. 이 IWMPMedia 를 찾는데 또다시 파일 패스는 사용할 수 없기 때문에(뭐 보통 같은 생각이 들어 왔습니다만), 리스트 박스와의 대응을 하고 있습니다만 , 문제는SDK을 보면(자) , 「상정외의 파일 삭제에도 대응합시다」라고 있습니다. 즉 리스트 박스에는 표시되고 있는데 , 실제의 파일이 어디엔가 행방불명이 되어 있는 상태가 있을 수 있는 , 이라고 하는 것이군요. 여기에서는 생각하고 있지 않습니다. 

//  ---------------------------------------------------------------------------
// 선택한 미디어를 재생하는
procedure TForm1.Button18Click(Sender: TObject);
begin
if (ListBox1.ItemIndex = -1) then exit;
// 만약을 위해 지금의 미디어를 정지해 두어

player.controls.stop;
// 확인을 위해서(때문에) 지금의 미디어의 명칭을 표시
Label3.Caption := player.currentMedia.name;
// 미디어를 바꾸는
player.controls.currentItem := player.currentPlaylist.Item[ListBox1.ItemIndex];
// 확인을 위해서(때문에) 지금의 미디어의 명칭을 표시
Label2.Caption := player.currentMedia.name;
// 로 , 재생하는

player.controls.play;
end;

// ---------------------------------------------------------------------------
// 선택한 미디어를 삭제하는
procedure TForm1.Button15Click(Sender: TObject);
var
Media: IWMPMedia;
begin

if (ListBox1.ItemIndex = -1) then exit;
// 선택한 미디어를 꺼내는
Media := player.currentPlaylist.Item[ListBox1.ItemIndex];
// 플레이 리스트로부터 그 미디어를 삭제하는
player.currentPlaylist.removeItem(Media);

// 리스트 박스로부터도 삭제해 두는
ListBox1.DeleteSelected;
end;


이하의1행 처리들은 , 실제의 곳 ,TWindowsMediaPlayer을 폼상에 둔 것만으로 , 표준으로 컴퍼넌트에 표시되고 있는 버튼에 거의 대응하고 있습니다. 즉 , 정말로 이만큼의 처리를 실시하는 버튼을 배치할 필요는 , 코렙폿치도 없을 것이라고 말하는 것입니다. 

//  ---------------------------------------------------------------------------
// 재생 리스트내의 현재의 항목의 위치를 , 다음의 항목에
procedure TForm1.Button6Click(Sender: TObject);

begin
player.controls.next();
end;
// ---------------------------------------------------------------------------
// 재생 리스트내의 현재의 항목의 위치를 ,1 개전의 항목에
procedure TForm1.Button9Click(Sender: TObject);
begin
player.controls.previous();

end;
// ---------------------------------------------------------------------------
// 현재의 미디어 항목의 재생을 개시하는지 , 또는 일시정지의 항목의 재생을 재개
procedure TForm1.Button8Click(Sender: TObject);
begin
player.controls.play();
end;
// ---------------------------------------------------------------------------

// 미디어 항목의 재생을 정지
procedure TForm1.Button10Click(Sender: TObject);
begin
player.controls.stop();
end;
// ---------------------------------------------------------------------------
// 미디어 항목의 재생을 일시정지
procedure TForm1.Button7Click(Sender: TObject);

begin
player.controls.pause();
end;
// ---------------------------------------------------------------------------
// 미디어 항목의 빨리 감기를 개시
procedure TForm1.Button3Click(Sender: TObject);
begin
player.controls.fastForward();

end;
// ---------------------------------------------------------------------------
// 미디어 항목의 고속의 권 반환을 개시
procedure TForm1.Button4Click(Sender: TObject);
begin
player.controls.fastReverse();
end;


시간에 관한 정보TOP


이것은 , 재생중의 미디어가 없으면 의미가 없는 정보입니다. 실제 ,nil체크를 실시하지 않은 채로 , 완전히 파일을 추가하지 않고 이 처리를 실시하면 , 예외가 발생해 버립니다. 

//  ---------------------------------------------------------------------------
// 재생중의 미디어의 시간에 관한 정보
procedure TForm1.Button1Click(Sender: TObject);
var
s, s1, s2: string;
d1, d2: double;

begin
// 단락선
ShowMsg(StringOfChar('-', 20));

// 재생중의 미디어가 있는지 어떤지
if (player.currentMedia = nil) then

begin
s := '재생중의 미디어가 없습니다. ';
ShowMsg(s);
end
else
begin
// 현재의 미디어 항목의 초수로 가리킨 재생 시간(시분초)
s1 := player.currentMedia.durationString;

// 미디어 항목내의 현재 위치 취득(시분초)
s2 := player.controls.currentPositionString;
// 연결
s := Format('현재 위치 %s / 재생 시간 %s', [s2, s1]);
ShowMsg(s);

// 현재의 미디어 항목의 초수로 가리킨 재생 시간
d1 := player.currentMedia.duration;

// 미디어 항목내의 현재 위치 취득(변경 가능)
d2 := player.controls.currentPosition;
// 연결
s := Format('현재 위치 %f 초 / 재생 시간 %f 초', [d2, d1]);
ShowMsg(s);
end;

// 단락선
ShowMsg(StringOfChar('-', 20));

end;


차의 것은 , 컴퍼넌트에 표준으로 붙어 있는 트럭 바로 현재 위치를 변경했을 때 등에 불리는 이벤트(OnPositionChange)입니다. 원래의 위치와 새로운 위치가 건네받아 옵니다. 어떻게 사용하는지 모릅니다만 , 강제적으로 바탕으로 되돌린다든가?

//  ---------------------------------------------------------------------------
// 현재 위치가 마우스등에서 변경된(이벤트)
procedure TForm1.playerPositionChange(Sender: TObject; oldPosition,
newPosition: Double);
var
s: string;

begin
// 단락선
ShowMsg(StringOfChar('-', 20));

// 표시용으로 성형
s := Format('%f 초 -> %f 초로 변경', [oldPosition, newPosition]);
ShowMsg(s);

// 단락선
ShowMsg(StringOfChar('-', 20));

end;


to be continued...TOP


예상외로 길어졌으므로 , 그2에 계속됩니다.


unit ImgButton; 
 
interface 
 
uses 
  SysUtils, StdCtrls ,Classes, Controls, ExtCtrls,Graphics,Messages; 
 
type 
  TImgButton = class(TImage) 
  private 
    GetLoadFilePicNorman:Tbitmap; 
    GetLoadFilePicOver:Tbitmap; 
    GetLoadFilePicPress:Tbitmap; 
    FTransparentColor: TColor; 
    FOnChange: TNotifyEvent; 
    { Private declarations } 
  protected 
    procedure SetLoadFilePicNorman(PicNormanPath:Tbitmap);virtual; 
    procedure SetLoadFilePicOver(PicOverPath:Tbitmap);virtual; 
    procedure SetLoadFilePicPress(PicPressPath:Tbitmap);virtual; 
    procedure BitmapsChanged( Sender: TObject ); 
    procedure SetTransparentColor(ValueColor: TColor); 
    procedure CMMouseEnter (var Message: TMessage); message CM_MOUSEENTER; 
    procedure CMMouseLeave (var Message: TMessage); message CM_MOUSELEAVE; 
    procedure MouseDown( Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); override; 
    procedure MouseUp( Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); override; 
    { Protected declarations } 
  public 
 
    constructor Create(AOwner: TComponent);override; 
    { Public declarations } 
  published 
    property LoadPicNorman:Tbitmap read GetLoadFilePicNorman write SetLoadFilePicNorman;// Default '\image\Button_Play_Normal.bmp'; 
    property LoadPicOver:Tbitmap read GetLoadFilePicOver write SetLoadFilePicOver;// Default '\image\Button_Play_Over.bmp'; 
    property LoadPicPress:Tbitmap read GetLoadFilePicPress write SetLoadFilePicPress;// Default '\image\Button_Play_Press.bmp'; 
    property TransparentColor: TColor read FTransparentColor write SetTransparentColor;    { Published declarations } 
  end; 
 
procedure Register; 
 
implementation 
 
constructor TImgButton.Create(AOwner: TComponent); 
begin 
    GetLoadFilePicNorman:=Tbitmap.Create; 
    GetLoadFilePicOver:=Tbitmap.Create; 
    GetLoadFilePicPress:=Tbitmap.Create; 
    FTransparentColor:=clFuchsia; 
    FOnChange:=BitmapsChanged; 
inherited Create(AOwner); 
Width:=32; 
Height:=32; 
end; 
 
procedure TImgButton.CMMouseEnter (var Message: TMessage); 
begin 
  inherited; 
  PicTure.Bitmap.FreeImage; 
  PicTure.Bitmap:=GetLoadFilePicOver; 
end; 
 
procedure TImgButton.CMMouseLeave (var Message: TMessage); 
begin 
  inherited; 
  PicTure.Bitmap.FreeImage; 
  PicTure.Bitmap:=GetLoadFilePicNorman; 
end; 
 
procedure TImgButton.MouseDown( Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); 
begin 
  inherited; 
  PicTure.Bitmap.FreeImage; 
  PicTure.Bitmap:=GetLoadFilePicPress; 
end; 
 
procedure TImgButton.MouseUp( Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); 
begin 
  inherited; 
  PicTure.Bitmap.FreeImage; 
  PicTure.Bitmap:=GetLoadFilePicNorman; 
end; 
 
procedure TImgButton.SetLoadFilePicNorman(PicNormanPath:Tbitmap); 
begin 
  GetLoadFilePicNorman.Assign(PicNormanPath); 
  inherited; 
  PicTure.Assign(PicNormanPath); 
  PicTure.Bitmap:=GetLoadFilePicNorman 
end; 
 
procedure TImgButton.SetLoadFilePicOver(PicOverPath:Tbitmap); 
begin 
GetLoadFilePicOver.Assign(PicOverPath); 
end; 
 
procedure TImgButton.SetLoadFilePicPress(PicPressPath:Tbitmap); 
begin 
GetLoadFilePicPress.Assign(PicPressPath); 
end; 
 
procedure TImgButton.BitmapsChanged( Sender: TObject ); 
begin 
  if Assigned( FOnChange ) then 
    FOnChange( Self ); 
end; 
 
procedure TImgButton.SetTransparentColor(ValueColor:TColor); 
begin 
  if FTransparentColor <> ValueColor then 
  begin 
    FTransparentColor := ValueColor; 
    PicTure.Bitmap.TransparentColor:=FTransparentColor; 
    //BitmapsChanged(Self); 
  end; 
end; 
 
procedure Register; 
begin 
  RegisterComponents('8Enter_Control', [TImgButton]); 
end; 
 
end. 


우선 구글에서 검색하기 ㅋㅋ
 
 
블로그에서 주어온 거 (http://mc4s.tomeii.com/tt/57)
 
메신져 - 파일 전송 가능한 메신져. LAN 환경. 클로즈 소스. GPL
http://sourceforge.net/projects/achat
확대경 -  화면 부분 확대,  소스, GPL
http://sourceforge.net/projects/magnifier
colored library - 문법 강조 , LGPL/MPL1.1, 이글립스 플러그인
http://sourceforge.net/projects/colorer/
아레스 갤럭시 P2P - 슈퍼P2P, 소스, GPL
http://sourceforge.net/projects/aresgalaxy
delphicodetodoc - 델파이 코드를 문서로, 소스, GPL
http://sourceforge.net/projects/dephicodetodoc
dev-php IDE - php IDE 개발 환경, 소스, GPL
http://sourceforge.net/projects/devphp
crash point - worms 아류, 소스, GPL
http://sourceforge.net/projects/crashpoint
delphi code analyser - 델파이 코드 분석툴, 소스, MPL1.1
http://sourceforge.net/projects/dca
Scintilla Project 컴포넌트 - Scintilla 컴포넌트, 소스, LPGL/MPL1.1
http://sourceforge.net/projects/delphisci
프로메테우스 프로젝트 - 라크나로크 서버, 소스, GPL
http://sourceforge.net/projects/prometheusproj
Recognition And Vision Library - 패턴인식 라이브러리, 소스, LGPL
http://sourceforge.net/projects/ravl
소코반 - 게임, 소스, 라이센스 없음
http://sourceforge.net/projects/sokobanyasc
LCD Smartie -  LCD 개발 프로그램, 소스, LGPL/GPL/MPL1.1
http://sourceforge.net/projects/lcdsmartie
Legend of Mir2 Diamond Emulator - 미르의 전설 2 서버/클라이언트 에뮬레이터, 소스, GPL
http://sourceforge.net/projects/diamondm2server
InstantObjects - DB 관련 컴포넌트 패키지, 소스, MPL1.1
http://sourceforge.net/projects/instantobjects
HomeNet PhoneNet - VOIP, 소스, GPL/Nethack General Public License
http://sourceforge.net/projects/hnpnren
shundown monster - 컴퓨터 종료 어플, 소스, GPL
http://sourceforge.net/projects/shutdown
iSafer firewall  - 방화벽, 소스, GPL (한국)
http://sourceforge.net/projects/winsockfirewall
PTISC - 턴베이스 게임엔진(2D Isomatric) 소스, GPL
http://sourceforge.net/projects/ptisc
Klipboard - 클립보드툴, 소스, LGPL
http://sourceforge.net/projects/klipboard
델파이 Indy(9,10)데모, 소스, MPL1.1
http://sourceforge.net/projects/internetdemos
Packetyzer - 패킷 분석기, 소스, GPL
http://sourceforge.net/projects/packetyzer
Programmer's Notepad - 편집기, GPL
http://sourceforge.net/projects/pnotepad
Charset Detector - 문자 코드 검출기, 소스, LGPL
http://sourceforge.net/projects/chsdet
GenIconXP - 다중 아이콘 파일 생성기, 소스, GPL
http://sourceforge.net/projects/geniconxp

Delphi에서 Component 만들기

델파이_컴포넌트_제작.pdf : 델파이에서 컴퍼넌트 만들기 

Delphi 함수 레퍼런스

델파이_함수_레퍼런스.pdf 

Delphi VCL 레퍼런스

델파이_VCL_레퍼런스.PDF : 델파이 컴퍼넌트 속성 설명

+ Recent posts