[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

[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

[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, 병렬 컴퓨팅 라이브러리

[BaaS] 데스크탑(VCL) 어플리케이션에서 특정 유저에게 GCM/APN 전송하기

2014.07.24 17:25

안녕하세요. 험프리.김현수입니다.


요즘 BaaS 코드아카데미 준비하느라 바쁘면서도 즐겁습니다. 새로운 내용을 공부하고 누군가에게 도움을 줄 수 있다는 것이 보람되네요^^(코드아카데미 참석해 주세요. 좋은 내용이 많습니다. http://tech.devgear.co.kr/404011)


이번에 소개해드릴 내용은 얼마전 어느분께서 데브기어를 통해 질문하신 내용입니다.

질문 내용은 "VCL로 푸시메시지를 브로드캐스트는 되는데 특정 사용자에게 전송 가능하느냐? "라는 질문이었습니다.


이 글을 이해하시기 위해서는  BaaS와 RAD Studio 글을 먼저 읽어보시고, 데스크탑에서 클라우드 메시지 전송 글을 선행해야 이글을 이해하시는데 도움이 많이 됩니다.

VCL 어플리케이션으로 특정 사용자에게 푸시메시지 전송

앞에서 안내해 드린 글을 데스크탑에서 클라우드 메시지 전송 보면 VCL 어플리케이션에서 Kinvey의 PushEndPoint를 이용해 브로드캐스트 메시지를 전송합니다.

특정사용자에게 전송할 때에도 PushEndPoint를 설정해 전송 할 수 있습니다. 

❑ 모바일 수신 설정(Custom Endpoint)

먼저 Kinvey에 접속해 Custom EndPoints(Addons > Business Logic > Custom Endpoints > New)를 추가합니다.

이름을 지정(저는 SpecificUsersMessage로 정했습니다.)하고, 다음의 코드를 입력하고 저장합니다.

function onRequest(request, response, modules){
    // 모듈
  var push = modules.push, 
      collectionAccess = modules.collectionAccess, 
      logger = modules.logger;
 
  // 데이터
  var iOSAps = request.body.iosaps;
  var iOSExtras = request.body.iosextras;
  var androidPayload = request.body.androidpayload;
  var username = androidPayload.username;

  if(username){
    collectionAccess.collection('user').findOne({'username': username}, function (err, user) {
      if (err) {
        logger.error('Query failed: '+ err);
      } else {
        if(user){
          // 사용자가 있으면 대상에게
          logger.info('Pushing message to ' + user.username);
          push.sendPayload(user, iOSAps, iOSExtras, androidPayload);
        } else {
          logger.error('Not found user!!(username: ' + username + ')');
        }
      }
   
      // 콜백함수 안에 있어야 합니다. 밖에 있으면 콜백함수 수행전 먼저 응답합니다.
      response.complete(200);    
    });
  } else {
    // username 미 지정 시 전체
    logger.info('Pushing message to All');
    push.broadcastPayload(iOSAps, iOSExtras, androidPayload);
  }
}

그리고 어플리케이션 제작 전 API Console을 이용해 아래의 코드로 테스트(참고)합니다.

{
  "iosaps": {
    "alert": "안녕하세요."
  }, 
  "iosextras": {
    "username": "testuser"
  }, 
  "androidpayload": {
    "username": "testuser",
    "message": "안녕하세요.",
    "title": "메시지 제목"
  }
}

위 내용 중 username 항목을 변경해 사용하시기 바랍니다.(Kinvey API 콘솔 에디터가 이상하게 복사/붙여넣기가 안되네요. 저만 그런가요? 타이핑해서 넣어서 사용하기 바랍니다.)

❑ VCL 전송 어플리케이션

앞에서 만든 EndPoints를 이용해 푸시메시지 전송하는 VCL 전송어플리케이션을 작성합니다.

VCL 폼의 디자인을 다음과 같이 대상(edtUserName) 항목을 추가하도록 수정합니다.(꼭 같을 필요는 없습니다.)

저는 전체에게 보낼지 대상을 지정할지 선택하기 위해 체크박스를 넣었습니다.


KinveyProvider의 PushEndPoint 속성에 앞에서 작성한 Custom EndPoints(SpecificUsersMessage)를 입력합니다.


메시지 전송 버튼에는 아래의 코드를 이용합니다.

var
  Data: TPushData;
begin
  Data := TPushData.Create;
  try
    Data.Message      := edtMessage.Text;
    Data.GCM.Title    := edtTitle.Text;
    Data.GCM.Message  := edtMessage.Text;

    if CheckBox1.Checked then
      Data.Extras.Add('username', edtUserName.Text);

    BackEndPush1.PushData(Data);
  finally
    Data.Free;
  end;

위 소스의 키포인트는 Data.Extras에 username을 추가하는 것입니다.

Extras 정보에 username을 추가하면 실제 전송되는 JSON 데이터에의 androidpayload와 iosextras에 username항목이 추가되고 Custom Endpoints에서 androidpayload의 username으로 특정 사용자에게 전송하도록 설정되었습니다.


BaaS를 이용하면 여러분들은 별도의 서버 준비 없이 서버기능인 백엔드 기능을 클라우드 기반의 서비스에서 이용할 수 있습니다.

한번 익혀두면 모바일 및 데스크탑에서 유용하게 사용할 수 있으니 도전해 보시기 바랍니다.



관련글

 

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

험프리.김현수 험프리.김현수 파이어몽키 APN, BAAS, Custom Endpoints, Delphi, gcm, Kinvey, vcl

델파이 물리엔진 Box2d 소개. FMX, VCL 용(오픈소스)

2014.04.22 11:11


Qianyuan Wang은 몇 년전 델파이 VCL용 2D 물리엔진을 오픈소스로 진행하였습니다.


위의 코드를 멀티플랫폼 용 Firemonkey용 소스코드로 변환되었다는 반가운 소식을 전합니다.(oDesk 엔진니어 참여)

제가 간단하게 테스트 해보니 테스트가 벅찰 정도로 다양한 샘플이 준비되어 있구요. 

별도의 라이브러리 추가 없이 소스코드만으로 구현이 가능합니다. 


여러분의 모바일 앱과 어플리케이션에 물리엔진을 장착해 보세요.


아래는 Box2d에서 제공하는 데모 목록입니다.
  • Add Pair(stress test)
  • Apply Force
  • Body Types
  • Breakable
  • Bridge
  • Bullet Test
  • Buoyancy Controller
  • Cantilever
  • Car
  • Chain
  • Character Collision
  • Collision Filtering
  • Collision Processing
  • Compound Shapes
  • Confined
  • Continuous Test
  • Convex Hull
  • Conveyor Belt
  • Distance Test
  • Dominos
  • Dynamic Tree Test
  • Edge Shapes
  • Edge Test
  • Explosion
  • Free Rope
  • Gears
  • Graviation Controller
  • Mobile
  • Mobile Balanced
  • Motors & Limits
  • One Sided Platform
  • Pin Ball
  • Poly Shapes
  • PolyCollision
  • Prismatic
  • Pulleys
  • Pyramid
  • RayCast
  • Restitution Test
  • Revolute
  • Rope In Wind
  • Rope Joint
  • Sensor Test
  • Shape Editing
  • Slider Crank
  • Sphere Stack
  • Terrain Box
  • Theo Jansen’s Walker
  • Tiles(stress test)
  • Time of Impact
  • Time of Impact2
  • Tumbler(stress test)
  • Varying Friction
  • Varying Restitution
  • Vertical Stack
  • Web
  • Wheel Joint
  • Ping Pong (Arkanoid / Breakout)



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

험프리.김현수 험프리.김현수 파이어몽키 appmethod, box2d, Delphi, Firemonkey, vcl, 소스포함, 오픈소스