2008/04/21

DelphiSpeedUp 2.75 Released!!

DelphiSpeedUp 은 CodeGear 툴의 IDE 성능 개선 Plugin.

Features:

    * Improves Delphi/BCB/BDS's load times
    * Optimizes often used RTL functions by functions form the FastCode project
    * All optimizations are done in memory and do not change any file on disk
    * Adds a "Close all and kill" menu item to the "File" menu that terminates the IDE very fast
    * The fast termination is used when you close the IDE while pressing the CTRL key.
    * Shows waiting cursor while loading designtime package


Supported IDEs:

    * C++Builder 5, 6
    * Delphi 5, 6, 7
    * Borland Developer Studio 2005, 2006
    * CodeGear RAD Studio 2007 (December Update)

# Version 2.75 (2008-04-19)

    * Fixed: FastQuit (Ctrl+Quit) ignored the "Cancel" button in the "Do you want to save?" dialog
    * Added: Fix for TCustomActionList.Notification memory overwrite (also in IDEFixPack for RAD Studio 2007; not fixed for Delphi 5)
    * Added: No delay after switching from Text DFM to the form designer (Delphi 2006, RAD Studio 2007)


Homepage
Downl

Original Post :
http://neodreamer-dev.tistory.com/98

2008/04/19

여러개의 컨트롤 아이디를 하나의 함수로 매핑

ON_COMMAND_RANGE

ON_COMMAND_RANGE(id1, id2, memberFxn )

ON_COMMAND_RANGE 매크로는 id1 부터 id2 까지 컨트롤의 메세지 핸들러를 memberFxn 으로 매핑시켜 준다.

이때 id1부터 id2까지는 이어지는 번호이어야 하며 memberFxn 는 ON_COMMAND 와는 달리 메세지를 받은 컨트롤을 인지할 수 있는 아이디를 매개변수로 가져야한다.

// The code fragment below shows how to use ON_COMMAND_RANGE macro
// to map a contiguous range of command IDs to a single message
// handler function (i.e. OnFileMenuItems() is the sample below). In
// addition, it also shows how to use CheckMenuRadioItem() to check a
// selected menu item and makes it a radio item.
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// ...
ON_COMMAND_RANGE(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3, OnFileMenuItems)
END_MESSAGE_MAP()

void CMainFrame::OnFileMenuItems(UINT nID)
{
CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->CheckMenuRadioItem(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3,
nID, MF_BYCOMMAND);
}



ON_UPDATE_COMMAND_UI_RANGE

ON_UPDATE_COMMAND_UI_RANGE(id1, id2, memberFxn )

ON_COMMAND_RANGE와 사용법이 유사하며 id1 부터 id2 까지의 컨트롤의 UI 업데이트 메세지 핸들러를 하나의 함수로 매핑해 준다.


ON_CONTROL_RANGE

ON_CONTROL_RANGE(wNotifyCode, id1, id2, memberFxn )

ON_COMMAND_RANGE와 유사하지만 원하는 메세지를 설정해 줄 수 있다.

말보다는 코드를 보는 것이 이해하기 더 쉬울 것이다.

// 아래 코드는 IDC_BUTTON1 부터 IDC_BUTTON4 까지 버튼의
// BN_CLICKED 메세지를 OnButton 이란 함수에 매핑을 시켜줄 경우 이다.

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// ...
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON4, OnButton)
END_MESSAGE_MAP()

void CMainFrame::OnButton(UINT nID)
{
switch (nID)
{
case IDC_BUTTON1:
:
break;
case IDC_BUTTON2:
:
break;
case IDC_BUTTON3:
:
break;
case IDC_BUTTON4:
:
break;
}
}




출처 : Microsoft MSDN
ON_COMMAND_RANGE
ON_UPDATE_COMMAND_UI_RANGE
ON_CONTROL_RA

Original Post :
http://neodreamer-dev.tistory.com/96

2008/04/15

C++ Builder 또는 Turbo C++ 에서 OpenCV 사용하기

OpenCV (Open source Computer Vision) 소스를 C++ Builder 나 Turbo C++ 에서 사용하기위해 Borland C++ Compiler 5.5로 컴파일한 데이터 이다.

이를 사용하기 위해서는 해당 프로젝트에 포함 파일 경로와 라이브러리 경로를 정해 주어야하고 프로젝트에 라이브러리를 넣어 주어야한다.

