Source : http://www.howto.pe.kr/zboard/zboard.php?id=delphi_tiptrick&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=946


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    edURL: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  edURL.Text := 'http://www.google.co.kr';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;

  try
    IdHTTP1.Head(edURL.Text);
    Memo1.Lines.Add('Server: ' + IdHTTP1.Response.Server);
    Memo1.Lines.Add('Connection: ' + IdHTTP1.Response.Connection);
    Memo1.Lines.Add('CacheControl: ' + IdHTTP1.Response.CacheControl);
    Memo1.Lines.Add('Location: ' + IdHTTP1.Response.Location);
    Memo1.Lines.Add('ContentLength: ' + IntToStr(IdHTTP1.Response.ContentLength)); // 파일 크기
    Memo1.Lines.Add('ContentEncoding: ' + IdHTTP1.Response.ContentEncoding);
    Memo1.Lines.Add('ContentLanguage: ' + IdHTTP1.Response.ContentLanguage);
    Memo1.Lines.Add('ContentType: ' + IdHTTP1.Response.ContentType);
    Memo1.Lines.Add('ContentVersion: ' + IdHTTP1.Response.ContentVersion);
    Memo1.Lines.Add('ResponseText: ' + IdHTTP1.Response.ResponseText);
    Memo1.Lines.Add('CustomHeaders: ' + IdHTTP1.Response.CustomHeaders.Text);
    Memo1.Lines.Add('ProxyConnection: ' + IdHTTP1.Response.ProxyConnection);
    Memo1.Lines.Add('ProxyAuthenticate: ' + IdHTTP1.Response.ProxyAuthenticate.Text);
    Memo1.Lines.Add('WWWAuthenticate: ' + IdHTTP1.Response.WWWAuthenticate.Text);

    // IdHTTP.Response 의 프러퍼티중 일부 파싱을 잘못하여 정보가 들어있지 않은 경우나
    // 최신의 Indy 컴포넌트가 아니어서 Response.LastModified 가 없는경우는
    // 직접 Response.RawHeaders 를 읽어 정보를 알아낼 수 있다 
    //Memo1.Lines.Add('LastModified: ' + IdHTTP1.Response.LastModified);
    Memo1.Lines.Add('RawHeaders: ' + IdHTTP1.Response.RawHeaders.Text);
  except on E: Exception do
    Memo1.Lines.Add(E.Message);
  end;
end;

end.


신고

Source : http://cafe.naver.com/gisdev.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=500

 

 

clip_image001

예제는 Flex로 Google Maps Flash(*.swf)을 만들어 html로 호출 함수를 만들어 델파이가 구글맵을 제어하는 예제입니다.

SWF <-> Html <-> delphi
구글맵의 위치정보 읽음, 구글맵의 위치 이동, 주소찾기, 맵 형식 바꾸기, 포인트 생성, 배열로 라인/폴리곤 생성, 객체의 힌트 창 이벤트 만들기, 레이어로 구분하여 끄고 켜기 토글로 보기 등 입니다.

첩부 파일에는 GoogleMapsFlexSource와 GoogleMaps.html 소스와 델파이 소스가 있습니다.
그 중 서로 호출하는 폴리곤 그리는 예제를 설명합니다.
1. 먼저 Flex로 Google Maps Flash(*.swf)

먼전 포인트 배열을 담을 전역변수 선언
public var latlngsArray:Array = new Array();
배열을 지우고, 포인트를 추가하는 소스
public function FlashActionSetlatlngArray(lat : Number, lng : Number):void
{
var latlng:LatLng=new LatLng(lat, lng);
   latlngsArray.push(latlng);        
}
public function FlashActionClearlatlngArray():void
{
  latlngsArray.length = 0;        
}
배열을 읽고 폴리곤을 생성하는 소스(색상과 선 굵기, 투명도, 객체이름, 레이어 이름을 받아 만듭니다)
public function FlashActionCreatePolygon(setcolorLine : Number, setcolorFill : Number, setthickness : Number, setalpha : Number, sData : String, sLayerName : String):void
{
//폴리곤 생성
var polygonOptions:PolygonOptions = new PolygonOptions({
               strokeStyle: new StrokeStyle({
                   color: setcolorLine,
                   thickness: setthickness,
                   alpha: setalpha}),
               fillStyle: new FillStyle({
                   color: setcolorFill,
                   alpha: setalpha})
  });
var polygon:Polygon = new Polygon(latlngsArray, polygonOptions);
//객체정보가 있으면 힌트 보임
if (sData != ""){        
     polygonOptions.tooltip=sData;
  };
//객체 선택시 토글 색상 변경
  oldAlphaValue=setalpha;
  newAlphaValue=setalpha;    
  polygon.addEventListener(MapMouseEvent.CLICK, function(e:MapMouseEvent):void{     changePolygonAlpha(polygon);});
//구글맵에 객체 추가
  map.addOverlay(polygon);
//레이어에 객체 추가(레이어별 관리시 사용)
  categories.push({"LayerName": sLayerName, "LayerType": "polygon", "LayerObjects": polygon});        
}

//마지막으로 html에서 사용 하도록 선언합니다

ExternalInterface.addCallback("FlashActionSetlatlngArray", FlashActionSetlatlngArray);
ExternalInterface.addCallback("FlashActionClearlatlngArray", FlashActionClearlatlngArray);
ExternalInterface.addCallback("FlashActionCreatePolygon", FlashActionCreatePolygon);

