마우스 이벤트 캡쳐 - SetCapture, ReleaseCapture

2016.09.28 17:10

마우스 이벤트를 캡쳐해야 하는 경우 SetCapture(Win32 API)를 이용하면 됩니다.

다 사용한 경우 ReleaseCapture로 해제합니다.



아래 예제는

1) 폼위에 패널 위치

2) 폼과 패널은 각각 MouseMove 이벤트에서 로그 기록

3) 패널에서 MouseDown 시 폼으로 SetCapture 시도 > 이후 패널 및 메모 위의 마우스 이벤트가 폼에서 발생

4) MouseUp 시(폼에서 마우스 이벤트를 가져가 폼의 MouseUp이벤트에서 구현필요) ReleaseCapture로 캡쳐 해제

procedure TForm2.FormCreate(Sender: TObject);
begin
  FIsCaptured := False;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add(Format('F> X: %d, Y: %d', [X, Y]))
end;

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FIsCaptured then
  begin
    Memo1.Lines.Add('Form> ReleaseCapture');
    ReleaseCapture;
  end;
end;

procedure TForm2.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SetCaptureControl(Self);
//  SetCapture(Self.Handle);
  Memo1.Lines.Add('Panel> Capture');

  FIsCaptured := True;
end;

procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add(Format('P> X: %d, Y: %d', [X, Y]))
end;

procedure TForm2.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Memo1.Lines.Add('Panel> ReleaseCapture');
end;



샘플 : 

SetCaptureReleaseCapture.zip


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 Delphi/C++Builder

모바일 디바이스 화면 방향전환 이벤트 수신하기

2016.09.22 10:23

모바일 디바이스의 방향을 가로 또는 세로, 그리고 역방향으로 돌리는 동작을 알아낼 수 있습니다.


파이어몽키 프레임워크에서 제공하는 기능으로 TMessageManager에 구독해 이벤트를 받을 수 있습니다.

(부가적으로 이런 개발 방식을 옵저버 패턴이라고 합니다.^^)



위 스크린샷은 

1) 시작(폼생성) 시 TMessageMenager에 TOrientationChageMessage에 대해 OrientationChaged 이벤트를 구독하고

2) 종료 시 : 구독을 해지합니다.

3) 현재 스크린 방향은 IFMXScreenService.GetScreenOrientation 메소드를 통해 알아 올 수 있습니다.


자세한 내용은 아래 샘플코드를 통해 확인하세요.

델파이 10.1 베를린 버전으로 작성되었습니다.

ScreenOrientation-Berlin.zip




해당 내용은 델파이 부트캠프 - 델파이 게임 개발 소스코드를 살펴보다 발견했습니다.

델파이 부트캠프: 게임 개발 - http://community.embarcadero.com/blogs?view=entry&id=8785

델파이 게임개발 소스코드(Github) : https://github.com/EmbarcaderoPublic/DelphiArcadeGames

저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

Object Pascal Style Guide

2016.09.21 13:30

여러명이 협업하는 프로젝트에서는 표준화가 매우 중요합니다.

코딩 스타일 표준화에 참고할 수 있는 Object Pascal 스타일 가이드문서입니다.


영문(원문): 

http://edn.embarcadero.com/article/10280


한글번역 문서:

http://documents.mx/documents/object-pascal-style-guide-kor.html



델마당의 김시준님글과 깨몽(이선우)님의 글을 참고했습니다.

http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&indx=451050&page=1

저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 RAD Studio 정보

TListView Dynamic Appearance로 추가한 항목을 코드로 제어하기

2016.09.20 15:16

(해당 기능은 RAD 스튜디오 10.1 베를린 이상에서 사용할 수 있습니다.)


TListView는 이미 정의된 ItemAppreance를 이용해 목록을 구성하기 때문에 TListBox에 비해 스크롤이 부드럽고 빠릅니다.


하지만, 베를린 버전에서 Dynamic appreance 기능이 추가되어 아래 그림과 같이 아이템 항목을 마음대로 정의할 수 있습니다.



Dynamic Appreance에 대한 자세한 내용은 아래 링크를 참고하세요.

오늘 소개할 내용은 위와 같이 사용자가 추가한 항목을 코드를 통해 제어하는 예제입니다.


아래 코드는 ListView1에서 Text2 아이템을 찾아 글자색을 녹색으로, 글자 스타일을 Bold, Italic으로 설정합니다.

procedure TForm2.Button3Click(Sender: TObject);
  function GetTextItem2: TCustomTextObjectAppearance;
  var
    Obj: TCommonObjectAppearance;
  begin
    Result := nil;
    for Obj in ListView1.ItemAppearanceObjects.ItemObjects.Objects do
    begin
      if not (Obj is TCustomTextObjectAppearance) then
        Continue;

      if Obj.Name = 'Text2' then
      begin
        Result := Obj as TCustomTextObjectAppearance;
        Break;
      end;
    end;
  end;
var
  Text2: TCustomTextObjectAppearance;
begin
  // Text2 항목 찾기
  Text2 := GetTextItem2;

  if not Assigned(Text2) then
    Exit;

  Text2.TextColor := TAlphaColorRec.Green;
  Text2.Font.Style := [TFontStyle.fsBold, TFontStyle.fsItalic];
//  Text2.re
end;


아래 코드는 ListView의 크기가 변경된 경우(TListView.OnResize) 내부 항목들의 위치와 너비를 일괄조정하는 샘플입니다.

procedure TForm2.ListView1Resize(Sender: TObject);
var
  L, R, W, Ratio: Single;
  Obj: TCommonObjectAppearance;
begin
  W := ListView1.Width - ListView1.ItemSpaces.Left - ListView1.ItemSpaces.Right;
  L := W;
  R := 0;

  for Obj in ListView1.ItemAppearanceObjects.ItemObjects.Objects do
  begin
    // 가장 왼쪽의 이미지 제외
    if Obj is TCustomImageObjectAppearance then
      Continue;

    // 가장 왼쪽 위치
    if Obj.PlaceOffset.X < L then
      L := Obj.PlaceOffset.X;
    // 가장 오른쪽 위치
    if (Obj.PlaceOffset.X + Obj.Width) > R then
      R := Obj.PlaceOffset.X + Obj.Width;
  end;

  Ratio := (W-L) / (R-L); // (변경된 너비 / 원래너비)
  for Obj in ListView1.ItemAppearanceObjects.ItemObjects.Objects do
  begin
//    if Obj.PlaceOffset.X < L then
    if Obj is TCustomImageObjectAppearance then
      Continue;

    Obj.PlaceOffset.X := ((Obj.PlaceOffset.X - L)  * Ratio) + L;
    Obj.Width := Obj.Width * Ratio;
  end;
end;


샘플 프로젝트

ListViewDynamicAppearance.zip


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키

  1. Blog Icon
    채종일

    안녕하세요. 해당 기능을 사용하려고 하는데

    라이브 바인딩이 아니라 직접 소스코드로 항목을 추가하려면 어떻게 해야할까요??