이미지의 URL 주소를 이용해서 다운로드하고 화면에 표시하는 함수입니다.  웹 브로우져를 보면 이미지를 비동기적으로 다운로드하게 되는데, 그러한 경우 쉽게 사용할 수 있도록 꾸며봤습니다.


소스는 아래 링크를 참고하시기 바랍니다.

https://code.google.com/p/ryulib4delphi/source/browse/trunk/XE2/LoadImageFromURL.pas


동기적으로 다운로드 받는 것은 아래와 같이 사용하시면 됩니다.  "Tick: 1156342"의 시간이 걸렸습니다.  https를 이용하는 경우에는 한참 걸리게 됩니다.  

procedure TfmMain.btLoadJPEGClick(Sender: TObject);
var
  Tick, OldTick : int64;
begin
  moMsg.Clear;

  QueryPerformanceCounter (OldTick);
  LoadImageFromUrlToBitmap(
    'https://t1.daumcdn.net/cfile/tistory/196F444B4DE068841D',
    Image.Picture.Bitmap
  );
  QueryPerformanceCounter (Tick);
  moMsg.Lines.Add(Format('Tick: %d', [Tick - OldTick]));
end;


비동기적으로 다운로드할 경우에는 아래와 같이 하시면 됩니다.  함수 이름만 바뀝니다.  그리고, 함수는 바로 리턴되지만, 이미지가 성공적으로 다운로드 되었을 때 화면에 표시됩니다.  "Tick: 3119"의 시간이 걸렸습니다.

procedure TfmMain.btAsyncClick(Sender: TObject);
var
  Tick, OldTick : int64;
begin
  moMsg.Clear;

  QueryPerformanceCounter (OldTick);
  AsyncLoadImageFromUrlToBitmap(
    'https://t1.daumcdn.net/cfile/tistory/196F444B4DE068841D',
    Image.Picture.Bitmap
  );
  QueryPerformanceCounter (Tick);
  moMsg.Lines.Add(Format('Tick: %d', [Tick - OldTick]));
end;


클래스를 사용하면 쉽게 구현할 수 있었지만, "이미지를 다운받는다"를 보다 직관적으로 사용할 수 있도록 내부에 익명 메소드를 사용해서 처리했습니다.  자세한 것은 소스를 참고하시기 바랍니다.


Posted by 류종택

델파이에서 "Control Panel Applet"을 실행하려면 다음과 같이 하면 됩니다.  이미 잘 알려져 있는 방법입니다.

uses
  ShellAPI;
  ...
  ShellExecute (Handle, nil, 'mmsys.cpl', '', '', SW_SHOWNORMAL);


그런데, 제가 원하는 작업은 아래 그림처럼 컨트롤 판넬이 실행되고 난 뒤에 특정 텝 페이지로 이동하는 것입니다.  




이런 경우에는 원하는 텝 페이지의 순번을 파라메터로 다음과 같이 전달하면 됩니다.  참, 쉽죠?  ^^*

(아!  번호는 0번부터 시작됩니다)

  ShellExecute (Handle, nil, 'control.exe', 'mmsys.cpl,,1', '', SW_SHOWNORMAL);




Posted by 류종택

첫 번째 강의는 녹화하지 못해서 자료가 없습니다.

강의 들으신 분들에게만 보내드렸는데, 

재생 포멧을 업데이트하면서 호환성이 문제가 되어 받으신 분들이 재생을 못한다고 하시기에,

새로운 포멧의 파일을 공개합니다.

다시 메일 보내고 일일히 확인하기 귀찮아서가 절대.. 음.. 맞습니다 ㅡ.ㅡ;


우선 압축을 푸시고,  (7zip으로 분할 압축되어 있습니다.  블로그 첨부파일 크기 제한 때문에)

http://www.himytv.com/ 사이트에서 녹화보기를 클릭하시고 파일을 선택하시면 됩니다.


유튜브에 올린 자료는 http://youtu.be/HX_lEkGdhvk 를 참고하시기 바랍니다.  

유튜브에서는 하마티에 비해서 화질이 좀 떨어집니다.


플래이 중에 다음과 같은 키를 누르시면 재생 속도가 변합니다.  (곰플레이어 키와 동일)
C: 배속, X:저속, Z: 기본속도



Sample.7z.001


Sample.7z.002


Sample.7z.003


Sample.7z.004



Posted by 류종택

아주 작고 간단한 파서입니다.  검색을 해서 주어 쓰려고 했지만, 역시나 제가 원하는 스타일을 찾기가 어려워서 그냥 만들어 쓰기로 했습니다.  