2. Html에 함수 연계 부분 코딩
<!--CodeS-->
배열을 지우고, 포인트를 추가하는 소스
function SetPointsArray(lat, lng)
        {        
var flash = document.getElementById("GoogleMaps");
              flash.FlashActionSetlatlngArray(lat, lng);
        }
function SetPointsArrayClear()
        {        
var flash = document.getElementById("GoogleMaps");
              flash.FlashActionClearlatlngArray();
        }
폴리곤 생성 호출
function FlashActionCreatePolygon(setcolorLine, setcolorFill, setthickness, setalpha, sdata, sLayerName)
        {        
var flash = document.getElementById("GoogleMaps");
              flash.FlashActionCreatePolygon(setcolorLine, setcolorFill, setthickness, setalpha, sdata, sLayerName);
        }

3.델파이에서 Html함수 호출

procedure TForm1.Button3Click(Sender: TObject);
var
  StrResult: string;
  lat1, lng1 : Double;
begin
if (WebBrowserGoogleEarth.Document2 <> nil) and (WebBrowserGoogleEarth.Document2.readyState = 'complete') then begin
     StrResult :='SetPointsArrayClear();';
     WebBrowserGoogleEarth.ExecJScript(StrResult);
     lat1 := 37.560327;
     lng1 := 126.950185;
     StrResult :=Format('SetPointsArray(%g, %g);', [lat1, lng1]);
     WebBrowserGoogleEarth.ExecJScript(StrResult);
     lat1 := 37.6;
     lng1 := 126.8;
     StrResult :=Format('SetPointsArray(%g, %g);', [lat1, lng1]);
     WebBrowserGoogleEarth.ExecJScript(StrResult);
     lat1 := 37.7;
     lng1 := 126.9;
     StrResult :=Format('SetPointsArray(%g, %g);', [lat1, lng1]);
     WebBrowserGoogleEarth.ExecJScript(StrResult);
     StrResult := Format('FlashActionCreatePolygon("%s","%s",%d,%g,"%s","%s");', ['0xff0000', '0xff0000',1,0.7, 'Test Polyline','Polyline Layer']);
     WebBrowserGoogleEarth.ExecJScript(StrResult);
end;
end;

신고

이슭님이 만들어달래서 한번 만들어봤습니다만..


제대로 작동하는지는 모르겠네여..


음.. 이걸 좀 제대로 다듬어 주실분 계시면 좋겠는데..


소스코드까지 첨부했습니다..



개발환경 : 델파이7...

작업시간 : 대략 1시간 가량..



autoime.7z


신고

Delphi7에서 해봄.


D7_HelloWorld.7z


신고

'Application > Delphi' 카테고리의 다른 글

Google Maps Flash(*.swf)을 이용한 예제입니다  (0) 2011.03.21
Auto IME  (0) 2010.11.26
Hello, World  (0) 2010.09.03
한글이 조합중인지 확인하려면  (0) 2010.07.13
IDE에서 Run으로 실행중인지 여부를 확인하려면  (0) 2010.07.13
델파이의 연산자  (0) 2010.01.29

출처 : http://blog.devgear.co.kr/imp/entry/한글이-조합중인지-확인하려면


TEdit나 TMemo 등의 컴포넌트에서 현재 한글이 조합중인지 확인하려고 하니 마땅한 함수가 없더군요. 그래서 Win32 SDK의 IME 관련 함수들을 뒤져서 이 목적으로 적당히 쓸만한 함수를 하나 만들어봤습니다. (윈도우 IME의 버그를 추적하면서 이것저것 테스트해보느라 만들었습니다)

아래 IsInComposition 함수를 호출하면서 인자로 해당 에디트나 메모의 핸들을 넘겨주면 됩니다. 조합중일 경우 true, 조합중이 아닌 경우 false를 리턴합니다.

아래 함수의 핵심은 IME 관련 Win32 함수인 Imm32GetCompositionString 함수인데, 이 함수는 원래는 조합중인 글자를 알아내는 함수이구요. 이 함수의 리턴 값이 조합중인 글자의 길이입니다. 따라서 조합중인 글자가 없을 경우 당연히 0이 리턴되겠죠.

uses imm;

function IsInComposition(hWnd: HWND): boolean;
var
  H: HIMC;
  buff: array[0..1] of char;
  len: integer;
begin
  result := false;
  H := Imm32GetContext(hWnd);
  if H <> 0 then
  begin
    len := Imm32GetCompositionString(H, GCS_COMPSTR, @buff, 2);
    result := len > 0;
    Imm32ReleaseContext(hWnd, H);
  end;
end;

델파이 2010과 2009에서만 테스트해봤는데, 뭐 코드로 봐서는 그 이전 버전이라도 제대로 동작하지 않을 이유는 없을 거 같네요.

저처럼 IME 기능을 추적하는 용도 이외에 이런 함수를 쓸 일이 있을지는 잘 모르겠지만... ^^;;;;

신고

출처 : http://blog.devgear.co.kr/imp/entry/IDE에서-Run으로-실행중인지-여부를-확인하려면


델파이나 C++빌더의 IDE 안에서 프로젝트를 Run으로 실행시킨 경우인지 여부를 코드에서 확인해야 할 경우가 있습니다. 물론, 컴파일된 모드가 디버그 모드인지 릴리즈 모드인지를 확인하기 위해서는 컴파일러 디렉티브 _DEBUG를 쓰면 되는데요.

디버그 모드로 컴파일되어있는지가 아니라 IDE 안에서 Run으로 실행된 경우, 즉 현재 디버깅 진행중인지를 알아내려면 전역변수 DebugHook의 값을 검사하면 됩니다. 이 DebugHook의 값이 0보다 크면 디버깅 중인 것입니다.

