Search results for 'Delphi/C++Builder'

  1. 2015.05.28 -- [XE8] RAD Studio XE8을 지원하는 외부 컴포넌트와 도구
  2. 2015.05.27 -- JVCL(JCL) 써드파티 컴포넌트 최신버전을 받기
  3. 2015.03.24 -- 델파이/C++빌더에 TServerSocket, TClientSocket 등록하기
  4. 2015.03.06 -- 웹사이트의 인증서 오류를 무시하고 http 결과 조회하기(WinInet 이용)
  5. 2015.03.02 -- [VCL] 에디트에 숫자만 입력, 콤마찍기
  6. 2015.02.13 -- [VCL] 에디트/버튼의 다양한 속성 소개
  7. 2015.02.09 -- FieldByName 사용팁 - 사악신님의 글
  8. 2015.02.03 -- [VCL] TaskDialog 컴포넌트 소개
  9. 2015.01.21 -- [컴포넌트 소개] TWebUpdate - 업데이트 프로그램 제작 컴포넌트/지원 툴(TMS Software)
  10. 2015.01.13 -- (문서)프로그래밍 언어 기초 - 델파이와 C++
  11. 2015.01.12 -- getAwesomeness() - Delphi(참고할 만한 델파이 오픈소스)
  12. 2014.12.30 -- TurboPack - XE7 지원하는 오픈소스 컴포넌트
  13. 2014.12.30 -- [XE7] XML DOM 벤더(MSXML, ADOM, OmniXML) 설정하기
  14. 2014.12.24 -- XE7을 지원하는 써드파티 컴포넌트와 툴 목록(엠바카데로 제공)
  15. 2014.12.12 -- VCL의 유용하지만 놓칠수 있는 기능 들
  16. 2014.12.10 -- 델파이로 국제화된 다국어 애플리케이션 만들기 (1)
  17. 2014.12.05 -- 블루투스LE(Bluetooth Low Energy)의 이해
  18. 2014.12.02 -- [XE7] "Color to gray" 변환 알고리즘을 병렬(Parallel)로 처리하기
  19. 2014.11.27 -- 환경파일에서 "The imported project file could not be loaded. '', hexadecimal value 0x01, is an invalid character." 오류 발생 시 조치사항
  20. 2014.11.03 -- 더 쉬운코드, 더 유연한 코드를 작성할 수 있는 현대식 문법

[XE8] RAD Studio XE8을 지원하는 외부 컴포넌트와 도구

2015.05.28 11:41

델파이 XE8과 C++빌더 XE8을 지원하는 오픈소스 컴포넌트와 도구, 플러그인입니다.

❑ JCL / JVCL

다양한 기능을 제공하는 델파이, C++빌더 개발자들에게 익숙한 JCL/JVCL 컴포넌트

  • JCL - https://github.com/project-jedi/jcl
  • JVCL - https://github.com/project-jedi/jvcl

❑ IDE Fix Pack

IDE를 최적화해주는 플러그인

❑ GExperts

IDE에 유용한 기능을 추가 해주는 플러그인

❑ DDevExtensions

IDE 기능을 확장해주는 플러그인

❑ CnPack

IDE 기능을 확장해 주는 플러그인


RAD Studio XE8 추가기능인 Getit..(패키지 관리자)에서 엠바카데로가 호스팅하는 컴포넌트를 찾아 설치할 수 있습니다.

❑ Getit(패키지 관리자)


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

JVCL(JCL) 써드파티 컴포넌트 최신버전을 받기

2015.05.27 16:13


JVCL/JCL 컴포넌트는 오픈소스로 진행되는 써드파티 컴포넌트로, 델파이 6 부터 XE8(2015.5월 기준)까지 지원합니다.

(기존 소스포지에서 깃허브로 둥지를 옮긴듯해요.)

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

델파이/C++빌더에 TServerSocket, TClientSocket 등록하기

2015.03.24 10:40

TServerSocket과 TClientSocket은 기본적으로 감춰져 있어 패키지 등록 후 사용할 수 있습니다.

  1. RAD Studio > Component > Install Packages
  2. [Add] 버튼 클릭
  3. (RAD Studio 설치 경로)\bin 으로 이동 후 dclsockets(버전숫자).bpl 선택
    • XE7 기준 경로 : C:\Program Files (x86)\Embarcadero\Studio\15.0\bin
    • XE7 기준 파일명 : dclsockets210.bpl
  4. [OK] 버튼 클릭

컴포넌트 팔랫트의 Internet 카테고리에 TServerSocket, TClientSocket이 등록됩니다.


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

웹사이트의 인증서 오류를 무시하고 http 결과 조회하기(WinInet 이용)

2015.03.06 13:37

고객사에서 웹서비스 연동 시 아래와 같이 인증서가 잘못된 경우 무시할 수 있는 방법을 요청해 공유합니다.


1, 서버 인증서 오류 내용 

한글 : 이 웹 사이트의 보안 인증서에 문제가 있습니다 

영문 : There is a problem with this website's security certificate - http://support.microsoft.com/kb/931850/ 


2, 영문으로 검색 시 아래와 같은 키워드를 찾았습니다. 

WINHTTP_OPTION_SECURITY_FLAGS 

SECURITY_FLAG_IGNORE_UNKNOWN_CA 

SECURITY_FLAG_IGNORE_CERT_CN_INVALID 

SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 