이렇게 허접한 것을 올릴 때는 항상 두려움이 앞서지만, 가끔 저와 같은 필요를 느끼는 분들이 있을 지 모르니 일단 갑니다 ^^;




[그림 1] 예제의 실행 상태


[그림 1]은 파라메터를 "1 -a=3 2 -b=abce -d"로 주고 실행한 결과 입니다.  

(C:/> Sample.exe 1 -a=3 2 -b=abce -d)


"-"가 앞에 붙으면 스위치로 인식하고 나머지는 파라메터가 됩니다.  Index는 0부터 시작하는 것에 주의하세요.  그리고, 파라메터와 스위치가 따로 카운트 되고 있는 점도 유의하셔야 합니다.  이후는 예제와 소스를 참고하시기 바랍니다.


예제의 위치: http://code.google.com/p/ryulib4delphi/source/browse/#svn%2Ftrunk%2FXE2%2FSamples%2FPipes


소스의 위치: http://code.google.com/p/ryulib4delphi/source/browse/trunk/XE2/Para.pas




Posted by 류종택



주의사항 및 기타

  • 무료 강의입니다.
  • 강의 시간 이외에는 어떠한 질문도 받지 않습니다.  (메일이나 댓글 등으로 질문하지 말아주세요)
  • 강의 참석하신 분들에게만 소스 파일을 보내드립니다.  (재배포 금지)
  • 이번 참가자 분들에게는 지난 번 강의 자료를 포함해서 보내드리겠습니다.
  • 사무실에서 눈치보이시는 분들은 접속 후, 이메일을 채팅창에 올려주세요.  끝까지 참가한 경우 출석으로 인정하겠습니다 ^^*
  • 녹화 하지 않으며, 녹화 및 공개에 대해서도 허용하지 않습니다.


Posted by 류종택

강의 목표는 동영상 파일의 세부 정보를 표시하고, 비디오를 디코딩하여 화면에 표시하는 것 입니다.


강의실 바로 가기 - http://in.himytv.com/RLzNjQ


"MinGW + ffmpeg + GCC + Delphi "를 이용해서 동영상 플레이어를 만드는 것이 최종 목표입니다.

반응을 봐서 ffmpeg for Android 그리고 PHP와 연동되는 미디어 인코딩 서버 등 주제를 계속 확장해 나갈 예정입니다.

 

작성할 프로그램의 데모는 아래와 같습니다.  

"Open" 버턴을 클릭하시면 해당 동영상 파일의 정보를 표시해줍니다.

"Read Packet " 버턴을 클릭하시면 비디오 내용을 디코딩하여 화면에 표시하여 줍니다.

버턴을 누를 때마다 한 화면씩 표시합니다.


Sample.7z


자세한 내용은 http://ryulib.tistory.com/248 를 참고하여 주세요.

준비물이 있으니 강의를 참석하고자 하시는 분들은 위의 링크에서 미리 파일들을 다운 받아 주세요.

 

주의사항 및 기타

  - 무료 강의입니다.

  - 강의 시간 이외에는 어떠한 질문도 받지 않습니다.  (메일이나 댓글 등으로 질문하지 말아주세요)

  - 강의 참석하신 분들에게만 소스 파일을 보내드립니다.  (재배포 금지)

  - 녹화 하지 않으며, 녹화 및 공개에 대해서도 허용하지 않습니다.


Posted by 류종택

unit _fmMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TfmMain = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    FSaveDwmCompositionEnabled : boolean;
  public
  end;

var
  fmMain: TfmMain;

implementation

uses
  DwmApi;

{$R *.dfm}

procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if FSaveDwmCompositionEnabled then
    DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
 FSaveDwmCompositionEnabled := DwmCompositionEnabled;
  if FSaveDwmCompositionEnabled then
    DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
end;

end.


24: uses 절에 DwmApi를 추가합니다.  델파이에 기본 제공됩니다.  (너무 낮은 버전에서는 제공 안됩니다)


36: 에어로 관련 API를 사용 할 수 있는 지 확인합니다.  윈도우 버전이 Vista 이하 인 경우 등에서는 사용이 불가능하기 때문에 해당 API가 제공되는 DLL을 로딩할 수 없습니다.


37-38: 사용 가능한 상태인 경우에는 에어로를 끕니다.


30-31: 프로그램이 종료 할 때, 이전에 저장된 플래그를 통해서 에어로가 사용 가능했었다면, 다시 되돌려 놓습니다.