델파이라면...
procedure TForm1.Button1Click(Sender: TObject);
begin
  if DebugHook>0 then
    ShowMessage('디버깅 중입니다.');
end;

C++빌더라면...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if(DebugHook>0)
    ShowMessage("디버깅 중입니다.");
}

참고로 이 DebugHook 전역변수는 System.pas에 정의되어 있습니다. 델파이3와 C++빌더3 이상의 모든 버전에서 사용하실 수 있습니다.

신고
Source : http://wwwi.tistory.com/136



프로그램 중에 연산자를 사용해서 데이터를 조작할 수 있다.
연산자에는 아래와 같은 연산자들이 있다.


■?대입 연산자

대입은 = 가 아니라 := 이다.
=앞에 반드시 콜론을 붙인다.
= 는 비교연산자로 쓰인다.

사용예
X := 99;

산술 연산자

산술연산자는 수치 연산을 위한 연산자이다.










































기호 의미
+ 더하기 Y := X + 1;
- 빼기 Y := X - 1;
* 곱하기 Y := 3.14 * X;
/ 실수 나누기 Y := X / 3.14;
div 정수 나누기 K := N div 2;
mod 나머지 N := M mod 2;


■?비트 연산자

비트 연사자는 정수형의 변수의 비트를 조작할 때 사용한다.







































기호 의미
or 논리합 M := N or $8000;
and 논리곱 M := N and $FF;
xor 배타적 논리합 M := N xor $FFFF;
shr 오른쪽 쉬프트 M := N shr 1;
shl 왼쪽 쉬프트 M := N shl 1;
not 부정 M := not N;


■?관계 연산자

관계연산자는 비교를 할때 사용한다.
보통 if문과 함께 사용한다.
C에서는 같은지르 비교할때는 == 을 사용하지만 델파이에서는 = 을 사용한다.


사용예

if nDat > 0 then
begin
nDat := nDat * 20;
nRet := funA(nDat);
end;

■?논리 연산자

논리 연산자는 Boolean형의 변수에 대해 사용한다.





























기호 의미
or 논리합 F := F1 or? F2;
and 논리곱 F := F1 and F2;
xor 배타적 논리합 F := F xor True;
not 부정 F := not F1;


■?어드레스 연산자

어드레스 연산자는 @를 사용하면 변수나 프로시져, 펑션, 메소드의 어드레스를 얻을 수있다.
결국 이런 것들에 @를 붙이면 이것들에 포인터가 된다.


사용예

var
nDat: Integer;
pnDat: ^Integer;

begin
...
pnDat := @nDat;
...
end;

■?집합 연산자

집합 연산자 in 은 어떤 값이 집합의 멤버인지 아닌지를 판달할 때 사용한다.

사용예

if ItemA in SetA then
begin
...
end;

또는 <=, =>, = 는 집합의 비교에 사용한다.
예를 들면 A가 B에 포함되는지 아닌지를 판단할때는 A <= B로 쓴다.

■?문자열 연산자

문자열을 붙여 쓸때 + 를 사용한다.

사용예

Str := Str1 + ' # ' + Str2;

비교연산자 <, >, <=, =>, =, <> 는 문자 코드 순에 따라서 문자열을 비교한다.
문자열 주작은 이밖에도 많은 문자열 조작 함수를 사용한다.

◆?연산자 우선순위

연산자의 우선순위는 아래와 같다.
























연산자 우선순위
@,not,^,- 1(높음)
*,/,div,mod,and,shl,shr 2
+,-,or,xor 3
=,<>,<,>,<=,>=,in 4(낮음)

신고

Source : http://edn.embarcadero.com/article/38454

 

유니코드는 무엇인가, 왜 필요한가, 델파이에서는 어떻게 사용하는가?

By: Beomyong Park

Abstract: 이 아티클은 유니코드 (Unicode)에 대해 논합니다, 델파이 개발자들이 유니코드를 사용함으로써 어떻게 장점을 취할 수 있는가 그리고 유니코드는 델파이 2009에서 어떻게 구현되는가에 대한 내용입니다

도입

인터넷은 지리적인 장벽을 허물고 소프트웨어의 범세계적인 보급을 가능하게 하였습니다. 그 결과 어플리케이션은 더 이상 순수 ANSI 기반 환경에만 머물 수 없게 되었습니다. 세상은 텍스트와 데이터 전달을 위한 표준 수단으로 유니코드를 받아들였습니다. 유니코드가 사실상 모든 기록 시스템에 지원을 제공한 이후, 유니코드는 이제 글로벌 기술 생태계 전반에 걸친 표준이 되었습니다.

유니코드(Unicode) 란?

유니코드 는 문자 인코딩 방법으로서 사실상 모든 문자가 단일 문자셋으로 인코딩될 수 있도록 합니다. 유니코드는 컴퓨터로 하여금 세상의 기록 시스템 대부분에서 텍스트를 관리하고 표시할 수 있도록 해줍니다. 유니코드는 유니코드 컨소시엄 이 관리하며 표준으로 성문화 되어 있습니다. 쉽게 말하자면, 유니코드는 모든 사람들이 서로의 문자를 사용할 수 있도록 하기 위한 시스템입니다. 이런, 심지어 클링온을 위한 유니코드 버전 까지 있습니다.