OpenCV Include

Include 경로 추가


OpenCV Library

Library 경로 추가

Project files

프로젝트에 포함된 파일들



간단한 사용 예
#include <cv.h>
#include <highgui.h>

if (dlgOpen->Execute())
{
// CvvImage 를 활용한 폼에 이미지 출력하기
CvvImage cvImage;
cvImage.Load(dlgOpen->FileName.c_str(), 1);

TRect rcImg;
rcImg.Left = 0;
rcImg.Top = 0;
rcImg.Right = m_cvImage.Width();
rcImg.Bottom = m_cvImage.Height();

cvImage.DrawToHDC(Canvas->Handle, &rcImg);


// 이미지를 불러와 OpenCV 창에 출력하기
IplImage* color_img = cvLoadImage(dlgOpen->FileName.c_str(),
CV_LOAD_IMAGE_UNCHANGED);

cvNamedWindow("color_img", CV_WINDOW_AUTOSIZE);
cvShowImage("color_img", color_img);

cvReleaseImage( &color_img );
}


CodeGear 툴용 OpenCV 파일들 :


Original Post : http://neodreamer-dev.tistory.com/95

2008/04/11

Bcc32Pch C++Builder IDE Plugin Version 2.79

# 2008-04-10 (Version 2.79)

    * Fixed: Sometimes the global C++ Include directories were not added to the -I command line parameter
    * Fixed: Package libs were used in applications without packages
    * Fixed: Macros in the final output directory caused bcc32pch to create a directory with %macroname%
    * Added: Workaround for malformed resource compiler additional options from wxForms. (BCB 2007)


Bcc32Pch Homepage

Bcc32Pch Download
Original Post :
http://neodreamer-dev.tistory.com/94

2008/04/07

MFC Dialog Box에서 자신의 Class Name설정



출처 : http://www.debuglab.com/knowledge/classname.html

MFC기반 어플리케이션에서 Dialog Box에 자신의 윈도우 Class Name을 제공하는 방법을 설명하겠습니다. Single instance를 필요로하는 Dialog기반의 어플리케이션을 작성할 때 Dialog가 자신만의 Class Name을 필요로 할때가 있습니다. 그러나 MFC에서는 기본적으로 모든 Dialog가 #32770이라는 Class Name으로 설정되어있습니다.

  • ResourceView를 연다.
  • Resource Editor에서 Dialog Box를 열고 Dialog Box에서 오른쪽 버튼을 클릭한 다음
    Properties를 선택한다. 오른쪽 아래를 보면 Class Name이라는 곳이 disable되어 있을 것이다. 이 옵션을
    enable할려면 resource view의 top-level node를 선택하고 오른쪽 버튼을 누르고 Properties를
    선택한다. 그런 다음 Enable MFC Features 체크 박스를 해제한다. 다시 Dialog Box의 properties를
    보면 Class Name 옵션이 enable되어있을 것이다.
  • Class Name을 입력하고 .rc 파일을 text형식으로 연다. 해당하는 DIALOG resource로 가서 CLASS 옵션을 추가한다.

IDD_LIMITDLGINSTANCE_DIALOG DIALOGEX 0, 0, 195, 44
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "LimitDlgInstance"
CLASS "MyPrivateClassName" // Add your class name here!
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,138,7,50,14
PUSHBUTTON "Cancel",IDCANCEL,138,23,50,14
PUSHBUTTON "&Test!",IDC_BUTTON1,48,14,49,15
END

  • CWinApp에 상속받은 class에서 InitInstance() 부분에 다음 코드를 추가한다.

BOOL CLimitDlgInstanceApp::InitInstance()
{
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
WNDCLASS wc;

// Get the info for this class.
// #32770 is the default class name for dialogs boxes.
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);

// Change the name of the class.
wc.lpszClassName = "MyPrivateClassName";

// Register this class so that MFC can use it.
AfxRegisterClass(&wc);

//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// ...
}

  • 위 단계에서 ::GetClassInfo()호출 부분에 만약 Dialog resource가 DLL에 위치해 있다면 적절한 HINSTANCE를 사용하여 호출한다.
  • 프로젝트를 Build하고 실행한 다음 Spy++로 확인해보면 새로운 Class Name으로 설정된 것을 볼 수 있을 것이다.