(https://msdn.microsoft.com/en-us/library/windows/desktop/aa384066(v=vs.85).aspx


위의 플래그들이 잘못된 인증서를 무시하라는 옵션설정으로 보입니다. 


3, 위 보안 플래그를 설정하는 데모 

http://www.nldelphi.com/showthread.php?39901-Bad-cipher-melding 

http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_26824117.html

위 링크를 참고해 첨부파일의 샘플을 만들어 보았습니다. 

주요 코드는 아래와 같으며 WinInet을 이용하기 위해 uses 절에 "Winapi.WinInet"를 추가해야 합니다.

ReqFlags := ReqFlags
              or SECURITY_FLAG_IGNORE_UNKNOWN_CA
              or SECURITY_FLAG_IGNORE_CERT_CN_INVALID
              or SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
              or SECURITY_FLAG_IGNORE_REVOCATION;
  // Set new flags
  if not(InternetSetOption(hReq, INTERNET_OPTION_SECURITY_FLAGS, @ReqFlags, dwSize)) then begin
    // Get error code
    dwError := GetLastError;
    // Failure
    MessageBox(0, PChar(IntToStr(dwError)), PChar('Confirm'), MB_OK or MB_ICONINFORMATION);
  end;


4, 테스트 & 결과

DelphiIgnoreUnknownCA.zip


첫번째 버튼은 TIdHttp 컴포넌트로 https를 호출하고 

두번째 버튼은 WinInet을 이용했습니다. 


아쉽게도 인증서 오류가 발생한 환경이 없어 고객에게 테스트 요청했습니다. 결과가 오거나 테스트 환경을 찾게되면 테스트 후 결과를 추가하겠습니다.(기본 동작만 https를 제공하는 facebook에서 확인한 상태입니다.)

===============================

[테스트 결과 추가]

고객사에서는 Release 모드인 경우 통과 Debug 모드인 경우 3회의 통신 오류 후 응답 수신되었다는 결과를 받았습니다.

(하지만, 고객사의 내부보안이 강력해 보안 이슈도 고려해야하는 결과였습니다.)

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

[VCL] 에디트에 숫자만 입력, 콤마찍기

2015.03.02 16:05

VCL 에디트(TEdit)의 NumbersOnly 속성을 이용하면 컨트롤에 숫자만 입력받도록 구현할 수 있다는 것 잘 아실텐데요.이번 글에서는 숫자 입력 시 콤마를 자동추가할 수 있도록 구현한 내용 공유합니다.


기능은 2가지입니다.

  • 키입력 시 3자리마다 콤마 추가(e.g. 123,456,789,012)
  • 에디트에서 순수 숫자만 읽고 쓰기(PlainText 속성 추가)

구현은 여러폼에서 uses에 추가하기만 하면 동작하도록 별도의 유닛으로 만들었습니다.

unit Vcl.EditExtends;

interface

uses
  Vcl.StdCtrls, Vcl.Controls, System.Classes;

type
  TEdit = class(Vcl.StdCtrls.TEdit)
  private
    function GetPlainText: string;
    procedure SetPlainText(const Value: string);
  protected
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  public
    property PlainText: string read GetPlainText write SetPlainText;
  end;

implementation

uses
  SysUtils;

{ TEditEx }

procedure TEdit.KeyUp(var Key: Word; Shift: TShiftState);
var
  S: string;
begin

  inherited;

  S := Text;
  S := S.Replace(',', '').Replace('.', '');
  Text := FormatFloat('#.###,##', StrToFloatDef(S, 0));
  selStart := Length(Text) + 1;
end;

function TEdit.GetPlainText: string;
var
  S: string;
begin
  S := Text;
  Result := S.Replace(',', '').Replace('.', '');
end;

procedure TEdit.SetPlainText(const Value: string);
var
  Key: Word;
begin
  Text := Value;
  KeyUp(Key, []);
end;

end.

NumbersOnly.zip


사용법은 

  1. 폼에 Edit 컴포넌트를 추가하고 Vcl.EditExtends를 상단(interface) uses 절에 추가합니다.(Vcl.StdCtrls 뒤에 Vcl.EditExtends가 추가되야 합니다.)
  2. 키입력시 콤마 추가는 자동으로 동작합니다.
  3. 순수 숫자 넣고 읽기는 PlainText 메소드를 이용할 수 있습니다.
기타 필요한 기능 추가해서 사용하시기 바랍니다.(알려주시면 기능을 추가해서 올리겠습니다.)


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

[VCL] 에디트/버튼의 다양한 속성 소개

2015.02.13 10:27

VCL 기본 컴포넌트 중 가장 많이 사용하는 에디트(TEdit), 버튼(TButton)의 다양한 속성을 소개합니다. 

대부분 아는 속성일테지만 항상 사용하는 기본 속성만 사용하는 분들은 이 기회에 다양한 속성 사용해 보세요.


❑ 에디트 텍스트 정렬

Alignment 속성 선택(taCenter, taLeftJustify, taRightJustify)으로 텍스트의 위치를 지정할 수 있습니다.

❑ 에디트 텍스트 힌트(콤보박스도 가능)

TextHint 속성을 이용해 Text가 비어있으면 입력항목의 설명을 배경으로 표시할 수 있습니다.


콤보박스도 항목(Items)와 무관하게 설명을 표시합니다.

❑ 에디트 숫자만 입력 / 비밀번호 문자

NumbersOnly 속성으로 숫자만 입력하도록 강요합니다.

PasswordChar에 '■'를 입력하면 해당 문자로 비밀번호가 표시됩니다.

❑ 에디트 대소문자 변경(메모 포함)

CharCase 속성(ecLowerCase, ecNormal, ecUpperCase)을 변경해 대소문자로 입력 받을 수 있습니다.(아이디나 이메일 등의 필드에서 유용할 것 같네요.)

❑ 버튼 속성

권한상승 아이콘 표시

ElevationRequired 속성을 True로 지정 시 권한 상승 아이콘이 표시됩니다.(권한상승 동작은 별도 구현해야 합니다.)


버튼 스타일

Style 속성을 변경(bsCommandLink, bsPushButton, bsSpliteButton)해 커맨드 링크 방식과 분할 버튼 방식으로 표시할 수 있습니다.

분할버튼은 TPopupMenu 컴포넌트를 추가하고 버튼의 DropDownMenu에 연결해 사용할 수 있습니다.

❑ 데모 프로젝트 소스코드


관련 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder TButton, TEdit, vcl

FieldByName 사용팁 - 사악신님의 글

2015.02.09 17:44

FieldByName('fieldName').AsString과 같이 많이 사용하시죠? 웹서핑 중 사악신님 블로그에서 FieldByName 사용 팁을 발견해 공유합니다.


FieldByName 호출 시 수행되는 과정을 파해치고 대안을 제시해 줍니다. 짧으면서 좋은 팁이네요.


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

[VCL] TaskDialog 컴포넌트 소개

2015.02.03 14:04

TTaskDialog 컴포넌트

작업에 대한 소개와 다양한 옵션으로 다중작업 중 선택할 수 있는 TTaskDialog 컴포넌트를 소개합니다.

아래와 같이 다양한 정보와 선택지(RadioButton, CommandLink, 버튼)를 제공하고 입력 받을 수 있습니다.

선택한 버튼에 대한 정보는 ModalResult 속성으로 버튼번호를 알아 옵니다.

❑ 기본 정보

Caption, Text, Title 속성으로 작업에 대한 기본 정보를 설정할 수 있습니다.

❑ 자세한 정보

ExpandedText, ExpandButtonCaption 속성으로 추가정보를 제공합니다. 추가정보는 기본으로 감추고 자세한 정보 보기 버튼을 누르면 자세한 내용이 작업설명 하단에 표시됩니다.

❑ 버튼

CommonButtons 속성을 통해 확인, 예, 아니오, 다시시도, 취소, 닫기 버튼을 표시합니다.

Buttons 속성에 사용자 정보를 추가해 표시할 수 있습니다.

❑ 메인 아이콘

MainIcon 속성으로 메인 아이콘을 설정합니다.





❑ 하단(Footer) 정보

FooterText, FotterIcon 속성으로 하단의 추가 설명과 아이콘을 설정합니다.

❑ 확인 체크박스

VerificationText 속성을 입력하면 체크박스가 추가되고 OnVerificationClicked 이벤트를 발생시킵니다.

체크박스 선택여부는 Flags 속성의 tfVerificationFlagChecked 항목 선택 여부로 알 수 있습니다.

procedure TForm5.TaskDialog1VerificationClicked(Sender: TObject);
begin
  if tfVerificationFlagChecked in TaskDialog1.Flags then
    CheckBox9.Font.Style := [fsBold]
  else
    CheckBox9.Font.Style := [];
end;

❑ 라디오버튼

RadioButtons 속성에 항목을 추가해 하나를 선택할 수 있는 라디오버튼을 제공합니다.

❑ CommandLink

Flags 속성의 tfUseComandLinks 항목을 선택하면 Buttons 속성에 추가한 항목을 아래와 같은 Link 형식으로 표시합니다.

❑ ProgressBar 표시

Flags 속성의 tfShowProgressBar 항목을 선택하면 상태바를 표시할 수 있습니다.


관련 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

[컴포넌트 소개] TWebUpdate - 업데이트 프로그램 제작 컴포넌트/지원 툴(TMS Software)

2015.01.21 16:20

자동 업데이트 프로그램은 주요 기능은 아니지만 빠져서는 안되는 프로그램 중 하나입니다. 이번 글에서는 자동 업데이트 프로그램 제작 시 도움이 되는 TWebUpdate 컴포넌트를 소개합니다.


자동 업데이트 프로세스는 시스템 환경에 맞게 각자 정해야 하지만 자동 업데이트에 필요한 기술은 TWebUpdate 컴포넌트를 활용해 빠르게 개발해 여러분의 시간을 절약할 수 있습니다.


자동 업데이트 프로세스에 대해 익숙하지 않은 분들을 위해 HTTP를 이용한 자동 업데이트 프로세스 예를 한가지 들어 보겠습니다.

  1. 업데이트할 파일을 웹 서버에 업로드 하고, 업데이트 정보를 담고 있는 업데이트 정보파일도 웹서버에 업로드 합니다.
  2. 프로그램이 실행 시 메인 프로그램 전에 업데이트 프로그램을 실행하도록 구성하고, 업데이트 프로그램은 HTTP를 이용해 업데이트 정보를 받아와 업데이트 여부를 확인합니다. 
  3. 업데이트가 필요하면 웹서버의 업데이트할 파일을 다운로드 하고 메인 실행파일(또는 데이터)을 교체합니다.
  4. 업데이트 프로그램은 메인 프로그램을 실행하고 자신은 종료합니다.
위 프로세스에서 TWebUpdate 컴포넌트는 아래의 기능을 제공하기 때문에 여러분들이 실제 개발할 부분은 업데이트 프로세스를 정하고 제공되는 기능으로 프로세스대로 실행되도록 구현하는 부분을 진행하면 됩니다.
  • 업데이트 파일을 준비(압축 등)하고 업데이트 정보파일을 생성
  • 업데이트 정보를 받아와 업데이트 여부를 확인
  • 업데이트 파일을 다운로드 하고 실행파일(또는 데이터)을 교체

❑ TWebUpdate 컴포넌트

TWebUpdate 컴포넌트는 HTTP, HTTPS, FTP, 파일 네트워크 상의 업데이트 정보파일을 읽어 업데이트를 판단하고 업데이트를 수행하는 기능을 제공하는 컴포넌트입니다. 업데이트 판단하는 방식은 파일의 버전, 파일생성 일자, 체크섬, 파일크기, 사용자 버전을 제공합니다. 배포할 파일을 압축해 배포하고 업데이트 목록 중 일부만 업데이트하는 기능, 업데이트 과정을 쓰레드로 진행하는 기능 등의 부가적인 기능도 제공합니다.

TWebUpdate의 특징은 업데이트에 필요한 정보(배포파일 목록, 업데이트 버전, 파일크기 등)를 기록한 업데이트 정보파일을 생성할 수 있는 자동화 도구인 Update Builder를 제공합니다. 

❑ Update Builder

반복되는 업데이트 과정에서 수작업으로 업데이트 정보파일을 만드는 작업은 실수도 잦고, 번거로울 수 있는데요. Update Builder는 한번 설정한 정책을 파일로 저장하고, 다음 업데이트 시 다시 불러와 빌드 과정만 진행하면 업데이트 정보파일을 새로 생성해 주기 때문에 실수도 적어지고, 작업자의 노력과 시간을 줄여줍니다.

업데이트 파일 추가

UpdateBuilder의 기본 탭인 Files에서는 업데이트할 파일을 추가하고, 개별파일마다 배포위치(Target directory), 업데이트 판단 기준(File Update), 압축여부(File Compression) 등을 설정합니다.

업데이트 설정

프로젝트 빌드(업데이트 정보파일 생성)


업데이트 정보파일은 아래와 같은 구조를 갖습니다.



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

(문서)프로그래밍 언어 기초 - 델파이와 C++

2015.01.13 09:31

델파이와 C++ 프로그래밍 언어 기초를 다질 수 있는 문서입니다.


다들 아는 내용이겠지만 가볍게 읽어보며 다시한번 정리해보시기 바랍니다.

초급 개발자 분들은 이번 기회를 통해 언어의 기초를 다져 보기 바랍니다.



구입 및 다운로드


관련 글

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder C++, 델파이, 문법

getAwesomeness() - Delphi(참고할 만한 델파이 오픈소스)

2015.01.12 10:19

델파이 프레임워크, 라이브러리, 리소스 등을 참고할 수 있는 사이트입니다.(오픈소스 기반으로 설명합니다.)

카테고리 별로 잘 구분되어 있습니다.


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder 델파이, 오픈소스

TurboPack - XE7 지원하는 오픈소스 컴포넌트

2014.12.30 11:32

델파이는 기본 컴포넌트 외에도 외부(써드파트) 컴포넌트를 통해 기능을 손쉽게 확장할 수 있다는 장점이 있습니다.

오늘은 외부 컴포넌트 중 오픈소스로 진행되는 컴포넌트 몇가지를 소개합니다.


오늘 소개할 컴포넌트들은 로마의 델파이 개발자 Kassebaum가 엠바카데로의 (약간의)지원을 받아 최신버전(XE7)으로 업그레이드된 오프소스 컴포넌트 들입니다.(버전정보와 새로운 RTL을 적용했다고 합니다.)

❑ Orpheus

120여개 이상의 VCL 비주얼 컨트롤을 제공합니다. 특수 목정의 에디트, 그리드와 시계등을 제공합니다.

(이미지참조: http://blog.marcocantu.com/blog/2014-december-turbopack-short-video.html)

❑ Virtual Tree

이미 델파이에서 유명한 컴포넌트인데요. 매우 성능이 뛰어난 가상트리뷰 컴포넌트입니다. RAD Studio IDE에도 사용하고 있습니다.

(이미지참조: http://blog.marcocantu.com/blog/2014-december-turbopack-short-video.html)

❑ SynEdit

다양한 언어를 지원하는 구문강조(Syntax Highlight) 컴포넌트입니다. 소스코드 편집을 위한 컴포넌트입니다.

❑ Async professional

많은 것을 포함하고 있는 시리얼 포트 통신 라이브러리입니다.

❑ PowerPDF

시각적인 PDF 문서를 생성하기 위한 컴포넌트입니다.

❑ Abbrevia

압축라이브러리(PKZIP, Microsoft CAB, tar, gzip, bzip2, ...)입니다. 멀티-플랫폼(Win32, Win64, MaxOSX, iOS, Android)를 지원합니다.

❑ LockBox

암호화 라이브러리(AES, DES, 3DES, Blowfish, Twofish, SHA, MD5, ...)입니다. 멀티-플랫폼(Win32, Win64, MaxOSX, iOS, Android)를 지원합니다.

❑ 비디오로 알아보기(마르코칸투)

❑ 다운로드 및 더 알아보기

원작자의 글을 통해 더 자세히 알아보고 다운로드 할 수 있습니다.

1. Orpheus (Win32 and Win64)
2. Abbrevia (Win32, Win64, MacOSX, iOS and Android)
3. Virtual Tree (Win32 and Win64)
4. SynEdit (Win32 and Win64)
5. LockBox (Win32, Win64, MacOSX, iOS and Android)
6. Async Professional (Win32)
7. PowerPDF (Win32 and Win64)


참고 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder Open Source, Orpheus, SynEdit, Virtual Tree, XE7, 써드파트 컴포넌트, 컴포넌트

[XE7] XML DOM 벤더(MSXML, ADOM, OmniXML) 설정하기

2014.12.30 10:32

RAD Studio XE7에서는 새로운 XML DOM(Document Object Model)인 OmniXML이 추가되어 현재 총 3가지의 XML DOM을 사용할 수 있습니다.

  • MSXML
  • ADOM
  • OmniXML
XML DOM은 문자열로된 XML 데이터를 분석해 프로그래밍에서 사용할 수 있도록 구조화하는 역할을 합니다.
각 XML DOM을 비교하면 아래와 같습니다.(docwiki.embarcadero.com 참고)
구현단위전역 변수 값설명

MSXML

Xml.Win.msxmldom

SMSXML

Windows 전용, RAD Studio의 내장 XML 공급 업체 중 가장 빠름.

크로스 플랫폼에서 XML DOM 벤더를 선택하지 않으면 실행 시 런타임오류 발생.

OmniXML

Xml.omnixmldom

sOmniXmlVendor

크로스 플랫폼. ADOM보다 훨씬 빠르지 만 MSXML보다 약간 느림.

ADOM

Xml.adomxmldom

sAdom4XmlVendor

크로스 플랫폼. RAD Studio의 다른 임베디드 XML 벤더보다 느림.

결과적으로로 보면 윈도우 환경의 VCL 프로젝트에서는 MSXML을 크로스플랫폼용 FMX 프로젝트에서는 OmniXML으로 설정하는 것이 유리합니다.


XML DOM을 설정하는 방법은 TXMLDocument.DomVender를 설정하는 방법과 DefaultDOMVender로 프로젝트 전반적으로 설정하는 방법 두가지가 있습니다. 

❑ TXMLDocument.DOMVender 설정

TXMLDocument 컴포넌트의 DOMVender 속성을 설정해 해당 XML DOM 벤더의 기술을 사용합니다.

❑ DefaultDOMVender로 프로젝트 전반적으로 설정

program Project1;

uses
 System.StartUpCopy,
 FMX.Forms,
 Unit1 in 'Unit1.pas' {Form1},
 Xml.xmldom, XML.OmniXMLDom;
{$R *.res}
begin
 DefaultDOMVendor := sOmniXmlVendor;
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

Xml.xmldom 유닛을 추가하고, DefaultDOMVender에 DOM Vender 전역변수를 설정하면 이후 사용되는 컴포넌트의 DOMVender가 모두 전역으로 설정한 DOMVender로 설정됩니다.

❑ 결론

  • 윈도우 VCL 프로젝트는 MSXML을 선택, 멀티(크로스)플랫폼 FMX 프로젝트에서는 OmniXML을 선택하는 것이 유리
  • XML DOM 벤더 선택은 컴포넌트 속성을 이용하거나, DefaultDOMVender 전역변수로 프로젝트 전반에 설정 가능
    • 활용) XML 분석하는 소스코드를 VCL/FMX에서 재사용할 경우 프로젝트 소스에서 설정하면 플랫폼 별 최적의 성능으로 구현 가능

참고자료



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder Delphi, Omni XML, Rad Studio, XE7, XML DOM

XE7을 지원하는 써드파티 컴포넌트와 툴 목록(엠바카데로 제공)

2014.12.24 09:31

RAD Studio(델파이, C++빌더)은 컴포넌트 기반으로 쉽고 빠르게 개발할 수 있다는 장점이 있습니다.

기본 컴포넌트도 막강하지만 외부 컴포넌트(써드파티 컴포넌트)로 더 막강한 컴포넌트 구성할 수 있습니다.


사용가능한 컴포넌트를 세어보지 않았지만 수백가지의 컴포넌트/플러그인/보조툴이 존재하고 이를 공급하는 벤더사들도 60여개 이상입니다.


엠바카데로에서는 RAD Studio XE7을 지원하는 써드파티 파트너의 컴포넌트와 툴을 잘 정리한 페이지가 있어 소개해 드립니다. 

해당 페이지에서 필요한 컴포넌트를 찾아보시고 적용해 보시기 바랍니다.



써드파티 컴포넌트와 툴 목록


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder C++빌더, Rad Studio, XE7, 델파이, 써드파티, 컴포넌트

VCL의 유용하지만 놓칠수 있는 기능 들

2014.12.12 09:23

델파이 구루인 마르코칸투가 VCL 기능 중 놓치고 있을 법한 기능을 소개하는 글을 남겨 소개드립니다

아마 이번 코드레이지9에서 발표한 내용의 일부인 것 같습니다.


최근 VCL에 추가된 기능들도 많지만 아래와 같은 유용하지만 잘 모르고 있을 법한 기능들이 있습니다.

  • Direct2D 캔버스 - 고전적인 GDI 기반의 TCanvas와 함께 Direct2D 기반 TDirect2DCanvas 클래스를 지원합니다.
  • TImage의 WIC지원 - 다양한 포맷으로 컨버팅과 이미지의 회전등의 변환을 지원합니다.
  • VCL 컴포넌트 속성추가 - 텍스트 힌트와 숫자만 입력할 수 있도록 하는 속성등 더 다양해 졌습니다.
  • 작업대화상자(TTaskDialog) - 대화상자에서 많은 것을 표현할 수 있습니다.
  • 새로운 공통대화상자(TFileOpenDialog, TFileSaveDialog)

자세한 내용은 아래 마르코칸투의 원글에서 확인할 수 있습니다.(몇몇 항목은 샘플코드 제공합니다.)

관련 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

델파이로 국제화된 다국어 애플리케이션 만들기

2014.12.10 13:17

델파이로 제작된 VCL 애플리케이션에서 다국어(국제화, 지역화) 지원하는 방법을 안내합니다.

파이어몽키(멀티-디바이스 애플리케이션)에서는 TLang 컴포넌트를 이용해 다국어 지원할 수 있습니다.

(동영상보기: http://tech.devgear.co.kr/delphi_news/13638)


델파이에서는 화면과 코드상의 문자를 다국어로 표현할 수 있는 기능을 제공합니다.


다국어 지원을 위해서는 총 3가지 작업을 해야 합니다.

  • 다국어 지원할 언어 추가
  • 화면의 문자열 다국어 처리
  • 코드의 문자열 다국어 처리

다국어 지원할 언어 추가

델파이에서 여러분의 VCL 프로젝트를 엽니다. 저는 샘플 형태로 아래와 같은 프로젝트를 만들었습니다.

Project > Languages > Add 메뉴를 클릭하고, 여러분의 어플리케이션에서 제공할 언어를 추가합니다.

프로젝트 매니저에 해당 언어 프로젝트가 추가됩니다.(저는 영어와 일본어를 추가했습니다.), 앞으로 관리해야 할 프로젝트(언어)이므로 프로젝트 그룹으로 저장합니다.


화면 문자열 다국어 처리

화면 문자열 다국어 처리하기 위해서는 프로젝트 매니저에서 언어별 유닛(Unit1.dfm)을 더블클릭하면 아래의 화면이 표시됩니다.

3번째 컬럼은 기본언어인 한국어 그옆으로 번역상태와 번역할 언어인 영어항목을 번역할 언어로 수정합니다.(변경한 내용은 상태에  Translated로 변경)

이 과정을 지원할 언어별로 반복해 진행합니다.

만약, 화면요소가 변경된다면 Project > Languages > Update Localized Projects 메뉴를 클릭해 항목을 동기화 할 수 있습니다. 이때 기존 작업한 내용은 유지되므로 중간중간 동기화 해서 작업하기 바랍니다.


코드의 문자열 다국어 처리

문자열의 다국어 처리는 ResourceString기반으로 진행됩니다.

제가 구현한 코드는 아래와 같습니다. 버튼을 누르면 Edit1의 내용으로 이름을 표현합니다.

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Format('당신의 이름은 ''%s'' 입니다.', [Edit1.Text]));
end;

위 코드를 ResourceString기반으로 변경하려면 아래와 같이 ResourceString에 문자열을 상수와 같이 선언하고 구현시 사용하도록 변경해야 합니다.

ResourceString
  ResYourName = '당신의 이름은 ''%s'' 입니다.';

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Format(ResYourName, [Edit1.Text]));
end;

위와 같이 ResourceString으로 선언된 문자열은 프로젝트 매니저의 언어 프로젝트의 DRC.rs 파일을 이용해 번역할 수 있습니다.

리소스파일을 열면 델파이에서 출력하는 오류메시지들이 이미 등록되어 있습니다. 해당 문자열들도 원하신다면 번역할 수 있습니다. 그리고 제일 아래로 내려가면 여러분이 추가한 문자열을 번역할 수 있습니다.

[팁] 언어마다 다른 어순의 문자열 표현하기

Format을 이용하면 원하는 곳에 문자열을 포함해 사용할 수 있습니다.

하지만 어순이 달라진 경우 예를 억지로 들면 아래의 문자열의 '이름'과 '김현수' 두개의 항목을 Format으로 처리하려 하는데 번역자가 순서를 다르게 번역을 해버렸습니다.

  • 한국어 : 당신의 '이름'은 '김현수'입니다. - name_key > name_value 순으로 표시

  • 영어 : 'Humphery' is your 'name'. - name_value > name_key 순으로 표시

이 때 당황스러워 하지 마시구요. 아래와 같이 Format을 사용하면 입력할 내용의 순서를 지정할 수 있습니다. 좋은 팁이었습니다.^^

Format('당신의 ''%0:s''은 ''%1:s''입니다.', [name_key, name_value]);

Format('''%1:s'' is your ''%0:s''.', [name_key, name_value]);


다국어 지원 테스트 하기

화면과 코드의 문자열을 다국어 처리한 후 테스트하려면 Project > Languages > SetActive 메뉴를 클릭해 언어를 선택 후 해당 언어로 테스트할 수 있습니다. 

테스트 완료 후 프로젝트와 언어 프로젝트를 각각 빌드하면 아래와 같이 실행파일과 국가별 번역 리소스 파일(리소스 DLL)이 생성됩니다.(프로젝트이름 뒤의 3자는 ISO 639x 국가별 코드입니다.)

다국어로의 번역은 실행파일 실행 시 언어 리소스 DLL 선택 순서에 의해 선택된 리소스 DLL의 문자열로 화면과 코드의 문자열이 치환되어 다국어 지원됩니다.


배포를 위해 다른언어로 테스트하기 위해서는 실행파일과 언어 리소스 DLL을 별도 경로로 복사 하고,  윈도우 언어를 변경(윈도우8 언어변경: 외부글)해 테스트할 수 있습니다.

참고> 실행파일과 언어 리소스 DLL이 컴파일 경로에 있는 경우 시스템 로캐일이 적용되지 않습니다.

배포파일(실행파일, 언어 리소스 DLL)을 다른 경로로 옮겨서 테스트 해보기 바랍니다.

관련 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder C++빌더, Rad Studio, 다국어지원, 델파이

  1. Blog Icon

    비밀댓글입니다

블루투스LE(Bluetooth Low Energy)의 이해

2014.12.05 09:42

RAD Studio XE7에서는 블루투스 라이브러와 컴포넌트를 통해 클래식 블루투스와 블루투스LE(BLE) 통신이 편리해 졌습니다.


컴포넌트가 있더라고 기술의 이해가 있어야 사용하고, 프로젝트에 적용을 할 수 있는데요.

마침 델파이 개발자인 곰순이(장정환)님이 블루투스 LE 관련해 이해하기 쉽게 작성한 글이 있어 공유합니다.

앞으로도 좋은 글 많이 기대하겠습니다.

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder ble, XE7, 블루투스, 블루투스LE

[XE7] "Color to gray" 변환 알고리즘을 병렬(Parallel)로 처리하기

2014.12.02 11:56

RAD Studio XE7에 새롭게 추가된 주요 기능 중 하나인 병렬(패러럴) 컴퓨팅 라이브러리는 코드를 멀티코어 CPU를 모두 활용해 동작할 수 있도록 구현하는 기술입니다.(오브젝트 파스칼과 C++에서 데스크탑과 모바일에서 사용할 수 있습니다.)


이번 글에서는 병렬 컴퓨팅 라이브러리를 활용하는 예제를 소개합니다.

예제는 컬러이미지를 회색톤으로 변환하는 그래픽 작업에서 병렬 컴퓨팅 라이브러리를 이용해 성능을 개선합니다.

(그래픽 작업과 같이 연산이 많은 작업을 비동기로 멀티코어를 활용한다면 크게 성능개선을 할 수 있습니다.)



아래 코드와 같이 기존 코드를 손쉽게 비동기 작업으로 변환 할 수 있습니다.

기존 코드(No Parallel)

procedure ToGrayPixelsNoParallel(aBitmap: Graphics.TBitmap; cg: TColor2Grayscale = c2gLuminosity);
var w, h: integer;
begin
  if aBitmap <> nil then
    for h := 0 to aBitmap.Height - 1 do
      for w := 0 to aBitmap.Width - 1 do
        aBitmap.Canvas.Pixels[w,h] :=
          ColorToGray(aBitmap.Canvas.Pixels[w,h], cg);
end;

개선된 코드(Parallel 사용)

procedure ToGrayPixelsParallel(aBitmap: Graphics.TBitmap; cg: TColor2Grayscale = c2gLuminosity);
var h: integer;
begin
  if aBitmap <> nil then
    TParallel.For(0, aBitmap.Height-1,
      procedure(h: integer)
      var w: integer;
      begin
        for w := 0 to aBitmap.Width - 1 do
          aBitmap.Canvas.Pixels[w,h] :=
            ColorToGray(aBitmap.Canvas.Pixels[w,h], cg);
      end
    );
end;

관련 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder vcl, XE7, 병렬 컴퓨팅 라이브러리

환경파일에서 "The imported project file could not be loaded. '', hexadecimal value 0x01, is an invalid character." 오류 발생 시 조치사항

2014.11.27 16:07

델파이(or C++빌더)의 일부 버전과 환경에서 발생하는 이슈입니다.

❑ 현상

델파이 실행 후 컴파일 시 아래와 같은 오류 발생(빈 프로젝트에서도 발생)


[Fatal Error] The imported project file could not be loaded. '', hexadecimal value 0x01, is an invalid character. Line 22, position 71.  C:\Users\Clint\AppData\Roaming\Embarcadero\BDS\11.0\environment.proj

대상 버전 : RAD Studio XE ~ XE4(추정)

(발생되는 버전마다 아래의 해결방안으로 처리 가능)

❑ 원인

environment.proj(환경파일)의  DEVMGR_SHOW_DETAILS 항목에 "0X01"(SOH) 헥사값이 포함되어 오류발생



헥사값이 포함되는 이유는 

델파이에서 로딩 시 시스템 변수(DEVMGR_SHOW_DETAILS) 값을 환경파일에 기록하는데 다른 프로그램에서 시스템 변수를 덮어 씌운것으로 보입니다.


위 이유로 컴파일 시도 시 환경파일에 포함된 헥사값 때문에 오류가 발생합니다.

❑ 조치방법(해결방안)

아래의 과정으로 시스템 변수를 공백으로 재선언하면 시스템 변수가 아닌 재선언된 값이 환경변수에 저장되어 문제가 해결됩니다.

1, (Delphi IDE) 툴 옵션 창(Tools > Options) 표시

2, Envrironment Variables 메뉴선택

3, System variables에서 DEVMGR_SHOW_DETAILS 선택

4, Override System Variable 창에서 Varable value를 공백("")으로 입력 후 OK

참고글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

더 쉬운코드, 더 유연한 코드를 작성할 수 있는 현대식 문법

2014.11.03 14:42

현대식 문법

현대식 문법으로 여러분의 코드를 더 짧게, 더 쉽게, 더 유연하게 작성할 수 있습니다.

아래 간단한 문법소개와 샘플을 통해 어떤 기능을 하는지 소개합니다. 하지만, 여러분의 코드에 적용하기 위해서는 더 깊은 이해가 필요합니다. 엠바카데로 기술문서와 현대식 문법을 더 자세히 익힐 수 있는 도서를 소개해 드리니 참고하셔서 더 다양한 문법으로 더 강력한 코드를 작성해보시기 바랍니다.


11월 13일(서울), 11월 20일(대구)에 열리는 "VCL 애플리케이션을 더욱 멋지게 'Developer Direct LIVE!'" 세미나에서도 해당 내용을 직접 들어볼 수 있으니 신청하셔서 직접 들어보시다면 더 도움이 될것입니다.


❑ 타입헬퍼(Type Helper)

타입헬퍼는 클래스, 레코드, 열거형, 타입의 기능을 확장할 수 있는 문법입니다.


아래 예제와 같이 열거형의 기능을 확장하고 기존 TPicture 클래스의 기능을 확장하는 방식으로 활용할 수 있습니다.

type
  TGeoDirection = (North, East, South, West);
  // 열거형을 만자열로 변환하는 기능 추가
  TGeoDirectionHelper = record helper for TGeoDirection
    function ToString: string; inline;
  end;

  // URL 이미지를 로드하는 기능 추가
  TPictureHelper = class helper for TPicture
  public
    procedure LoadFromUrl(AUrl: string);
    procedure LoadFromUrlWithThread(AUrl: string);
  end;

function TGeoDirection.ToString: string;
begin
  case Self of
      TGeoDirection.North:  Result := '북쪽 (N)';
      TGeoDirection.East:   Result := '동쪽 (E)';
      TGeoDirection.South:  Result := '남쪽 (S)';
      TGeoDirection.West:   Result := '서쪽 (W)';
    else
      raise Exception.Create('Unknown "TGeoDirection" value');
  end;
end;

var
  Direction: TGeoDirection;
begin
  Direction := South;
  ShowMessage(Direction.ToString);

  Image1.Picture.LoadFromUrl('http://abc.com/Image.jpg');
end;

더 알아보기

❑ 제너릭(Generic)

클래스와 메소드에서 사용하는 데이터 타입을 사전에 정하지 않고 유연하게 사용할 수 있는 문법입니다.

구현 시 데이터 타입을 지정해 사용할 수 있어 하나의 클래스(메소드)를 다양한 데이터 타입으로 사용할 수 있습니다.


아래의 예제에서는 전통적인 클래스(TClassicSIPaire) 형식은 타입을 지정해 클래스를 만들고,

제너릭 클래스의 경우 TKey, TValue 두개의 타입인자를 통해 사전에 데이터 타입을 정하지 않아, 재선언(TSIPaire) 해 사용하거나 구현 시 데이터 타입 지정(KeyValue3: TPair<string, Integer>)하는 등 유연하게 사용할 수 있습니다.

type
  TClassicSIPair = class
   private
     FKey: String;
     FValue: Integer;
   public
     function GetKey: String;
     procedure SetKey(Key: String);
     function GetValue: Integer;
     procedure SetValue(Value: Integer);
     property Key: string read GetKey write SetKey;
     property Value: Integer read GetValue write SetValue;
   end;

   TPair<TKey,TValue> = class
   private
     FKey: TKey;
     FValue: TValue;
   public
     function GetKey: TKey;
     procedure SetKey(Key: TKey);
     function GetValue: TValue;
     procedure SetValue(Value: TValue);
     property Key: TKey read GetKey write SetKey;
     property Value: TValue read GetValue write SetValue;
   end;

  TSIPair = TPair<string, Intege>;
  TSSPair = TPair<string, string>;

procedure TForm1.Button1Click(Sender: TObject);
var
  KeyValue1: TClassicSIPair;
  KeyValue2: TSIPair;
  KeyValue3: TPair<string, Intege>;

  I: Integer;
  ListUser1: TObjectList;
  ListUser2: TObjectList<TUserData>;
begin
  KeyValue1 := TClassicSIPair.Create;         // 전통적인 클래스
  KeyValue2 := TSIPair.Create;                // 닫힌 생성자형식 제너릭
  KeyValue3 := TPair<string, Intege>.Create; // 열린 생성자형식 제너릭

  KeyValue1.Key := '사원번호';
  KeyValue1.Value := 123456;
  KeyValue2.Key := '사원번호';
  KeyValue3.Key := '사원번호';
  // 만약? Value 가 Integer에서 string으로 변경된다면? TClassicSSPaire 클래스를 새로 생성해야 함

  KeyValue1.Free;
  KeyValue2.Free;
  KeyValue3.Free;

  // 중략
  for I := 0 to ListUser1.Count - 1 do
  begin
    Obj := ListUser1[I];
    User := TUserData(Obj);

    Log(User.ToString);
  end;

  for User in ListUser2 do
    Log(User.ToString);
//    ListUser2.Items[0].ToString
end;

더 알아보기


❑ 익명 메소드(Anonymous Method)

메소드(procedure, function)를 변수와 파라메터 형태로 사용할 수 있는 문법입니다.


아래 예제는 3초 후에 메시지를 표시하는 기능을 익명 메소드를 통해 구현했습니다. 익명 메소드를 사용하면 원하는 로직을 변수에 저장 후 원하는 시점에 호출하는 방식등으로 사용할 수 있습니다.

// 지정된 시간 이후에 파라메터의 메소드를 실행
procedure DelayProc(ADelay: Integer; AProc: TProc);
begin
  Sleep(ADelay);
  AProc;
end;

var
  Noti: TProc;
  StrToIntFunc: TFunc<string, Integer>;
begin
  DelayProc(3000, procedure
    begin
      ShowMessage('Delay Message');
    end);

  Noti := procedure
      begin
        ShowMessage('Anonymous Method');
      end;
  Noti;

  StrToIntFunc := function(AStr: string): Integer
    begin
      Result := StrToIntDef(AStr, 0);
    end;
  ShowMessage(StrToIntFunc('100').ToString);
end;

더 알아보기


문법을 익힐 수 있는 도서

❑ 온라인 문서

엠바카데로 개발툴 온라인 도움말


❑ 도서

관련글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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