이 아티클 시리즈는 여러분에게 유니코드가 정확히 무엇이고 어떻게 작동하는 가에 대해 전체적으로 파고드는 내용을 전달하기 위함이 아니라 여러분이 델파이 2009 안에서 유니코드를 사용할 수 있도록 안내하고자 작성되었습니다. 만약 유니코드에 대한 좋은 오버뷰를 원하신다면, 조엘 스폴스키(Joel Spolsky)의 훌륭한 아티클인 “The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)”를 읽어 보실 것을 강력히 권장합니다. 조엘이 분명히 지적한 바와 같이 “이것은 그다지 어렵지 않습니다” 이 아티클은 전 3편 중 첫번째이며 유니코드가 왜 중요하고 델파이에서 새로운 유니코드스트링 타입을 어떻게 구현할 것인가에 대해 서술합니다.

왜 유니코드 인가?

델파이 2009의 많은 새로운 기능은 제품 전반에 걸친 유니코드에 있습니다. 델파이의 디펄트 스트링은 이제 유니코드 기반 스트링입니다. 델파이가 주로 델파이로 구축 되었기 때문에 델파이 IDE, 델파이 컴파일러, RTL, VCL는 이제 모두가 완전히 유니코드를 지원합니다.

델파이가 유니코드로 옮겨가는 것은 자연스러운 결과 입니다. 윈도우 자체가 완전히 유니코드를 인식하므로 유니코드를 디펄트 스트링으로 사용하는 것이 가장 자연스러운 것입니다. 그리고 델파이 개발자들에게 이 장점은 단순히 윈도우와 같은 스트링 타입을 사용할 수 있다는 것에서 멈추지 않습니다.

유니코드 지원은 델파이 개발자들에게 커다란 기회를 제공합니다. 델파이 개발자들은 이제 유니코드 데이터를 읽고 쓰고 받아들이고 생산하고 표시하고 다룰 수 있습니다. ? 그리고 이것은 모두 제품으로 구축됩니다. 아주 조금만, 일부의 경우 코드를 전혀 변경하지 않아도 여러분의 어플리케이션은 여러분과 여러분의 고객 또는 최종 사용자가 던질 수 있는 모든 종류의 데이터를 인식할 수 있게 됩니다.

예전에는 ANSI 로 인코딩된 데이터에만 제한 되었던 어플리케이션이 이제는 세상의 거의 모든 문자셋을 다룰 수 있도록 쉽게 변화될 수 있습니다.

델파이 개발자들은 이제 자신들의 어플리케이션을 글로벌 마켓에 제공할 수 있습니다 ? 비록 개발자들이 자신들의 어플리케이션을 지역화하거나 국제화 하기 위한 특별한 작업을 하지 않아도 그렇습니다. 윈도우 자체는 많은 서로 다른 지역화된 버전을 지원합니다, 그리고 델파이 어플리케이션은 일본어, 중국어 그리스어, 러이사어 버전의 윈도우와 같이 많은 로케일의 윈도우 상에서 작동하는 컴퓨터에서 적합하게 작동될 필요가 있습니다. 여러분의 소프트웨어를 사용하는 사용자는 여러분의 어플리케이션에 ANSI가 아닌 텍스트를 입력하거나 또는 ANSI가 아닌 경로명을 사용할 수 있습니다. ANSI 기반의 어플리케이션은 이러한 시나리오 상에서는 항상 의도된 대로 동작하지 않습니다. 완전히 유니코드를 지원하는 델파이에서 구축된 윈도우 어플리케이션은 이러한 상황을 잘 다루고 작동합니다. 비록 여러분이 여러분의 어플리케이션을 다른 나라 언어로 번역할 필요가 없더라도 여러분의 어플리케이션은 항상 올바르게 동작할 수 있어야 합니다. ? 최종 사용자의 로케일이 무엇이든지 상관없이 그래야 합니다.

현재의 ANSI 기반 델파이 어플리케이션은 이제 어플리케이션 지역화의 기회와 유니코드 기반 시장으로 가는 잠재력은 매우 큽니다. 그리고 만약 여러분이 여러분의 어플리케이션을 지역화 하기를 원하는 경우 델파이는 매우 쉽게 특히 디자인 타임에 매우 쉽습니다. ITE (Integrated Translation Environment)를 통해 여러분은 바로 IDE 안에서 번역하고 컴파일하고 배포할 수 있습니다. 만약 외부 번역 서비스가 필요하다면 IDE는 여러분의 프로젝트를 익스포트하여 번역자들이 사용할 수 있는 형태로 배포할 수 있는 ETM(External Translation Manger)과 관련하여 사용할 수 있습니다. 이 툴들은 델파이 IDE와 함께 작동하며 델파이와 C++빌더가 여러분의 어플리케이션을 지역화 하는 것을 부드럽고 쉽게 진행하게 합니다.

세상은 유니코드 기반입니다. 이제 델파이 개발자들은 본질적이고 유기적인 방식으로 이 세상의 일부가 될 수 있습니다. 따라서 여러분이 유니코드 데이터를 다루고 싶거나 여러분의 어플리케이션을 떠오르는 글로벌 시작에 판매하고자 한다면 델파이 2009를 가지고 할 수 있게 됩니다

용어에 대한 한마디

유니코드는 몇 개의 새로운 용어의 사용을 촉진합니다 예를 들어 “문자(character)”의 개념은 유니코드의 세상에서는 여러분이 사용하던 것보다 다소 부정확합니다. 유니코드에서 보다 정교한 용어는 “코드포인트(code point)”입니다. 델파이 2009에서 SizeOf(Char)는 2입니다. 하지만 이것이 전체 이야기를 말하지는 않습니다. 인코딩에 따라 주어진 문자가 2 바이트 이상을 차지할 수도 있습니다. 이러한 시퀀스를 “써로게이트 페어(Surrogate Pairs)”라고 합니다. 따라서 코드 포인트는 Unicode.org에서 정의한 고유한 코드 요소 입니다. 대부분 주로 “문자(character)이지만 항상 그렇지는 않습니다.