출처 : http://www.debuglab.com/knowledge/classname.h

Original Post :
http://neodreamer-dev.tistory.com/93

Delphi Virtual Keycode
















































































































































































































































































































































































































































































































































































































































































































































































Symbolic

constant name
Value


(hexadecimal)
Keyboard (or mouse) equivalent
VK_LBUTTON01Left mouse button
VK_RBUTTON02Right mouse button
VK_CANCEL03Control-break processing
VK_MBUTTON04Middle mouse button (three-button mouse)
VK_BACK08BACKSPACE key
VK_TAB09TAB key
VK_CLEAR0CCLEAR key
VK_RETURN0DENTER key
VK_SHIFT10SHIFT key
VK_CONTROL11CTRL key
VK_MENU12ALT key
VK_PAUSE13PAUSE key
VK_CAPITAL14CAPS LOCK key
VK_ESCAPE1BESC key
VK_SPACE20SPACEBAR
VK_PRIOR21PAGE UP key
VK_NEXT22PAGE DOWN key
VK_END23END key
VK_HOME24HOME key
VK_LEFT25LEFT ARROW key
VK_UP26UP ARROW key
VK_RIGHT27RIGHT ARROW key
VK_DOWN28DOWN ARROW key
VK_SELECT29SELECT key
VK_PRINT2APRINT key
VK_EXECUTE2BEXECUTE key
VK_SNAPSHOT2CPRINT SCREEN key
VK_INSERT2DINS key
VK_DELETE2EDEL key
VK_HELP2FHELP key

300 key

311 key

322 key

333 key

344 key

355 key

366 key

377 key

388 key

399 key

41A key

42B key

43C key

44D key

45E key

46F key

47G key

48H key

49I key

4AJ key

4BK key

4CL key

4DM key

4EN key

4FO key

50P key

51Q key

52R key

53S key

54T key

55U key

56V key

57W key

58X key

59Y key

5AZ key
VK_NUMPAD060Numeric keypad 0 key
VK_NUMPAD161Numeric keypad 1 key
VK_NUMPAD262Numeric keypad 2 key
VK_NUMPAD363Numeric keypad 3 key
VK_NUMPAD464Numeric keypad 4 key
VK_NUMPAD565Numeric keypad 5 key
VK_NUMPAD666Numeric keypad 6 key
VK_NUMPAD767Numeric keypad 7 key
VK_NUMPAD868Numeric keypad 8 key
VK_NUMPAD969Numeric keypad 9 key
VK_SEPARATOR6CSeparator key
VK_SUBTRACT6DSubtract key
VK_DECIMAL6EDecimal key
VK_DIVIDE6FDivide key
VK_F170F1 key
VK_F271F2 key
VK_F372F3 key
VK_F473F4 key
VK_F574F5 key
VK_F675F6 key
VK_F776F7 key
VK_F877F8 key
VK_F978F9 key
VK_F1079F10 key
VK_F117AF11 key
VK_F127BF12 key
VK_F137CF13 key
VK_F147DF14 key
VK_F157EF15 key
VK_F167FF16 key
VK_F1780HF17 key
VK_F1881HF18 key
VK_F1982HF19 key
VK_F2083HF20 key
VK_F2184HF21 key
VK_F2285HF22 key
VK_F2386HF23 key
VK_F2487HF24 key
VK_NUMLOCK90NUM LOCK key
VK_SCROLL91SCROLL LOCK key
VK_LSHIFTA0Left SHIFT key
VK_RSHIFTA1Right SHIFT key
VK_LCONTROLA2Left CONTROL key
VK_RCONTROLA3Right CONTROL key
VK_LMENUA4Left MENU key
VK_RMENUA5Right MENU key
VK_PLAYFAPlay key
VK_ZOOMFBZoom key

출처 : http://delphi.about.com/od/objectpascalide/l/blvkc.htm<

Original Post : http://neodreamer-dev.tistory.com/92

델파이에서 System Global Hotkey 사용하기

Global Hotkey 이용하기의 마지막 팁이다.

이번에는 Delphi 에서 이용하는 방법이다.

델파이는 비주얼 베이직과 같이 RAD 툴이면서 비주얼 베이직과는 다르게 특별한 선언이 없이 바로 Win32 API 를 사용할 수 있다.

