행복을 사는 법

2013. 2. 5. 07:00

2월 20일 한빛미디어에서 주관하는 RT:FM 발표자료 준비 중 좋은 내용이 있어 일부내용을 미리 공유합니다.(http://m.onoffmix.com/event/12062)



하버드 대학교 교내신문인 하버드 가젯에 아래와 같은 기사가 2008년도에 실렸었습니다.


"Money spent on others can buy happiness"

(다른사람을 위해 돈을 쓸때 더 행복하다.)


(http://news.harvard.edu/gazette/story/2008/04/money-spent-on-others-can-buy-happiness/)


기사에서는 3번의 실험을 했습니다.


첫번째, 

632명의 미국인을 대상으로 연간수입과 자신을 위한 소비, 타인을 위한 소비(선물, 기부 등)을 조사한 결과 소득에 상관없이 타인을 위한 소비 비율이 높은 사람일 수록 행복 지수가 높았다.


두번째,

16명의 직원을 대상으로 미리 5000$의 보너스를 주고 행복도를 측정했다. 그리곤 다시 3000$, 8000$의 다른 보너스를 직원에게 주고 소비행태에 따른 행복지수를 조사 하였고, 그 결과 타인을 위한 소비 비유이 높은 직원들의 행복지수가 더 높았다.


마지막, 

대학 캠퍼스에서 학생들에게 무작위로 5$, 20$의 지폐가 든 봉투를 나누어 주고 절반의 그룹은 자신을 위해, 나머지는 타인을 위해 선물 구입 또는 기부를 하도록 지시한 후 결과를 조사한 결과 그 날 자신의 돈을 타인을 위해 지출한 사람들은 저녁시간을 행복하게 보낼 수 있었다고 한다. 그리고 그 행복은 금액과는 상관이 없었다고 한다.


위의 조사내용과 비슷한 결과의 강연이 TED에도 있습니다.

(http://www.ted.com/talks/michael_norton_how_to_buy_happiness.html)


위 실험도 다양한 방법으로 소비를 측정하고 자신과 타인을 위한 소비경우 느끼는 행복감을 조사했습니다.


또한, 삶이 여유로운 경우에 국한되지 않고 전세계 다양한 국가에서 동일한 실험을 하고 그 결과를 그래프로 잘 표현했습니다.


대부분이 녹색(타인을 위한 소비에 행복감을 느낌)으로 표시가 되네요. 

즉, 소득과 상관없이 타인을 위한 소비가 자신에게 행복을 준다는 결과를 알 수 있습니다.


만약, 자신이 행복하지 않다고 생각되시거나, 

나는 더 행복하고 싶어라고 생각되시는 분들은

주변을 둘러보고 자신이 좋아하는, 사랑하는 분을 위한 가벼운 선물하고

덤으로 본인은 행복이라는 선물을 받으시는게 어떨까 제안합니다.


기회가 되시어 더 필요한 사람에게 기부를 하면 더큰 행복을 받으실 수 있을 것 같습니다.


감사합니다.

행복하세요.


험프리 험프리.김현수 생각 RTFM, 기부, 선물, 하버드, 행복, 행복구입, 행복사기

5주차 - 굿 컴파니

2013. 2. 4. 09:36



최근 리더의 조건 다큐멘터리로 이슈가 되기도 했던 착한회사

제니퍼소프트, SAS 등의 회사는 왜 착한데도 성공했을까?


그 궁금증의 해답을 조금더 이해하기 위해 1월 16일 강연회에 가서 받은 책.


공동번역가이신

정지훈, 송인혁, 최형욱님의 주옥같은 강연을 듣고 더욱 보고싶었던 책입니다.


Web2.0(쌍방향 커뮤니케이션) 시대에 왜 회사는 착해야 하는지

그리고 우리(소비자)의 자세는 어때야 하는지를 알려줍니다.


요약하면

우리는 우리가 구매하는 제품, 이용하는 서비스 회사의 행동을 감시하고, 착한회사가 되길 요구할 줄 아는 소비자가 되어야 한다.

"감시해야 할 회사의 행동"은 회사가 직원을 잘 돌보아 우리에게 정당한 서비스가 돌아오는지, 환경적으로 올바른 제품을 만들고 환경에 관심을 갖고 올바른 행동을 하는지, 지역사회를 위해 어떠한 일을 하는지 등.


착하게 자란 회사는 소비자가 지키고, 직원이 지키고, 고객이 믿고 사용하므로 당연하게 성장할 수 있다.

반대로 착하지 않은 회사는 점점 소비자가 멀어지고, 직원은 회사를 믿지 못하므로 차츰 고객이 외면하게 된다.


제게 많은 생각과 고민을 안겨주고 어느정도의 답까지 준 책.

직원으로서의 착한회사, 오너로서의 착한회사를 그리며 어찌 행동해야 할지 큰 길을 알려주네요.


강연에서 액기스만 뽑아 설명해준 것과는 다르게 살짝 반복되는 내용과 지표가 지루하기는 했지만

충분히 필독서의 조건이 된다 생각합니다.


모두들 이 책을 읽고 실천하면 참 행복한 세상이 올것 같네요^^

험프리 험프리.김현수 생각/독서기록 굿컴퍼니, 송인혁, 정지훈, 착한 회사가 세상을 바꾼다., 최형욱

[작업일지] 문자입력은 보류 중.

2013. 1. 29. 02:23

2월 20일 발표가 잡혔다. 그래서 발표준비를 해야한다. ㅠㅜ

(살짝쿵 홍보 RT:FM 프로그래머로 사는 법

 http://onoffmix.com/event/12062)


난 천상 개발자인가보다 발표보다 개발이 더 좋으니...


문자입력을 어떻게 처리할까 고민하고 참고소스도 들여다 보는데...

음... 예상대로 많이 어렵다.


에디터를 만든다는 것 만만치 않다.


우선 클릭하고 입력하고 선택, 이동만 되게 하고

다음 더블클릭해서 수정되게 하고

다음 여러줄 입력 할 수 있게 하고

나중에 글자별 스타일 적용 시키고~


후후 쉽게 가야지~ 

IME처리가 문제예요~ 영어만하면 입력받아서 문자 그려주면 될 것 같구먼...


아무튼 문자입력은 잠정 보류 입니다.


PS - 미래를 준비하기 위해 딴일도 해야하는뎅 ㅠㅜ 동시에 몇개씩 일을 하니 내가 집중을 못하징(행복한 볼멘소리)





글만쓰면 서운하니까 팁하나!!


GUI와 Unittest입니다.

자세한 내용은 없고 아래 동영상 한번 보시고...

힌트는 "이벤트를 발생"

FIremonkey와 DUnit으로 작업된 Thoth Canvas 테스트입니다.


혹시 자세한 정보(방법, 샘플)를 원하시면 댓글 주세요^^



험프리 험프리.김현수 Team Thoth DUnit, Firemonkey, TDD, Thoth Canvas, unittest

4주차 - 나는 빠리의 택시 운전사

2013. 1. 28. 12:51



이 책도 회사의 동료가 선물해 주신 책


이책을 읽으면 파리의 풍경이 머리속에 그려진다.

아무래도 파리의 거리를 제일 잘 아는 택시운전사가 직접 쓴 책이니 그런듯 하다


또한 우리나라의 7~80년대의 시대상도 머릿속에 그려진다.

암울하고 말못할 시대의 피해자이자 망명자인 저자의 이야기가 가슴을 애리게 했다.


관심있는 나라 프랑스 그리고 관심있는 도시 파리

많은 정보와 생각 할 수 있는 기회를 준 책이다.


가벼운 문장으로 가볍지 않은 주제를 재미있게 엮은 책.

험프리 험프리.김현수 생각/독서기록

[작업일지] 그루핑 완료(alpha 0.4)

2013. 1. 24. 02:17

그루핑에 대한 작업이 일단락 됐다.

겹치면 그룹화 되는 좀 일반적(파워포인트 등에서는 그룹 메뉴가 있다.)이지 않은 방식이지만 편한 것 같아서 시도해 봤다.

초반에 방향을 잘못잡아 반정도 작업한 것을 완전히 갈아 엎었지만

오히려 갈아 엎으며 코드도 짧고 깨끗해 지고 

내가 모든 것을 구현하지 않고 프레임워크(파이어몽키)의 메소드들을 이용했다.

(DoAddObject, DoRemoveObject)


그리고 Unittest의 도움을 대단히 많이 봤다.(해보니 좋다 TDD)

아직은 어설프지만 리펙토링 및 대규모 코드 갈아 엎기 할때 놓치지 않아서 마음이 편하다.


어쨌든 그루핑을 끝내서 0.4 버전이 완료가 됐고

마음같아서는 다음버전 기능인 문자입력을 들어가고 싶지만 더 큰것을 준비해야 하기에 잠시 멈춰야 겠다.

다음달 20일 발표 준비를 해야겠다.


제목은 "나무를 심는 프로그래머".





글만쓰면 아쉬우니 팁을 가끔 하나씩 넣어야 겠다.


팁이라고 할것 까진 없고 인터페이스를 사용하는 이유중 하나인 implement이다.


구현하다보면 전혀 다른 객체(클래스)인데 동일한 구현이 필요한 경우 사용된다.


예를들면 

드로윙 툴(토트캔버스)에서 

아이템을 캔버스(컨텐츠)에 올릴 수도 있고 아이템위에 아이템을 올릴 수도 있다.


그리고 캔버스에서 아이템으로 부모아이템 간 옮길 수 도 있다.

즉 부모가 어떤 놈인지 구분하기 대단히 어렵다.


위 상황에서 부모(Object.Parent)의 클래스 타입에 따라 분개하는 방법도 있지만

인터페이스를 사용하면 짧고 편리하게 구현이 가능하다.


아래와 같은 구조가 있다고 치자.

아이템과 컨텐츠가 IThItemContainer라는 인터페이스를 상속 받는다.


  IThItemContainer = interface
  ['{76A11805-EA40-40B6-84A1-71B4DF277DCD}']
    procedure ContainChildren(AContainer: TThItem);
  end;

  TThItem = class(TControl, IThItem, IThItemContainer)
  public
    procedure ContainChildren(AContainer: TThItem);
  end;

  TThContents = class(TControl, IThItemContainer)
  private
    procedure ContainChildren(AContainer: TThItem);
  end;

아래와 같이 부모를 찾았는데 FindParent

부모의 타입(Parent는 TFmxObject이다) 과는 상관없이 ContainChildren 메소드를 호출한다.(15번째 줄)

팁은 Supports라는 함수이다. COM을 사용할 때 많이 사용되는 좋은 함수이다.


procedure TThCanvasEditor.MouseUp(Button: TMouseButton; Shift: TShiftState; X,  Y: Single);
var
  ItemContainer: IThItemContainer;
begin
  inherited;

  if IsDrawingItem and Assigned(FDrawItem) then
  begin
    FDrawItem.Selected := True;

    // Set Parent
    FDrawItem.Parent := FContents.FindParent(FDrawItem); // 부모 찾기

    // Contain Children
    if Supports(FDrawItem.Parent, IThItemContainer, ItemContainer) then
      ItemContainer.ContainChildren(FDrawItem);

    if Assigned(FOnItemAdded) then
      FOnItemAdded(FDrawItem);
  end;
end;

인터페이스 사용하면 어렵지만 유용한 놈입니다^^


끝~

험프리 험프리.김현수 Team Thoth implement, Interface, Supports, 델파이, 인터페이스

3주차 - 인스파이어드

2013. 1. 23. 02:10



회사 동료가 선물해 준 책


감동을 전하는 제품을 만들기 위해서는 제품관리자의 역할이 크다고 한다.

난 솔직히 제품관리자라는 역할을 처음 접했는데 책에서 하고자 하는 말이 맞는 말이긴 하다.

(인터렉션 디자인이란 용어도 처음 접함)


하지만 대상을 너무 관리자 위주의 내용이어서 개발자인 나에게는 괴리감이 들었다.

그래서 중간, 중간은 스킵하며 봤다.


하지만 내 뇌리에 꽃히는 항목도 꽤 있었다.

UX에 대한 강조와 사용성 테스트(프로토타입 구성) 등은 나에게 좋은 아이디어를 제공해 줬다.


전체적으로 떠있지만 중간중간 필요한 내용을 캡쳐(취득)한 책



험프리 험프리.김현수 생각/독서기록 인스파이어드, 인터렉션 디자인, 제품관리자

2주차 - 부모와 아이사이

2013. 1. 23. 02:01



예전에 사두고 읽지 않았던 책을 다시 꺼내 읽었다.


부모라면 꼭 읽어보라고 권장하고 싶은 책


아이가 왜 그런 행동을 보이는지 알려주고

여러가지 상황에서 부모의 좋은 대처 / 나쁜 대처를 예시로 알려준다.


육아서가 그렇듯 과연 내가 실천할 수 있을까? 하는 의문도 솔직히 들긴 했다.


그래도 읽으며 많은 것을 느꼈다.

험프리 험프리.김현수 생각/독서기록 부모와 아이사이

1주차 - 나쁜 사마리아인

2013. 1. 23. 01:53

2013년 한주에 한권읽기 프로젝트 시작




첨부터 어려운 책을 골랐다.

경제 관련 서적이라 다소 지루했지만 읽다 보면 이해가 되겠지하고 끝까지 읽었다.


이미 발전한 선진국의 사다리 걷어차기(지내들 보호무역으로 발전하고 도상국들은 자유무역이 발전하는 길이다 라는 억지)가 제일 기억에 남는다.

신시장경제주의와 외국인투자의 숨은의도도 대충 이해할 수 있었다.


좀 어렵지만 읽으면 좋을 책

험프리 험프리.김현수 생각/독서기록 나쁜 사마리아인들, 장하준

[작업일지] 그루핑 처리

2013. 1. 23. 01:48

토트캔버스 작업하며 느끼고 배우는 것들을 기록해야 겠다는 생각에 작업일지를 쓴다.

나중에 어떤 생각을 하며 작업했는지 되돌아 보면 재미있을 것 같다.


오늘은 아이템 그루핑 작업을 했다.

그루핑 작업에 대한 테스트케이스만 45개나 된다.

하지만 Zoom과 Rotate기능이 들어가면 또 생기겠지...하하


이제 3가지 항목만 처리하면된다.

TopLeft로 크기 조정 시 예외

중간크기 아이템을 큰아이템 위의 작은아이템이 덮을때 중간아이템에 작은 아이템을 추가하는게 맞을까? 하는 사용성

원의 경우 원의 영역에 아이템이 포함되는지 체크


얼른 그룹핑 끝나고 5단계로 넘어가고 싶다~

험프리 험프리.김현수 Team Thoth

2013년을 맞이하며...

2013. 1. 1. 06:58

산행을 하려 아침일찍 일어나보니 눈이 오네요. 

새해 시작을 예쁜눈과 함께 하니 아름다운 2013년이 될 것 같습니다.

오후에 정리하고자 했던 다짐을 앞당겨 정리합니다.


"세상아 내가 왔다. 나좀 봐줘."


작년을 맞이하며 세상에 외쳤던 말이었습니다.

이제는 세상에 나를 알리고 내가 좋아하는, 내가 하고 싶은 일을 시작하고자 마음을 먹었지요.


작년은 절반의 성공이었습니다.

  • 소셜 및 블로그 활동을 시작했고, 
  • 하고싶은 일을 찾아 시작하였고,
  • 함께할 수 있는 사람을 찾아 팀도 셋업되었으니 말입니다.
  • 그리고, 조금이나마 자신을 다스릴 수 있었습니다.

작년의 소회는 마치고


올해의 외침은

"가자!! 새로운 세상으로, 새로운 들판으로..."

작년 한해동안 

"혼자의 힘으로는 많은 것을 할 수 없다"는 것을 경험하고 깨달았습니다.

어쨌든 함깨할 주변사람들이 준비가 되었고


올 한해는 

새로운 사람들을 만나 생각과 가치를 공유하고 같은 방향으로 함께가는 법을 배우고

새로운 장소에서 그동안의 낡은 습관과 나태함을 버리고 새롭게 시작하겠습니다.


그리고 깨달은 한가지

새로운 도전은

  • 하기 싫은 것을 하지 않는 것이 아닙니다. 하고 싶은 것을 하는 것입니다.
  • 대신 불필요한 것(욕심, 고민...)을 내려 놓고 그 시간에 하고 싶은 것을 해야 합니다.
    (자신이 하지 말아야 할 것이 무엇인지 곰곰히 생각해 보시고 하나하나 고치면 한결 여유로운 삶이지 않을 까 싶네요.)

모두 새해에는 새로운 도전 모두 성공하시어, 1년 후 뿌듯한 마음으로 한해 마무리 할 수 있었으면 좋겠습니다.


2012년 저와 함께해준, 응원해준 모든 사람들과 세상을 의미있게, 행복하게 살고자 하는 모든 분들을 응원합니다.


2013년 시작과 함께, Humphery.

험프리 험프리.김현수 생각

[FM2] XE3.FM2에서 Control을 Bitmap으로 내보내기 및 Bitmap.Pixels 사용하기

2012. 10. 4. 20:49

Firemonkey2로 버전업 된 후로 참 많은 것이 변했습니다.


TControl은 말할 것도 없고 TBitmap도 많은 내용이 변했네요.


Unit test에서 특정 Pixel의 색상을 얻어오고자 할때 기존 Bitmap.Pixels이 없어진 것을 확인 후 깜짝 놀랐습니다.


자... 그럼 제가 삽질로 얻어온 내용을 공유하도록 합니다.


| Control을 Bitmap(TImage)으로 내보내기

var
  Bitmap: TBitmap;
  Map: TBitmapData;
begin
  Bitmap :=  TBitmap.Create(Round(Panel1.Width), Round(Panel1.Height));
  try
    Bitmap.Canvas.BeginScene;

    // Bitmap으로 내보내기
    Bitmap.Assign(Panel1.MakeScreenshot);
 
    // Pixel의 값을 원하실 때는 이렇게
    Bitmap.Map(TMapAccess.maRead, Map);
    //AlphaColor := Map.GetPixel(Round(X), Round(Y));
    Bitmap.Unmap(Map);
    Bitmap.Canvas.EndScene;

    Image1.Bitmap.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;


Panel1의 화면을 Bitmap으로 내보내는 코드 입니다.

특정 좌표의 값은 Map.GetPixel로 얻어오실 수 있구요 반환은 TAlphaColor 입니다.


TBitmapData라는 구조체를 이용하는군요 구글링에도 없는 따끈한 정보입니다. 실은 많이 안찾아 봣습니다. -_-;

험프리 험프리.김현수 파이어몽키 Bitmap.Pixels, Delphi, Fm2, FMX, TBitmapData, XE3, 태그를 입력해 주세요.

Github for Windows 소개

2012. 9. 4. 20:38

Github for Windows

우연히 Github 홈페이지를 서성이다. 새로운 물건이 보이네요.

그 물건은 바로 "Github for Windows"입니다.

Mac 환경에서 Github for mac을 보며 "맥에서는 참 편하구나..." 하고 생각했던 물건이 윈도우에도 나왔네요.

워낙 UX가 편하게 되어 있어 따로 설명하지 않고 화면만 추가합니다.

다운로드 및 설치

아래의 Github 홈페이지에서 다운로드 받을 수 있습니다.

github:windows - http://windows.github.com/

환경설정 - local repository 설정 등


저장소 가져오기 - clone. Github repository -> Local repository

수정 후 commit - 수정된 항목이 있을 경우 우측 노란 박스에 작업내용 추가 후 [COMMIT] 가능

서버(github) 반영 - 상단의 Sync 버튼 클릭하여 우측의 "unsynced commits"를 서버에 반영

편하네요^^ 끝~

험프리 험프리.김현수 Team Thoth/오픈소스 github, Github for windows

  1. Blog Icon
    하하하하

    안녕하세요. 글 정말 잘보고 갑니다.ㅎ
    저도 이번에 github를 써보려고 공부중인데 궁금한점이 있어서요.
    그럼 이 github for windows는 기존의 tortoiseGit과 github의 역할을 하는건가요?
    아니면 다른 추가적인 역할이 있나요?

  2. 네... 간단하게 tortoiseGir과 git의 역할을 합니다.
    다만 약간의 기능이 적다고 보는게 맞을 것 같네요.

    저도 tortoiseGit을 주로 사용해서 Gitub for Windows와 자세한 기능 차이를 설명드리기는 어렵네요^^
    그래도 간단히 써봤을때는 유용하더라구요.

[FMX] Firemonkey 구조 - 어떻게 하나의 코드로 여러 플랫폼에서 실행 될까?

2012. 6. 23. 03:04

이번에는 이리저리 파이어몽키 소스 보며 익혔던 간단한 구조에 대해 설명하려 합니다.

(딱, 제가 아는 만큼만 소개합니다.^^)


파이어몽키는 멀티 플랫폼을 지원하는 델파이 프레임웤 입니다.

어떻게 파이어몽키는 하나의 소스로 여러개의 플랫폼을 지원할까요?

여러개의 플랫폼을 지원하는 열쇠는 FMX.Platform.pas의 Platform: TPlatform에 있습니다.
(C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\source\fmx에 소스파일이 있습니다.)


FMX.Platform의 TPlatform 클래스를 보시면 대부분(거의 다)이 추상메소드(virtual; abstract;) 입니다. 구현이 안되어 있다는 것이죠.

그리고 메소드명이 상당히 플랫폼에 종속적인 냄새를 풍깁니다.

CreateWindow(창을 생성하는 건 OS에서 해주겠죠.)
CreateTimer(타이머도 OS에서 이벤트를 발생해 줍니다.)
WaitMessage(메시지 처리도 OS와 연관이 있지요.) 등등 모두 플랫폼에 종족적인 메소드들입니다.

그리고 소스 디렉토리에 보시면 FMX.Platform.Win과 FMX.Platform.Mac 두개의 플랫폼 관련 유닛파일을 보실 수 있습니다.

즉, FMX.Platform의 TPlatform을 상속받은 클래스들이 구현되어 있겠죠.

맞습니다. 각 파일을 보시면 TPlatformWin과 TPlatformCocoa 두개의 클래스가 TPlatform을 상속받습니다.

물론 추상메소드들도 모두 구현되어 있습니다.

TPlatformWin은 Windows API를 이용하여 구현이 되어 있고, TPlatformCocoa는 OS X API로 구현이 되어 있습니다.


그럼 어떻게 Firemonkey는 플랫폼에 맞는 TPlatform 객체를 사용할까요?

위의 질문에 답하기 위해 먼저 프로젝트 소스파일을 들여다 보겠습니다.

Delphi XE2에서 <Firemonkey HD Application> 프로젝트를 생성하시면 아래와 같은 소스코드를 기본적으로 생성합니다.

program Project1;

uses
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

위의 프로젝트 소스를 보면 도무지 참조하는 유닛이 FMX.Forms 밖에 없습니다.


그럼 FMX.Forms 유닛을 살펴보겠습니다.

주욱 보시면 VCL에서도 익숙한 TApplication, 앞으로 친하게 지내야될 TCommonCustomForm 등등의 클래스 등이 보입니다.

그리고 제일 아래에 보면 우리가 찾던 Platform 관련된 코드가 보입니다.

initialization
  RegisterFmxClasses([TApplication], [TApplication]);
  Screen := TScreen.Create(nil);
  Platform := PlatformClass.Create(nil);
  System.Classes.RegisterFindGlobalComponentProc(FindGlobalComponent);

finalization
  System.Classes.UnregisterFindGlobalComponentProc(FindGlobalComponent);
  FreeAndNil(Screen);
  // Platform global is freed in FMX.Types

위 코드의 4번째 줄을 보시면

Platform := PlatformClass.Create(nil);

이라고 PlatformClass를 이용해 TPlatform 객체를 생성해 할당합니다.


자 그럼 다시 PaltformClass를 따라가 봅니다.

FMX.Platform.pas에 PlatformClass 함수가 구현되어 있습니다.

function PlatformClass: TPlatformClass;
begin
  Result := ActualPlatformClass;
end;

그럼 ActualPlatformClass는 어디에 구현되어 있을까요?


예상하시는 분들도 있겠지만 위에서 설명한 Platform별 유닛(FMX.Platform.Win, FMX.Platform.Mac)에 구현되어 있습니다.

MSWINDOWS의 경우 TPlatformWin을 반환하고

MACOS의 경우 TPlatformCocoa를 반환합니다.

근데 의문이 듭니다. 어떻게 델파이는 2개중에 하나를 선택할까요?

그건 바로 Conditional define($IFDEF)을 이용합니다.

FMX.Platform의 구현부(implementation) 시작을 보시면 아래와 같은 코드를 보실 수 있습니다.

{$IFDEF IOS}
uses
  FMX.Platform.iOS, FMX.Canvas.iOS, FMX.Context.GLES;
{$ENDIF}

{$IFDEF MACOS}
uses
  FMX.Platform.Mac, FMX.Canvas.Mac, FMX.Context.Mac;
{$ENDIF}

{$IFDEF MSWINDOWS}
uses
  FMX.Platform.Win, FMX.Context.DX9;
{$ENDIF}

보시면 아시겠지만 IOS, MACOS, MSWINDOWS 별로 다른 유닛을 참조하도록 되어있습니다.

위의 3가지는 모두 Firemonkey가 지원하는 플랫폼입니다.

즉 Project Manager의 Target platform에서 Platform을 선택하면 그에 맞는 값(IOS, MACOS, MSWINDOWS)이 내부적으로 정의됩니다.

그래서 결국은 Target platform에 맞는 TPlatform 객체를 이용하여 OS에 맞는 API를 사용하여 실행됩니다.


좀더 설명을 하자면 위의 프로젝트 소스를 보시면 아래와 같이 Application을 실행(RUN)하는 코드를 볼 수 있습니다.

Application.Run;

Run 메소드를 살펴보면 아래와 같이 Platform에 따른 코드를 사용하여 Application을 실행합니다.

procedure TApplication.Run;
begin
  FRunning := True;
  AddExitProc(DoneApplication);
  try
    Platform.Run; // Platform의 Run 실행
  finally
    FRunning := False;
  end;
end;

// MSWINDOWS에 맞게 Application 실행
procedure TPlatformWin.Run;
begin
  { checking for canvas }
  if GlobalUseDirect2D then
    SetD2DDefault;

  Application.RealCreateForms;
  repeat
    try
      Application.HandleMessage;
    except
      Application.HandleException(Self);
    end;
  until Application.Terminated;
end;

// MACOS 맞게 Application 실행
procedure TPlatformCocoa.Run;
begin
  Application.RealCreateForms;
  CreateApplicationMenu;
  FRunLoopObserver := CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopBeforeWaiting, True, 0, RunLoopObserverCallback, nil);
  CFRunLoopAddObserver(CFRunLoopGetCurrent, FRunLoopObserver, kCFRunLoopCommonModes);
  NSApp.Run;
end;

다른 메서드 또는 다른 유닛(FMX.Types 등)에서 Platform 전역변수를 이용하도록 구현되어 있습니다.


다시한번 정리하면, 

1, Project 소스에서 FMX.Forms 참조(uses)

2, FMS.Forms의 Initialization에서 FMS.Platform.pas 유닛의 PlatformClass를 통해 Platform 생성

3, FMS.Platform는 각 플랫폼 유닛의 ActualPlatformClass 함수 호출하여 Platform에 맞는 TPlatform 객체 형 방ㄴ환

4, 단, Platform에 맞는 유닛을 $IFDEF를 이용하여 결정($IFDEF는 Target platform 선택 시 정의)


이상으로 Firemonkey에서 Platform에 맞게 실행되는 구조를 두서없이 설명했습니다.

감사합니다. 끝~


PS - 다음에는 Firemonkey를 실질적으로 사용하기 위한 팁들을 몇개 소개하겠습니다.^^

험프리 험프리.김현수 파이어몽키 Firemonkey, FMX, FMX 구조, multi platform

[FMX,VCL 비교] #1 VCL의 Canvas와 FMX의 Canvas 차이

2012. 6. 20. 12:52

파이어몽키로 작업하다보면 VCL과의 차이점으로 어려움을 겪는 경우가 많습니다.

그동안 작업하며 습득한 차이점을 한가지한가지 풀어놓으려 합니다.

그중 첫번째 Canvas 입니다.

일반적으로 TImage에 Drawing을 하는 예제로 구성하였습니다.
VCL과 FMX의 동일한 기능을 구현했으니 비교해 보시면 좋을 것 같습니다.

FMX 코딩시 주의점

1, TImage.Picture.Bitmap => TImage.Bitmap : VCL의 Picture 객체가 빠졌습니다.

2, Bitmap.Canvas.BeginScene ~ EndScene, Bitmap.BitmapChange : Canvas에 그리기고 화면에 표시하기 위한 절차입니다.

3, Brush => Fill, Pen => Stroke 등으로 속성들이 약간씩 변했습니다.

4, MoveTo, LineTo => DrawLine

5, FMX의 기본적인 좌표가 Single 형이기 때문에 Bitmap의 Pixel 단위인 Integer로 형변환(Round, Trunc)이 필요합니다.


 이하 소스코드 입니다. 빈프로젝트에 아래 소스 복사하면 컴파일 됩니다.(Unit명만 주의) 폼에 컨트롤이 없습니다.

| VCL Canvas Freeline Draw

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FDownPos: TPoint;
    FImage: TImage;

    procedure MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImage := TImage.Create(Self);
  FImage.Parent := Self;
  FImage.Align := alClient;
  FImage.OnMouseDown := MouseDown;
  FImage.OnMouseMove := MouseMove;
  FImage.Picture.Bitmap.SetSize(FImage.Width, FImage.Height);
  FIMage.Picture.Bitmap.Canvas.Brush.Color := clBlack;
  FImage.Picture.Bitmap.Canvas.FillRect(FImage.ClientRect);
  FImage.Visible := True;
end;

procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
    FDownPos := Point(X, Y);
end;

procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
  begin
    with FImage.Picture.Bitmap.Canvas do
    begin
      Pen.Color := clRed;
      Pen.Width := 3;
      MoveTo(FDownPos.X, FDownPos.Y);
      LineTo(X, Y);
    end;

    FDownPos := Point(X, Y);
  end;
end;

end.


| FMX Canvas Freeline Draw

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FDownPos: TPointF;
    FImage: TImage;

    procedure MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormCreate(Sender: TObject);
begin
  FImage := TImage.Create(Self);
  FImage.Parent := Self;
  FImage.Align := TAlignLayout.alClient;
  FImage.OnMouseDown := MouseDown;
  FImage.OnMouseMove := MouseMove;
  FImage.Bitmap.Create(Round(FImage.Width), Round(FImage.Height));
  FImage.Bitmap.Canvas.BeginScene;
  FImage.Bitmap.Canvas.Fill.Color := claBlack;
  FImage.Bitmap.Canvas.FillRect(FImage.ClipRect, 0, 0, AllCorners, 1);
  FImage.Bitmap.Canvas.EndScene;
  FImage.Visible := True;

end;

procedure TForm2.MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  if ssLeft in Shift then
    FDownPos := PointF(X, Y);
end;

procedure TForm2.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
  if ssLeft in Shift then
  begin
    with FImage.Bitmap.Canvas do
    begin
      BeginScene;
      Stroke.Color := claRed;
      StrokeThickness := 3;
      DrawLine(FDownPos, PointF(X, Y), 1);
      EndScene;
    end;
    FImage.Bitmap.BitmapChanged;

    FDownPos := PointF(X, Y);
  end;
end;

end.



험프리 험프리.김현수 파이어몽키 Canvas, Firemonkey, FMX, FMX VCL 차이, 파이어몽키

MSSQL Management Studio Express 설치(설치 시 29506 오류 해결)

2012. 3. 30. 01:04

MSSQL Server Managerment Studio Express 다운로드 경로


윈도우 7 환경에서 SQL Server Management Studio Express(SQLServer2005_SSMSEE.msi)를 설치하는 동안이 문서에서는 코드 29506와 함께 발생한 오류 메시지에 대한 해결방법입니다.
관리자 권한으로 실행하면 간단하게 해결이 되며, 혹시 관련 디렉토리에 권한이 부족한 경우가 있을 수 있으니,
 이곳(http://support.microsoft.com/kb/916766)도 참고하십시요.

아래와 같이 관리자 DOS 모드에서 실행시키면 됩니다.





출처 : http://blog.naver.com/luckyunmin?Redirect=Log&logNo=110132519363

험프리 험프리.김현수 기타정보 29506 오류, Management Studio Express 다운로드, MSSQL

  1. Blog Icon
    ㄴㅇㄴㅇㄹ

    지정된경로가없다고 나와요..

  2. 아마 똑같이 하신것 같은데요.
    Management Studio 다운로드 받은 경로를 입력하시면 잘 될것 같아요^^

  3. Blog Icon
    쵸리

    정말 감사합니다. 잘 되네요^^b

  4. Blog Icon
    나그네

    감사합니다. 덕분에 해결했네요..^^

TortoiseGit을 이용해 Github에 저장소 생성 및 데이터 올리기

2012. 3. 25. 03:24

이번 포스트에서는 실질적으로 Github의 원격저장소에서 소스를 가져오고 수정하여 올리는 내용을 설명합니다.

 아래의 절차대로 진행하겠습니다.
1, Github에 저장소 만들기
2, 로컬 저장소 만들기
3, 로컬저장소에 저장
4, 원격저장소에 저장(Github에 반영)
 

Github에 저장소 만들기

우선 원격저장소를 생성하기 위해 Github(https://github.com)에 접속 후 로그인합니다.

저장소 생성
메인화면 우측의 "Your repositories" 옆의 [New repository] 버튼을 클릭합니다.


아래와 같은 화면이 나오면 Project Name에 생성할 프로젝트 명(현재는 테스트를 위해 TEST입력)을 넣고 [Create reposityry] 버튼을 눌러 저장소를 생성합니다.


아래와 같은 내용이 표시됩니다.

이후의 절차를 설명한 내용인데 우선은 무시하셔도 됩니다. 우리는 GUI를 이용할 것이기 때문입니다.

로컬 저장소 만들기

Global setup
탐색기를 열고 저장소로 사용할 적절한 위치(저는 C:\hjfactory)로 이동합니다.
이후 탐색기 빈공간에 우측마우스를 클릭하여 TortoiseGit > Settings 메뉴를 호출합니다.


좌측 메뉴 중 Git 항목을 선택한 후 아래와 같이 본인의 이름과 이메일 주소를 입력합니다. 그리고 [확인] 버튼을 클릭하여 저장
(※ 이름의 경우 History 및 Log에 사용되므로 여러대의 환경에서 사용할 경우 구분되도록 합니다.)


로컬 저장소 생성
위의 탐색기에서 저장소로 사용할 폴더(저는 C:\hjfactory\TEST)를 생성합니다. 그리고 그 폴더를 우측 마우스를 눌러 Git Create repository here... 메뉴를 호출합니다.


위의 메뉴를 누르면 아래와 같은 화면이 나오고 그대로 [OK] 버튼을 클릭합니다.
(체크박스는 해당 저장소에서 작업을 안할경우 체크합니다.)


아래와 같은 메시지가 표시되면 성공입니다.(다른 메시지는 본적이 없네요^^)


로컬저장소에 저장

저장 데이터 준비
위에서 생성한 폴더(C:\hjfactory\TEST)에 들어가 Readme.txt파일을 생성합니다.
(변경된 내용이 있어여 저장소에 저장할 수 있기 때문입니다.)


데이터 저장
다시 이전 경로(C:\hjFactory)로 이동 후에 우측마우스를 눌러 Git Commit -> "master".. 메뉴를 선택합니다.


아래와 같은 Commit 창이 보이면 수정된 내용과 적용할 파일(체크박스)를 선택 하고 [OK] 버튼을 클릭하여 저장소에 저장합니다.


아래와 같은 메시지가 나오면 수정한 내용이 로컬 저장소에 저장된것 입니다.
(이후 Push 버튼을 눌러 원격저장소에도 저장 할 수 있습니다.)


원격 저장소에 저장(Github에 반영)

원격지 정보 등록

위의 화면에서 [Push] 버튼을 클릭합니다. 그러면 아래와 같은 창이 나오고 원격지정보를 등록하기 위해 [Manage] 버튼을 클릭합니다.


위의 버튼을 누르면 아래와 같은 창이 뜨고 원격지 이름(Remote)와 원격지 주소(URL)만 입력하고 [Add New/Save] 버튼을 클릭하여 원격지 정보를 저장합니다. 이후 [확인] 클릭

(※ 원격지 주소는 Github에서 저장소 만든 후 표시된 화면을 참고합니다.)


원격 저장소에 저장
위에서 원격지 정보를 등록하면 아래와 같이 Destination 목록에 위의 원격지 이름이 등록됩니다. 위에서 선택한 항목 선택 후 [OK] 클릭


드디어 마지막 단계 아래와 같이 성공 메시지를 보실 수 있습니다.
(마지막 단계여서 메시지를 확대했습니다^^)


Github 등록 확인
다시 Github 사이트로 이동하여 페이지를 새로고침 하면 아래와 같이 Readme.txt가 등록된 것을 확인 할 수 있습니다.


이것으로 저장소 생성 및 등록하는 내용을 마쳤네요.
다음에는 원격 저장소의 소스를 받아서 수정 후 올리는 부분을 설명하겠습니다.


험프리 험프리.김현수 Team Thoth/오픈소스 git, Git for windows, Git 소개, github, github commit, Github 소개, TortoriseGit, 깃허브, 오픈소스, 윈도우즈 Git

  1. 감사합니다. 잘 보고 갑니다.

  2. 네^^ 감사합니다. 또 오세요~

  3. Blog Icon
    안녕하세요

    안녕하세요 ,,, git 설치하려고 똑같이 따라했는데
    push이후에 다 입력하고 ok를 누르면 거북이가 몇초간 날아가더니
    git did not exit cleanly (exit code 1)
    라고 뜹니다. 해결방법이 없을까요..?

  4. 답변이 많이 늦었습니다.^^

    저도 구글링으로 검색을 해봤는데 검색이 안되는군요..-_-;
    혹시 제 환경에서 동일한 오류가 발생하거나
    관련정보 검색하게되면 꼭 답변 드릴게요.

  5. Blog Icon
    허..

    저도 안녕하세요 님과같이 똑같이 단계별로 진행했는데요
    git did not exit cleanly (exit code 1)가 뜹니다.
    해결법 혹시 아시는지요??ㅠㅠ

  6. 저도 궁금합니다. 왜 그럴까요?
    알게되면 답변드릴게요.^^

  7. Blog Icon
    IS

    스카이드라이브에 파일 넣어놓고 쓰려는데
    이거 로컬 저장소 지우는 방법좀;;
    그리고 제가 윈도우 8.1이라 스카이드라이브가 통합되어 있는데;;;
    제 계정명탓에 경로 인식이 안되네요 ㅠㅠ

  8. 우선 클라우드 서비스의 경우 파일을 동기화하는 부분이라
    Git과는 의미가 많이 다릅니다.

    스카이드라이브의 경우 (제가 사용해 보지는 않았지만) 실시간으로 PC1과 PC2의 특정 디렉토리를 동기화 하는 방식이구요.
    Git의 경우 여러사람이 소스코드 등의 문서를 공동작업하기 위해 합치고 나누는 작업등이 목적입니다.

    만약 혼자서 Git을 사용하시려면 로컬의 (스카이 드라이브 외의)특정 경로에서 Git으로 동기화 하는 것을 추천해 드려요.
    아무래도 수정이력과 가지치기(Branch) 등의 이점을 취할 수 있을테니까요.

  9. Blog Icon
    blueasa

    좋은 정보 감사합니다. :)

  10. 네~감사합니다^^

  11. Blog Icon
    초보코더

    우아.. git 뭐가 뭔지 하나도 몰랐는데 이거 따라해서 처음으로 성공했어요 ㅠㅠㅠ

    아직도 뭐가 원리인지는 잘 모르겠지만 좋은 정보 감사합니다.

  12. Blog Icon
    김덕현

    git을 처음접하는데 이글을 보고 저장소까지 잘올렸습니다.
    원격 저장소의 소스를 받아서 수정 후 올리는 부분 글도 기대하고 있겠습니다.
    감사합니다.

  13. Blog Icon
    금싸라기

    Azure Storage 와 같은 것인가요?

  14. 제가 Azure Storage를 정확히 알지는 못하지만 클라우드 저장소 개념인 것으로 예상되는데요.

    Github와는 다른 개념입니다
    Github는 소스코드를 저장하고, 이력을 관리할 수 있는 소스코드 저장소 역할이구요.
    Azure Storage는 소스코드 보다는 다양한 파일을 저장할 수 있는 클라우드 저장소로 이해하면 될 것 같습니다.

  15. Blog Icon
    허승현

    안녕하세요.
    원격저장소를 github는 아니지만 마이크로소프트에서 제공하는 visual studio team service를 이용하여 따라했고 성공했습니다.

    (https://backlogtool.com/git-tutorial/kr/intro/intro4_2.html)도 같이 겸해서 봤구요.
    -여기서는 username과 password를 적네요.

    중간에 visual studio는 계정이 있어야돼서 username과 password를 적어야하는 것만 달랐지만...저는 성공했는데. 팀원을 제가 만든 원격저장소에 풀이나 푸쉬하는데 usename과 password를 적어야하는데 제 계정을 적어도, 팀원 계정을 적어도 "git did not exit cleanly (exit code 1)"라는 메시지가 뜨면서 안돼네여.

    혹여 관리자인 제 계정에서 팀원 username이나 pasword를 확인할 수 있거나 직접 정해서 줘야 될까여?...그렇다면 어디서 할 수 있을까여?

    획시 어떻게 해야하는지 답변을 받을수 있을까여?

  16. 해당 내용은 저도 잘 모르겠습니다.^^

  17. Blog Icon
    김동현

    커밋에서~ '메시지에 서명 넣기(S)' 버튼 선택하지 말고, 텍스트 입력해보세요~~

[FMX] 컨트롤(TPanel)등에 Form 넣기.

2012. 3. 23. 12:45
Delphi XE2의 FireMonkey에서는 

TForm이 TControl을 상속 받지 않아 TPanel등에 Embed 할 수 없습니다.

위 방식으로 구현된 많은 샘플코드들을 Firemonkey에서 사용하지 못해 당황하다.
아래와 같은 방법으로 해결(?: 꼼수)하여 공유합니다..
// AForm을 AParent에 Embed
procedure EmbedForm(AParent: TControl; AForm: TCustomForm);
begin
  while AForm.ChildrenCount > 0 do
    AForm.Children[0].Parent := AParent;
end;

정상적으로 말하면 Embed는 아니고 Form에 있는 컨트롤들을 Panel로
부모를 옮겨 버리는 방식입니다.
 
사용방법은
  EmbedForm(Panel1, TForm1.Create(Self));


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

  1. Blog Icon
    이회원

    panel1에 생성을 한 폼을 어떻게 close 시켜야 하나요? 그냥 free해도 남아 있던데.

Borland Compiler Conditional Defines

2012. 3. 6. 20:29

컴포넌트 및 라이브러리 소스 만들 때 필요한 델파이 버전별 Conditionnal Define 값입니다.

아래 형태로 사용할 수 있습니다.

{$IFDEF VER270}

// XE6에서만 구현할 코드

{$ENDIF}

Delphi conditional VER<nnn>ProductProduct VersionPackage Version

VER270

Delphi XE6 / C++Builder XE6 
(Delphi:Win32/Win64/OSX/iOS/Android) (C++Builder:Win32/Win64/OSX/iOS/Android)

20

200

VER260

Delphi XE5 / C++Builder XE5 
(Delphi:Win32/Win64/OSX/iOS/Android) (C++Builder:Win32/Win64/OSX/iOS)

19

190

VER250

Delphi XE4 / C++Builder XE4 
(Delphi:Win32/Win64/OSX/iOS) (C++Builder:Win32/Win64/OSX)

18

180

VER240

Delphi XE3 / C++Builder XE3 
(Delphi:Win32/Win64/OSX) (C++Builder:Win32/Win64/OSX)

17

170

VER230

Delphi XE2 / C++Builder XE2 
(Delphi:Win32/Win64/OSX) (C++Builder:Win32/OSX)

16

160

161 is the version for the five FireMonkey packages at XE2 Update 2: 
fmi161.bpl, fmx161.bpl, fmxase161.bpl, fmxdae161.bpl, and fmxobj161.bpl.

VER220

Delphi XE / C++Builder XE (Win32)

15

150

VER210

Delphi 2010 / C++Builder 2010 (Win32)

14

140

VER200

Delphi 2009 / C++Builder 2009 (Win32)

12

120

VER190

Delphi 2007 for .Net *

11

110

VER180 or VER185

Delphi 2007 / C++Builder 2007 for Win32 * 

11

110

VER180

Delphi 2006 / C++Builder 2006 (Win32/.Net) and Delphi/C++Builder 2007 for Win32

10

100

VER170

Delphi 2005 (Win32/.Net)

9

90

VER160

Delphi 8 for .Net

8

80

VER150

Delphi 7 (and 7.1)

7

70

VER140

Delphi 6 / C++Builder 6

6

60

VER130

Delphi 5 / C++Builder 5

5

NA

VER125

C++Builder 4

4

NA

VER120

Delphi 4

4

NA

VER110

C++Builder 3

3

NA

VER100

Delphi 3

3

NA

VER93

C++Builder 1

NA

NA

VER90

Delphi 2

2

NA

VER80

Delphi 1

1

NA

VER70

Borland Pascal 7.0

NA

NA

VER15

Turbo Pascal for Windows 1.5

NA

NA

VER10

Turbo Pascal for Windows 1.0

NA

NA

VER60

Turbo Pascal 6.0

NA

NA

VER55

Turbo Pascal 5.5

NA

NA

VER50

Turbo Pascal 5.0

NA

NA

VER40

Turbo Pascal 4.0

NA

NA


끝~

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

[FMX] Firemonkey에서 ODS 사용하기

2012. 2. 17. 16:18
Firemonkey는 아무래도 Cross platform이다 보니 윈도우 API를 사용하는

OutputDebugString 등을 사용할 수 없습니다. 
근데, 너무 불편해요 ODS가 없으면 그래서 찾아보니

Window API를 사용할 수 있네요...
그것도 간단하게

uses에 Winapi.Windows를 추가하면 됩니다.
그리고 아래와 같이 예외(IFDEF)하시고 사용하시면

혹시 다른 플랫폼에서 문제가 생길 염려는 없겠죠^^

{$IFDEF MSWINDOWS}
  OutputDebugString(PChar(Format('우왕 ODS가 된다.', [])));
{$ENDIF}

끝~

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

[IDE] 델파이 작업경로 바로가기

2012. 2. 10. 10:10
델파이로 개발 작업 중 현재 소스 경로로 이동해야 되는 일이 종종 있죠...

그럴때마다 explorer를 실행해서 이동하려면 번거롭습니다. 

그럴때 유용한  기능을 소개합니다.

* 델파이 메뉴에 현재 작업 중인 작업경로를 여는 메뉴를 추가합니다.

우선 예전 아는 선배에게 들은 재미있는 이야기 하나.

선배는 핸드폰 관련된 개발 일을 했습니다. 

동료와 이야기 중 "Window CE에서는 탐색기를 어떻게 열어요?" 라는 질문에

근처에 있던 외국인 개발자 曰

"뭔 새끼? 탐새끼?"

-_-;

 
그래서 그 이야기를 들은 저는 그 이후로 탐새끼라는 단어를 주로 사용합니다. 

그러면 위의 탐새끼를 델파이에 등록해 보겠습니다. 

1, Tools > Configure Tools 선택
 

 2, [Add] 버튼 클릭 후 아래와 같이 입력 후 [OK] 클릭
 

3, Tools > 탐새끼 등록 확인

 위와 같이 등록하시면 "탐새끼"를 통해 현재 작업 중인 경로의 탐색기가 실행 됩니다.

참 좋은 새끼(?)죠?

끝~ 

험프리 험프리.김현수 Delphi/C++Builder 델파이, 작업경로이동, 탐새끼