유니코드와 관련하여 여러분이 보게 될 또 다른 용어는 “BOM(Bype Order Mark)”입니다. 이것은 텍스트 파일의 인코딩에 사용된 타입을 가리키기 위해 텍스트 파일 앞부분에 위치한 매우 짧은 접두어 입니다. MSDN에 BOM 무엇인가에 대한 멋진 아티클 이 있습니다. 새로운 TEncoding 클래스 (2편에 거론 될 것입니다) 는 GetPreamble이라고 하는 클래스를 가지고 있어서 주어진 인코딩에 대한 BOM을 리턴합니다.

이제 모든 것이 설명되었으므로, 우리는 델파이 2009가 어떻게 유니코드 기반 스트링을 구현하는 지를 살펴볼 것입니다..

새로운 유니코드스트링 타입

델파이 2009의 디펄트 스트링은 새로운 UnicodeString 타입 입니다. 디펄트로, UnicodeString 타입은 윈도우에서 사용되는 것과 동일한 인코딩인 UTF-16과 밀접한 관계를 갖습니다. 이것이 디펄트 타입이 AnsiString 이었던 이전 버전과 달라진 점입니다. 과거 델파이 RTL은 유니코드 데이터를 다루기 위해 WideString 타입을 포함하고 있었습니다. 하지만 이 타입은 AnsiString 타입 일 때 고려되지 않습니다. 따라서 이제는 델파이 개발자들이 기대하는 디펄트 스트링으로 기대하는 만큼 완전하지 않습니다.

델파이 2009에서 새로운 UnicodString 타입이 새로 고안되었으며 AnsiString과 WideString 타입 모두를 관장합니다. UnicodeString은 유니코드 사이즈 문자 뿐만 아니라 ANSI 바이트 사이즈의 문자 모두를 담을 수 있습니다. (AnsiString과 WideString 모두 여전히 남아 있다는 것을 알아 두세요) Char과 PChar 타입은 각각 WideChar와 PWideChar에 대응될 것입니다. 또한 어떠한 string 타입도 사라지지 않는다는 점에 유의하세요. 개발자들이 지금껏 사용한 모든 타입이 여전히 존재하고 예전과 동일하게 동작합니다.

하지만, 델파이 2009에서 디펄트 스트링 타입은 UnicodeString과 동일 할 것입니다. 게다가 디펄트 Char 타입은 WideChar이고 디펄트 PChar 타입은 PWideChar 입니다.

즉, 다음의 코드가 컴파일러에 의해 선언됩니다:

type


  string = UnicodeString;


  Char = WideChar;


  PChar = PWideChar;


UnicodeString 은 모든 다른 스트링 타입들과 할당 호환됩니다; 하지만, AnsiString과 UnicodeString 사이의 할당은 적절한 타입 컨버전이 이루어 집니다. 따라서 UnicodeString 타입을 AnsiString 타입에 할당하는 것은 데이터 손실을 유발할 수 있습니다. 즉, 만약 UnicodeSting이 고순위 바이트 데이터를 포함하고 있다면 해당 스트링을 AnsiString으로 컨버전 하는 것은 고순위 바이트 데이터의 손실을 유발할 것입니다.



여기에서 유념해야 할 중요한 점은 새로운 UnicodeString은 스트링이 항상 가졌던 것과 거의 같이 동작한다는 것입니다. (물론 유니코드 데이터를 수용할 수 있다는 커다란 차이가 있습니다만). 여러분은 여전히 어떠한 스트링 데이터도 추가할 수 있습니다. 인덱스를 할 수 있고 ‘+’ 를 이용하여 스트링을 합칠 수도 있습니다.



예를 들어 UnicodeString의 인스턴스는 여전히 문자를 인덱스 할 수 있습니다. 다음의 코드를 보세요:



 var


   MyChar: Char;


   MyString: string;


 begin


   MyString := ‘This is a string’;


   MyChar := MyString[1];


 end;


변수 MyChar는 여전히 첫번째 인덱스에 있는 문자를 잡습니다. 즉 ‘T’입니다. 이러한 코드의 기능은 전혀 변경되지 않았습니다. 유사하게 우리가 만약 유니코드 데이터를 다룬다면:



 var


   MyChar: Char;


   MyString: string;


 begin


   MyString := ‘世界?好‘;


   MyChar := MyString[1];


 end;


변수 MyChar는 여전히 첫번째 인덱스에 있는 문자를 잡습니다. 즉 ‘世 입니다.



RTL은 핼퍼 함수를 제공하여 사용자들이 코드페이지 사이에서 명시적인 컨버전과 엘리먼트 사이즈 컨버전을 허용합니다. 만약 사용자가 문자 배열에서 Move 함수를 사용한다면, 엘리먼트 사이즈에 대해 가정을 할 수 없습니다.



여러분이 상상할 수 있듯이 이 새로운 스트링 타입은 기존 코드에 파생 효과가 있습니다. 유니코드에서 하나의 Char가 1 바이트라는 것은 더 이상 참(true)이 아닙니다. 사실, 하나의 Char 가 2 바이트와 같다는 것도 항상 참일 수는 없습니다! 그 결과 여러분은 여러분의 코드에 몇가지 보정을 해야할 수도 있습니다. 하지만, 우리는 이러한 전이가 부드럽게 되도록 많이 노력하였습니다, 그 결과 여러분이 완전하게 그리고 빠르게 구동할 수 있을 것이라고 확신합니다. 2편과 3편은 새 UnicodeString 타입에 대해 더 깊이 논할 것이며 유니코드를 지원하는 RTL의 새 기능에 대해 이야기 할 것입니다. 그리고 나서 여러분이 자신의 코드를 살펴 보기를 원할 특정 코딩 이디엄을 논할 것입니다. 이 시리즈는 여러분이 부드럽게 그리고 고통 없은 시도를 통해 유니코드로 전이하는 것을 도울 것입니다.