Posted by 류종택
TAG Aero, Delphi

익명 메소드를 이용해서 LinkeList로 구현 된 데이터 구조에 대한 Iteration을 작성 해보았습니다.


우선, 익명 메소드의 타입을 선언합니다.

type
  TSimpleIterateProcedure = reference to procedure(ALinkedListNode:TLinkedListNode);



우리가 작성하는 클래스는 TLinkedList라고 했을 때, Iterate 메소드를 아래와 같이 구현합니다.

procedure TLinkedList.Iterate(AProcedure: TSimpleIterateProcedure);
...
begin
  Current := Head;
  while Current <> Tail do begin
    AProcedure(Current);
    Current := Current.RightNode;
  end;
end;



사용법을 보이기 위해서, 메모 콤포넌트에 각 노드들의 이름을 표시한다고 가정하겠습니다.  소스 코드는 다음과 같습니다.

procedure TfmMain.FormCreate(Sender: TObject);
begin
    LinkedList.Iterate(
      procedure (ALinkedListNode:TLinkedListNode) begin
        Memo1.Lines.Add(ALinkedListNode.Name);
      end
    );
end;

모든 라인은 언제나 동일한 형태로 사용되며, 5: 라인에서처럼 반복하는 동안 실행해야 하는 코드만 변경해서 사용하시면 됩니다.  아래 링크에서는 반복하는 동안 멈추기 위한 메소드를 같이 제공하고 있습니다.


실제 코드는 아래의 링크를 참고하시기 바랍니다.








Posted by 류종택

검색 능력이 딸려서인지 구현된 소스는 못 찾았습니다.  하나 찾긴 했지만, 코드 스타일이 내가 원하는 상태가 아닌지라 ㅡ.ㅡ;;


간단하게 아래처럼 따로 구현해봤습니다.  구현이라고 할 것 까지는 ㅡ.ㅡa

소스 설명은 워낙에 간단해서 따로 드릴 필요를 으흠..  그냥 스택이라고 생각하시면 됩니다.


Interlocked 함수를 이용해서 구현 된 것이라, 멀티 스레드 상황에서 임계영역으로 자원을 Block하지 않고 사용하여 퍼포먼스에 이득이 있습니다.  그 이외에는 그냥 무시하시면 되시겠습니다 ^^;


type
  TSLIST_HEADER = record
    case integer of
      0 : (Alignment : int64);

      1 : (
        Next : pointer;
        Depth : word;
        Sequence : word;
      )
  end;
  PSLIST_HEADER = ^TSLIST_HEADER;

  TSLIST_ENTRY = record
    NextEntry : pointer;
    MyData : integer;
  end;
  PSLIST_ENTRY = ^TSLIST_ENTRY;

procedure InitializeSListHead(AHeader:pointer); stdcall; external kernel32;
function InterlockedFlushSList(AHeader:pointer):pointer; stdcall; external kernel32;
function InterlockedPopEntrySList(AHeader:pointer):pointer; stdcall; external kernel32;
function InterlockedPushEntrySList(AHeader,AEntry:pointer):pointer; stdcall; external kernel32;
function QueryDepthSList(AHeader:pointer):Word; stdcall; external kernel32;

procedure TfmMain.FormCreate(Sender: TObject);
var
  pHeader : PSLIST_HEADER;
  pEntry : PSLIST_ENTRY;
  Loop: Integer;
begin
  New(pHeader);

  InitializeSListHead(pHeader);

  for Loop := 1 to 10 do begin
    New(pEntry);
    pEntry^.MyData := Loop;
    InterlockedPushEntrySList(pHeader, pEntry);
  end;
  moMsg.Lines.Add(Format('After InterlockedPushEntrySList: QueryDepthSList=%d'#13#10, [QueryDepthSList(pHeader)]));

  for Loop := 1 to 10 do begin
    pEntry := InterlockedPopEntrySList(pHeader);
    moMsg.Lines.Add(Format('InterlockedPopEntrySList: %d', [pEntry^.MyData]));
    Dispose(pEntry);
  end;
  moMsg.Lines.Add(Format('After InterlockedPopEntrySList: QueryDepthSList=%d'#13#10, [QueryDepthSList(pHeader)]));

  Dispose(pHeader);
end;





Posted by 류종택


외국산 제품에 비해서 국내 환경에 잘 맞물려 돌아 갈 듯 하네요.  웹과 모바일까지 지원한다고 하니 참고하세요.  아래는 제품 사이트 링크 입니다.


http://www.realgrid.net/




Posted by 류종택


티스토리 툴바