따라서 C++에서 사용하는 방법과 크게 다르지 않으며 다른 것이 있다면 메세지 핸들링하는 방법과 가상 키코드를 이용하는 방법이 약간 다르다.

메세지 핸들링하는 방법은 언어 자체가 다르니 C++과는 다를 수 밖에 없고 가상 키코드 사용은 델파이에 알파벳에 대응하는 키코드는 정의 되지 않아 직접 숫자로 적용 해야한다.


unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
hkID: Integer;
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if Msg.HotKey = hkID then
ShowMessage('Ctrl + A pressed !');
end;

procedure TForm1.FormCreate(Sender: TObject);
// Different Constants from Windows.pas
const
MOD_ALT = 1;
MOD_CONTROL = 2;
MOD_SHIFT = 4;
MOD_WIN = 8;
begin
// Register Hotkey Ctrl + A
hkID := GlobalAddAtom('MyHotkey');
RegisterHotKey(Handle, hkID, MOD_CONTROL, $41);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, hkID);
GlobalDeleteAtom(hkID);
end;

end.

Original Post : http://neodreamer-dev.tistory.com/91

C++ Builder 에서 System Global Hotkey 사용하기

이전 글에서 프로그램에 시스템 레벨의 Hotkey를 할당하는 팁을 올렸었다.

이는 Win32 API를 이용하는 것으로 예제는 Visual C++에 맞추어 있지만 이를 C++ Builder에도 쉽게 응용할 수 있다.


적용 절차는 Visual C++과 크게 다를게 없으며 메세지 핸들링하는 부분만 VCL에 맞게 해주면 된다.


// Header (.h)
ATOM GolbalKeyID;

void __fastcall OnHotKey(TWMHotKey &hotkey);

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_HOTKEY, TWMHotKey, OnHotKey);
END_MESSAGE_MAP(TForm)


// Source (.cpp)
void __fastcall TForm1::FormCreate(TObject *Sender)
{
GolbalKeyID = GlobalAddAtom("MyKey");

RegisterHotKey(this->Handle, GolbalKeyID, MOD_WIN, 65 );
}
//------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnregisterHotKey(this->Handle, GolbalKeyID);

GlobalDeleteAtom(GolbalKeyID);
}
//------------------------------------------------------------------------

void __fastcall TForm1::OnHotKey(TWMHotKey& hotkey)
{
if (WindowState == wsMinimized)
Application->Restore();

ShowMessage("Global Hotkey pressed");
}
//------------------------------------------------------------------------

Original Post : http://neodreamer-dev.tistory.com/90

Visual Studio 2005 에서 Prof-UIS 를 컴파일하면 죽는다!

컴파일러를 2002에서 2005로 업데이트를 하는 과정에서 컴파일만 하면 VS2005가 죽어 버리는 현상이 발생하였다.

문제는 Prof-UIS 에서 발생하는 것으로 (주)이지플로우에서는 다음과 같은 분석 결과를 내놓았다.

원본주소 : http://www.easyflow.co.kr/Customer/Qna.aspx?No=36&Page=0&Find=
-------------------------------------------------------------------------------------------
안녕하세요, Prof-UIS 고객님

Prof-UIS 통합마법사 또는 비주얼 스튜디오로 라이브러리를 빌드시 도중에 에러 또는 다운되는 현상에 대한 조치방법입니다.

이 현상에 대한 원인은 Prof-UIS는 약 39개 언어를 지원하는 다국어 리소스를 가지고 있습니다. 한글 비주얼스튜디오 2005는 2003과는 달리 한글과 영어 리소스외에 다른언어 리소스는 처리하지 못하고 다운되고 있습니다. 따라서 Prof-UIS의 리소스 정의 부분에서 한글과 영문을 제외한 다른 언어는 삭제하거나 주석처리 하시면 됩니다.

다음은 Prof-UIS 리소스를  한글과 영문만 사용하는 방법입니다.

1. 먼저, C:\Program Files\FOSS Software Inc\Prof-UIS\Include\Resources 폴더에서 resource.rc 파일을 Text로 읽어옵니다.
2. 아래의 텍스트에서 적색 부분을 삭제하거나 주석처리 합니다.
3. 다시 빌드하여 사용합니다.

reousrce.rc 파일 보기


감사합니다.
기술지원

Original Post : http://neodreamer-dev.tistory.com/89