결론



유니코드를 디펄트 스트링으로 하는 것에 더불어, 델파이는 사실상 세상의 모든 문자와 코드 페이지를 수용하고, 처리하고 표시할 수 있습니다. 여러분이 델파이 2009로 구축한 어플리케이션은 유니코드 텍스트를 쉽게 받아들이고 표시하고 다룰 수 있을 것이며 거의 모든 윈도우 로케일에서 훨씬 잘 동작할 것입니다. 델파이 개발자들은 이제 자신의 어플리케이션을 쉽게 지역화하고 번역할 수 있게 되므로 예전에 진입하기 어려웠던 시장에 들어갈 수 있습니다. 이제는 유니코드의 세상입니다. 그리고 이제 여러분의 델파이 어플리케이션은 유니코드 세상에서 살 수 있게 됩니다.



2편에서는 여러분이 유니코드 스트링을 쉽게 작업할 수 있도록 델파이 런타임 라이브러리의 변화와 업데이트에 대해 논할 것입니다.

신고

Source : http://hbesthee.tistory.com/

 

델파이에서 이미지를 자주 다룬다면 Graphics32 패키지를 대부분 사용하고 있을 겁니다.
하지만, 2007년 3월 이후 더 이상의 버전 업그레이드가 없어 BDS 2010을 제대로 지원하지 않고 있습니다.
2010에 완벽하게 포팅된 버전을 기다리며 일단은 현재까지 나온 1.8.3 패키지를 약간 수정하여 2010에서 사용하는 방법에 대하여 설명하고자 합니다.
1.8.3 버전에서 BDS 2006 설치까지는 패키지 파일이 지원되어 바로 GR32 컴포넌트들의 등록이 가능합니다.
2010에서 사용하기 위해서는 약간의 정이 필요한데 수정이 필요한 부분은 아래와 같습니다.
먼저 GR32_BDS2006.dpk 파일을 복사하여 GR32_BDS2010.dpk 파일을 하나 만듭니다. 그리고 아래 부분을 수정합니다.
GR32_BDS2010.dpk

package GR32_BDS2010
// ....

마찬가지로 GR32_DSGN_D2006.dpk 파일을 복사하여 GR32_DSGN_D2010.dpk 파일을 하나 만듭니다. 그리고 아래 부분을 수정합니다.
GR32_DSGN_D2010.dpk

package GR32_DSGN_D2010
// ....
requires
  designide,
  vcl,
  rtl,
GR32_BDS2010;
// ....

마지막으로 GR32.inc 파일을 열어서 다음 부분을 첫 부분에 추가해 줍니다.
GR32.inc

{$IFDEF VER210}
  {$DEFINE INLININGSUPPORTED}
  {$DEFINE COMPILER2010}
  {$DEFINE COMPILER2009}
  {$DEFINE COMPILER2007}
  {$DEFINE COMPILER2006}
  {$DEFINE COMPILER2005}
  {$DEFINE COMPILER7}
  {$DEFINE COMPILER6}
  {$DEFINE COMPILER5}
  {$DEFINE COMPILER4}
  {$IFNDEF BCB}
    {$DEFINE DELPHI2010}
  {$ELSE}
    {$DEFINE BCB7}
  {$ENDIF}
{$ENDIF}

{$IFDEF VER200}
  {$DEFINE INLININGSUPPORTED}
  {$DEFINE COMPILER2009}
  {$DEFINE COMPILER2007}
  {$DEFINE COMPILER2006}
  {$DEFINE COMPILER2005}
  {$DEFINE COMPILER7}
  {$DEFINE COMPILER6}
  {$DEFINE COMPILER5}
  {$DEFINE COMPILER4}
  {$IFNDEF BCB}
    {$DEFINE DELPHI2009}
  {$ELSE}
    {$DEFINE BCB7}
  {$ENDIF}
{$ENDIF}

{$IFDEF VER185}
  {$DEFINE INLININGSUPPORTED}
  {$DEFINE COMPILER2007}
  {$DEFINE COMPILER2006}
  {$DEFINE COMPILER2005}
  {$DEFINE COMPILER7}
  {$DEFINE COMPILER6}
  {$DEFINE COMPILER5}
  {$DEFINE COMPILER4}
  {$IFNDEF BCB}
    {$DEFINE DELPHI2007}
  {$ELSE}
    {$DEFINE BCB7}
  {$ENDIF}
{$ENDIF}

//// ^^^ 위에 소스부분을 추가해줍니다.

{$IFDEF VER180}
  {$DEFINE INLININGSUPPORTED}
  {$DEFINE COMPILER2006}
  {$DEFINE COMPILER2005}
  {$DEFINE COMPILER7}
  {$DEFINE COMPILER6}
  {$DEFINE COMPILER5}
  {$DEFINE COMPILER4}
  {$IFNDEF BCB}
    {$DEFINE DELPHI2006}
  {$ELSE}
    {$DEFINE BCB7}
  {$ENDIF}
{$ENDIF}

 

