윈도우에서 사용자 권한에 의해 윈도우 메시지를 못 받는 경우가있다.

임의로 추가하여 처리해 주어야 함.


Drag and Drop 예제

- 소스내 주석으로는 2004년에 Peter D Johnson라는 사람이 올린 소스를 수정하였음.



중요한 것은 권한 추가!

아래 함수를 추가하면 된다.


procedure SetDragAndDropOnSystemsWIthUAC(Wnd: HWND; IsEnabled: boolean);


procedure TForm1.SetDragAndDropOnSystemsWIthUAC(Wnd : HWND; IsEnabled : boolean);

type

  TChangeWindowMessageFilter = function(Msg : Cardinal; Action : Word) : Bool; stdcall;

const

  Msg_Add = 1;

  WM_COPYGLOBALDATA = $49;

var

  DllHandle : THandle;

  ChangeWindowMessageFilter : TChangeWindowMessageFilter;

begin

  DllHandle := LoadLibrary('user32.dll');

  if DllHandle > 0 then

  begin

    ChangeWindowMessageFilter := GetProcAddress(DllHandle, 'ChangeWindowMessageFilter');

    if Assigned(ChangeWindowMessageFilter) then

    begin

      DragAcceptFiles(Wnd, IsEnabled);

      ChangeWindowMessageFilter(WM_DROPFILES, Msg_Add);

      ChangeWindowMessageFilter(WM_COPYGLOBALDATA, Msg_Add);

    end;

  end;

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

  // Tell windows we accept file drops

  SetDragAndDropOnSystemsWIthUAC(Self.Handle, True);

end;


procedure TForm1.FormDestroy(Sender: TObject);

begin

  // Cancel acceptance of file drops

  SetDragAndDropOnSystemsWIthUAC(Self.Handle, False);

end;


DragAndDropWithUAC.7z



델파이에서 클래스를 만들어서 사용할 때 데이터베이스의 테이블 컬럼들을 그대로 델파이의 클래스형태로 변환해 주는 쿼리.

This is sort of translator to use Oracle database table columns for Delphi class object.


--Oracle DB Column to Delphi Class

/***********************************************************************

* [ DB → Delphi Class 자동 생성 ]

*

* ex) ED_GB :arrow_lower_right:

* FEdGb : string; { 출입국구분 }

* procedure SetEdGb(const Value: string); { return delYn; }

* property edGb : string read FEdGb write SetEdGb;

* procedure THistObj.SetEdGb(const Value: string); begin FEdGb := Value; end;

***********************************************************************/

DECLARE 

P_OWNER     VARCHAR2(100); /* 사용자계정 */

P_TABLE     VARCHAR2(100); /* 테이블명 */

P_OBJECT    VARCHAR2(100); /* 객체명 */


R_VAR       VARCHAR2(32000); /* 변수 */

R_VAR_SET   VARCHAR2(32000); /* Setter 선언 */

R_VAR_PROP  VARCHAR2(32000); /* property 선언 */

R_SET       VARCHAR2(32000); /* set 메소드 */

BEGIN 

P_OWNER := 'ABCUSER';

P_TABLE := 'H100';

P_OBJECT := 'THistObj';


R_VAR := '';

R_VAR_SET := '';

R_VAR_PROP := '';

R_SET := '';