위와 같이 소스들의 수정이 끝나면 런타임 패키지를 빌드하고, 디자인타임 패키지를 설치하면 다음과 같이 2010에서 등록된 Graphics32 컴포넌트들을 확인하실 수 있습니다.

Array

신고
Source : http://cafe.naver.com/codeway



Chapter 2

초간단 채팅 클라이언트 작성

본 강좌는 “델파이로 만드는 네트워킹 게임”을 목적으로 작성하던 것을 다시 수정 보안하여 만들어 가고 있는 것입니다.

네트워킹의 기본적인 기술 및 지식은 설명하지 않을 생각입니다. 이러한 기본 정보가 필요하신 분들은 네트워킹에 관한 인터넷 자료나 서적을 미리 한 번 읽어보시길 권장합니다.

우선은 채팅 프로그램을 작성하면서 델파이로 작성되는 네트워킹 프로그램의 기본적인 개념을 단계별로 설명하고, 추후 게임까지 연장해 보도록 하겠습니다.

http://cafe.naver.com/codeway 로 가시면 부족하지만 그 동안의 작업들을 보실 수 있습니다.

2004년 2월 25일, 류종택 드림.



본 강좌에서 사용되는 콤포넌트는 Indy 콤포넌트 입니다. http://www.nevrona.com/indy 로 가시면 해당 콤포넌트에 대한 상세한 정보를 얻으실 수 있습니다. 이 강좌에서는 인디 콤포넌트 중에서도 TCP/IP 통신용 콤포넌트를 중심으로 설명하게 됩니다.

l 강좌 대상 : 델파이로 네트워킹(소켓) 프로그래밍을 처음 해보시는 분

l 강좌 목적

- C/S (클라이언트/서버) 방식의 1:n 네트워킹 프로그램의 개념적 이해

- Indy 콤포넌트의 TCP/IP 콤포넌트의 기본적인 사용 방법 연습

프로퍼티 설정

Array

[그림 2.1] 메인폼(TForm1)

1: object Form1: TForm1
2: Width = 580
3: Height = 340
4:
5: object Panel1: TPanel
6:   Align = alBottom
7:   BevelOuter = bvNone
8:
9: object edUserName: TEdit
10: Left = 8
11: Top = 8
12: Width = 121
13: Height = 21
14: Text = '
15: end
16: object edMsg: TEdit
17: Left = 136
18: Top = 8
19: Width = 345
20: Height = 21
21: Text = '
22: OnKeyPress = edMsgKeyPress
23: end
24: object Button1: TButton
25: Left = 494
26: Top = 8
27: Width = 75
28: Height = 25
29: Anchors = [akTop, akRight]
30: Caption = '??¼?'
31: OnClick = Button1Click
32: end
33: end
34:
35: object moMsg: TMemo
36: Align = alClient
37: ReadOnly = True
38: end
39:
40: object IdTCPClient1: TIdTCPClient
41: Host = '127.0.0.1'
42: Port = 1234
43: end
44:
45: object IdAntiFreeze1: TIdAntiFreeze
46: end
47:
48: object Timer1: TTimer
49: Interval = 300
50: OnTimer = Timer1Timer
51: end
52:
53: end


전반적인 프로퍼티 설정 방법 및 순서는 동영상 자료를 참고하시기 바랍니다. (http://cafe.naver.com/codeway)

22: 라인에서 사용자가 대화 내용을 입력하고 엔터키를 치면 대화내용을 서버로 전송하기 위해 키가 눌려질 때 발생하는 이벤트를 사용하였습니다. 이벤트 핸들러에서는 눌러진 키가 엔터키일 경우에는 서버로 메시지를 전달하고 현재 대화내용은 다음 대화내용을 작성하기 위해 공백으로 바꿔버리도록 코딩하기로 하겠습니다.

31: 라인에서는 채팅을 하기 위해 서버에 접속하기 위한 버턴이 클릭되었을 때 실행될 이벤트를 사용하였습니다. 이후 버턴이 눌러지면 서버로 접속하도록 코딩하겠습니다.

37: 라인은 대화내용을 순서대로 화면에 표시할 TMemo 콤포넌트를 읽기전용으로 변경하는 것입니다.

40: 라인에서 내려놓은 TidTCPClient 콤포넌트는 TCP/IP 클라이언트용 컴포넌트 입니다. 서버로 접속하여 메시지를 전달하거나 수신할 수 있는 기능을 갖추고 있습니다.

41-42: 라인에서는 서버로 접속하기 위하여 서버의 주소와 포트 번호를 지정하였습니다. ‘127.0.0.1’은 자신의 컴퓨터로 접속할 때 사용하는 IP 주소입니다.

45: 라인에서 TidAntiFreeze는 인디 콤포넌트가 송수신을 할 때 사용자 인터페이스를 멈추게(얼도록)할 수가 있습니다. 즉, 채팅 클라이언트 프로그램이 잠시 “응답없음” 상태와 같이 정지된 상태가 되는 것을 말합니다. 해당 콤포넌트는 이러한 현상을 방지하여 줍니다. 사용법은 내려놓기만 하면 스스로 작동합니다.

48: 라인에서 서버로부터 메시지가 전달 되었는지 수시로 점검하기 위해서 TTimer 콤포넌트를 사용하였습니다.

49: 라인에서는 서버로부터 메시지가 전달 되었는지 점검하는 시간을 300ms (300/1000초) 간격으로 지정하였습니다.

50: 라인에서는 타이머가 지정된 시간마다 발생하는 OnTimer 이벤트를 이용하여 서버로부터 메시지가 전달되었는 지 확인하게 됩니다.

소스 분석

1: unit uClient;
2:
3: interface
4:
5: uses
6: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7: Dialogs, StdCtrls, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze,
8: IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;
9:
10: type
11: TForm1 = class(TForm)
12: moMsg: TMemo;
13: Panel1: TPanel;
14: edUserName: TEdit;
15: edMsg: TEdit;
16: IdTCPClient1: TIdTCPClient;
17: IdAntiFreeze1: TIdAntiFreeze;
18: Button1: TButton;
19: Timer1: TTimer;
20: procedure Button1Click(Sender: TObject);
21: procedure Timer1Timer(Sender: TObject);
22: procedure edMsgKeyPress(Sender: TObject; var Key: Char);
23: private
24: { Private declarations }
25: public
26: { Public declarations }
27: end;
28:
29: var
30: Form1: TForm1;
31:
32: implementation
33:
34: {$R *.dfm}
35:
36: procedure TForm1.Button1Click(Sender: TObject);
37: begin
38: IdTCPClient1.Connect;
39: end;
40:
41: Function ReceiveText(IdTCPClient:TIdTCPClient):String;
42: Var
43: Data : Pointer;
44: DataSize : Integer;
45: ssData : TStringStream;
46: Begin
47: DataSize:= IdTCPClient.ReadFromStack(True, 5, False);
48: If DataSize = 0 then Begin
49: Result:= ';
50: Exit;
51: End;
52:
53: GetMem(Data, DataSize);
54: ssData:= TStringStream.Create(');
55: Try
56: IdTCPClient.ReadBuffer(Data^, DataSize);
57: ssData.Write(Data^, DataSize);
58: ssData.Position:= 0;
59: Result:= ssData.DataString;
60: Finally
61: FreeMem(Data);
62: ssData.Free;
63: End;
64: End;
65:
66: procedure TForm1.Timer1Timer(Sender: TObject);
67: Var
68: stText : String;
69: begin
70: If IdTCPClient1.Connected = False then Exit;
71:
72: stText:= ReceiveText(IdTCPClient1);
73: If stText <> ' then moMsg.Lines.Add(stText);
74: end;
75:
76: procedure TForm1.edMsgKeyPress(Sender: TObject; var Key: Char);
77: begin
78: If Key = #13 then Begin
79: Key:= #0;
80: IdTCPClient1.WriteLn(Format('%s> %s', [edUserName.Text, edMsg.Text]));
81: edMsg.Text:= ';
82: End;
83: end;
84:
85: end.


38: 라인은 서버로 접속하는 부분입니다. 이미 주소와 포트를 프로퍼티 설정 부분에서 지정해 주었기 때문에 우리는 단순히 Connect 메소드만 실행하는 것만으로도 충분합니다.

41-64: 라인은 TidTCPClient 콤포넌트의 ReadLn 메소드의 버그를 피하기 위해서 필자가 작성한 함수 입니다. 지금은 버그가 패치된 버전이 있으니 http://www.nevrona.com/indy에서 새로운 버전을 다운 받아 설치하시면 이 함수는 굳이 작성하지 않으셔도 됩니다. 이것저것 귀찮거나 헛갈리시는 분들은 우선 ReceiveText 함수를 사용하시기 바랍니다.

66-74: 라인은 주기적으로 서버로부터 메시지가 전송 되었는지 확인하고, 메시지가 수신되었으면 화면(TMemo)에 표시하는 부분입니다.

72: 라인은 버그가 패치된 인디를 설치하였을 경우에는 stText:= IdTCPClient1.ReadLn(', 5); 로 변경하셔도 됩니다.

76-83: 라인은 사용자가 대화내용을 입력하고 엔터키를 입력할 때 서버로 메시지를 전송하는 부분입니다.

78: 라인에서는 눌러진 키값이 엔터키와 같은 지 비교합니다. 엔터키가 눌러지면 Key 변수는 #13 즉, 13번 아스키 문자가 입력됩니다.

79: 라인에서는 엔터키 일 때에는 키값을 아무것도 안눌러졌음으로 변경했습니다. 이는 TEdit 콤포넌트에서 엔터키를 치면 “팅”하는 소리가 나는 것을 방지하기 위해서 입니다. 대화내용을 전송할 때 마다 “팅”, “팅”하는 소리가 난다면 그다지 대화하고픈 분위기가 되지는 않을 테니까요 ^^

80: 라인에서는 입력된 메시지와 입력된 사용자 이름을 “이름> 대화내용”과 같은 방식으로 서버에 전송합니다. 이후 모든 클라이언트에 해당 형식으로 전송되어 화면에 나타나게 됩니다.

81: 라인에서는 입력창을 비워서 다음 대화내용을 입력 받을 수 있도록 준비합니다.

실행 및 테스트

Array

[그림 2.2] 채팅 프로그램을 실행한 화면

서버를 실행한 후 클라이언트 프로그램 두 개를 띄우고 각각 접속 버턴을 누르시기 바랍니다. 이후 각각의 클라이언트의 왼쪽에 있는 입력창에 자신의 대화명을 각각 입력하고 오른쪽 옆에 있는 메시지 입력창에 대화내용을 입력하고 엔터키를 치면 위의 화면처럼 서로 대화를 나눌 수 있게 됩니다.

원거리에 있는 사용자들 끼리 사용하고자 할 때에는 서버의 IP 주소를 다시 입력하시고 컴파일 한 후에 사용하시기 바랍니다.

끝으로

다음에는 1:1 메시지 전달, 귓속말 그리고 로그인 처리 등과 같은 기능을 하나씩 추가해 나가며 강좌를 진행해 나가도록 하겠습니다.
신고

+ Recent posts