FOR X IN ( 

    SELECT 

        LOWER(SUBSTR(TC.COLUMN_NAME,0,1)) || SUBSTR( REPLACE(INITCAP(TC.COLUMN_NAME), '_'), 2, LENGTH(REPLACE(INITCAP(TC.COLUMN_NAME), '_'))-1) AS COLUMN_NAME

        , TC.DATA_TYPE

        , COMMENTS

        , decode(DATA_TYPE, 'VARCHAR2', 'string', 'CHAR', 'string', 'DATE', 'TDateTime', 'NUMBER', 'Integer', 'BLOB', 'string', 'string') AS DELPHI_TYPE

    FROM ALL_TAB_COLUMNS TC, ALL_COL_COMMENTS CC

    WHERE TC.OWNER = CC.OWNER

    AND TC.TABLE_NAME = CC.TABLE_NAME

    AND TC.COLUMN_NAME = CC.COLUMN_NAME

    AND TC.OWNER = P_OWNER 

    AND TC.TABLE_NAME = P_TABLE 

    ORDER BY TC.column_id

LOOP 

R_VAR := R_VAR || LPAD(' ', 4) || RPAD('F' || UPPER(SUBSTR(X.COLUMN_NAME, 1, 1))||SUBSTR(X.COLUMN_NAME, 2), 24, ' ') || ': ' || X.DELPHI_TYPE || '; { ' ||X.COMMENTS||' }' || CHR(13);

R_VAR_SET := R_VAR_SET || LPAD(' ', 4) || 'procedure Set' || UPPER(SUBSTR(X.COLUMN_NAME, 1, 1))||SUBSTR(X.COLUMN_NAME, 2) || '(const Value: ' || X.DELPHI_TYPE||');' || CHR(13);

R_VAR_PROP := R_VAR_PROP || LPAD(' ', 4) || RPAD('property ' || X.COLUMN_NAME, 30, ' ') || ': ' || RPAD(X.DELPHI_TYPE, 16, ' ') || ' read ' || RPAD('F' ||UPPER(SUBSTR(X.COLUMN_NAME, 1, 1))||SUBSTR(X.COLUMN_NAME, 2), 24, ' ') || ' write Set' ||UPPER(SUBSTR(X.COLUMN_NAME, 1, 1))||SUBSTR(X.COLUMN_NAME, 2)||';' || CHR(13);

R_SET := R_SET || 'procedure ' || P_OBJECT || '.Set' || UPPER(SUBSTR(X.COLUMN_NAME, 1, 1))||SUBSTR(X.COLUMN_NAME, 2) || '(const Value: ' || X.DELPHI_TYPE||'); begin F' ||UPPER(SUBSTR(X.COLUMN_NAME, 1, 1))||SUBSTR(X.COLUMN_NAME, 2)||' := Value; end;'|| CHR(13);

END LOOP;


DBMS_OUTPUT.ENABLE(1000000);

DBMS_OUTPUT.PUT_LINE('type');

DBMS_OUTPUT.PUT_LINE('  ' || P_OBJECT || ' = class(TObject)');

DBMS_OUTPUT.PUT_LINE('  private');

DBMS_OUTPUT.PUT_LINE(R_VAR);

DBMS_OUTPUT.PUT_LINE(R_VAR_SET);

DBMS_OUTPUT.PUT_LINE('  public');

DBMS_OUTPUT.PUT_LINE('  published');

DBMS_OUTPUT.PUT_LINE(R_VAR_PROP);

DBMS_OUTPUT.PUT_LINE('  end;'|| CHR(13));

DBMS_OUTPUT.PUT_LINE('implementation'|| CHR(13)|| CHR(13));

DBMS_OUTPUT.PUT_LINE('{ '|| P_OBJECT ||' }'|| CHR(13));

DBMS_OUTPUT.PUT_LINE(R_SET);


END;

델파이에서 Json 사용하기

Using Json in Delphi 


우선 델파이의 string에서 Json형태로 변경해주는 한줄 함수

At first, the function converting string to JsonString in 1 row.


uses 절에 REST.Json 추가

Add REST.Json @ uses 




TJson.JsonToObject

TJson.ObjectToJsonString 


클래스 함수로 선언된 것이라 반드시 TJson.을 붙여서 사용해야함

This has to write with TJson in front of the function because it is a class function as you can see.


간단한 클래스 생성

Create simple class



사용방법

Usage



요청 전문은 StringStream으로 TJson.ObjectToJsonString함수를 사용하여 객체를 곧바로 Json형태의 스트링으로 변환하여 담아준다. HTTPJson함수내용은 단순하게 주소로 StringStream을 Post방식으로 보내는 역할뿐이다.

The request as a StringStream is made by string of Json using the converting class TJson.ObjectToJsonString. 

HTTPJson function is simple that send StringStream as post method of HTTPPost().


HTTPPost에는 여러가지 overload된 함수가 존재하는데 string으로 요청을 보낼 시에는 이상하게 계속 폴더명이 붙어버린다.

There are lots of overloaded function of HTTPPost. so when trying to send as string, you can see it changes weird string seems like path of directory.

 

 

델파이로 만든 첫 프로그램..

운영데이터를 개발로 내리기 위해 만든 툴...

 

 

AP2DEV-Setup.exe

 

UserManual_DataLoad_V1.0.doc

 

AP2DEV_주제발표자료.pptx

 

AP2DEV.z01

 

AP2DEV.zip

 

+ Recent posts