string 값을 반환하는 DLL 함수 생성후 에러 발생 시
uses 절에 ShareMem 을 처음으로 등록 하라고 함.
dll 과 pas 에서 둘다 등록 했는데...
프로그램 종료시에 에러 발생 합...
dpr 파일에도 ShareMem 을 등록 하니...
이상 없이 잘 됨.
string 값을 반환하는 DLL 함수 생성후 에러 발생 시
uses 절에 ShareMem 을 처음으로 등록 하라고 함.
dll 과 pas 에서 둘다 등록 했는데...
프로그램 종료시에 에러 발생 합...
dpr 파일에도 ShareMem 을 등록 하니...
이상 없이 잘 됨.
wsTelnet 옵션이 True 가 된 경우 0xFF 전송시 0xFF 0xFF 와 같이 전송 됨
wsTelnet 옵션을 False 로 변경
Delphi 주요 함수(Function) 및 프로시져(Procedure)
procedure read(v1,v2,v3....);
procedure readln(v1,v2,v3...);
값을 입력받은 후 다음 행으로 이동
procedure write(v1,v2,....);
procedure writeln(v1,v2...);
값을 출력한 후 다음 행으로 이동
function chr(x):char;
x(아스키 코드값)에 해당하는 문자로 변환
function ord(x):integer; x(문자)에 해당하는 순서
즉 아스키코드값 리턴
function int(X: Extended): Extended;
실수값의 소숫점이하를 버리고 정수부분만 취한다.
Int(32.45) ← 32.0
function trunc(X: Extended): Int64;
실수값의 소숫점이하를 버리고 정수부분만 취한다.
trunc(32.45) ← 32
function odd(x:integer):boolean;
x가 홀수면 true, 짝수면 false를 되돌린다.
function random(x:integer):integer;
0~x-1 사이의 정수 난수 발생
function random:real;
0~1사이의 실수 난수 발생
procedure randomize;
function upcase(ch:char):char;
소문자를 대문자로 변환
procedure inc(var x[;n:integer]);
x의 값을 일정하게 증가
inc(x); ← x:=x+1
inc(x,2); ← x:=x+2
procedure dec(var x[;n:integer]);
x의 값을 일정하게 감소
dec(x); ← x:=x-1
dec(x,2); ← x:=x-2
function abs(x:integer):integer; 절대값(정수)
function abs(x:real):real; 절대값(실수)
function sqr(x):x 와 동일 type
x의 제곱값을 리턴
function sqrt(x:real):real;
x의 제곱근값을 계산하여 리턴 (x>0)
function length(s:string):integer;
문자열의 길이
function copy(s:string;x:integer;cnt:integer):string;
문자열 s를 x로 부터 cnt만큼 자른다
procedure delete(var s:string;x:integer;cnt:integer);
문자열 s를 x부터 cnt만큼 오려낸다
procedure insert(so:string;var s:string;idx:integer);
s문자열의 idx위치에서 so문자열을 삽입하며, s문자열 의 나머지 문자들은 우측으로 이동한다.
function pos(substr,s:string):byte;
문자열 s를 처음부터 검색하여 substr문자열이 있는지를 확인하여 위치를 되돌린다.
procedure str(s[:width[:decimal]];var s);
수치형 데이터를 문자열 변환후 s에 기억
procedure val(s:string;var v:integer;var code:integer);
수치형 문자를 숫자로 변환후 v에 기억
변환과정에서의 error는 code에 기억
function eof(var f:text):boolean;
파일의 끝에 도달했는지를 확인
Sample1
const
ODBC_ADD_DSN=1;
ODBC_CONFIG_DSN=2;
ODBC_REMOVE_DSN=3;
ODBC_ADD_SYS_DSN=4;
ODBC_CONFIG_SYS_DSN=5;
ODBC_REMOVE_SYS_DSN=6;
ODBC_REMOVE_DEFAULT_DSN=7;
function SQLConfigDataSource(HwndParent:HWND;FRequest:WORD;Driver:PChar;
Attributes:Pchar):boolean;Stdcall;
function SQLWriteDSNToIni(DSN: PChar;Driver: PChar):Boolean stdcall;
function SQLRemoveDSNFromIni(DSN: PChar):Boolean stdcall;
implementation
{$R *.dfm}
function SQLConfigDataSource;external 'odbccp32.dll' name 'SQLConfigDataSource';
function SQLWriteDSNToIni;external 'odbccp32.dll' name 'SQLWriteDSNToIni';
function SQLRemoveDSNFromIni;external 'odbccp32.dll' name 'SQLRemoveDSNFromIni';
procedure TForm1.Button1Click(Sender: TObject);
begin
if SQLRemoveDSNFromIni('TA') then
begin
SQLWriteDSNToIni('TA', 'SQL Server');
SQLConfigDataSource(0, ODBC_CONFIG_DSN,
PChar('SQL Server'),
// add other params to the last one here:
PChar('DSN=TA'+ #0 +
'Server=(local)'+ #0#0));
// to remove the one that you created, use this code:
// SQLRemoveDSNFromIni('TA');
end;
Sample2
const
ODBC_ADD_DSN = 1; // Add data source
ODBC_CONFIG_DSN = 2; // Configure (edit) data source
ODBC_REMOVE_DSN = 3; // Remove data source
ODBC_ADD_SYS_DSN = 4; // add a system DSN
ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN
ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN
ODBC_REMOVE_DEFAULT_DSN = 7; // remove the default DSN
function SQLConfigDataSource(hwndParent: HWND;
fRequest: Word;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR): BOOL; stdcall; external 'ODBCCP32.DLL';
function CreateDB(const Database: string): Boolean;
begin
Result := SQLConfigDataSource(0, ODBC_ADD_DSN,
'Microsoft Access Driver (*.mdb)', PChar('CREATE_DB=' + Database + ' General'#0));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
CreateAccessDatabase('c:\Testdb.mdb');
end;
"exception class EAccessViolation with message"
이 메시지가 출력 되는 경우는
AdoConnection 이 생성되지 않은 상태에서 Connect 을 하려고 하는 경우...
일반적으로 데이터모듈에 AdoConnection 을 올리고...
데이터모듈이 생성 되지 않은 상태에서 AdoConnect 을 시도 하는 경우에 발생함
KeyPress 이벤트에 다음과 같이 코딩
if Key = Char(VK_RETURN) then
Perform(WM_NEXTDLGCTL,0,0);
이 프로그램 내용은 제목과 같이...
웹사이트 접속해서 액티브엑스를 실행시키면 프로그램 설치 여부를 체크 하여...
미설치 되었으면 파일을 다운로드 받아서 설치 해 주는것이고...
설치 되었으면 해당 프로그램을 실행해 주는 것입니다.
일단 이 엑티브엑스를 만들기 전에...
해당 셋업 프로그램에 셋업시 특정 레지스트리에 실행파일 위치를 적어 놓도록 했습니다.
그래서 셋업을 하게 되면 레지스트리에 실행할 디렉토리가 남게 되는 것이고...
그 레지스트리 값을 읽어와서 레지스트리에 값이 있으면 실행
아니면 다운로드 후 실행 과 같은 형태입니다.
서버에 올릴 HTML 소스
HTML 간략 내용.
<OBJECT
</OBJECT>
이건 액티브엑스 만든후 생성된 파일에 보면 있습니다. 그 내용을 그냥 복사한 내용입니다.
<SCRIPT TYPE="TEXT/JAVASCRIPT"
if (parameters.length > 1)
{
AX.SETID = request.getId();
}
AX.ButtonClick = 1;
/SCRIPT>
이건 URL 의 변수부분을 받아 오기 위한 부분입니다.
가령 http://zeron.co.kr/rfid.html?id=test 이렇게 입력을 하게 되면...
AX.SETID = request.getId(); 여기에서
액티브엑스의 변수 ID 에 test 라는 아이디를 셋팅하게 되는 과정입니다.
AX.ButtonClick = 1; 이건 액티브엑스의 버튼을 클릭하게 하는 것이구요...
스크립트 내의
function activeX_self() 함수는 액티브엑스가 설치되어 있는지 유무를 체크합니다.
설치 되어 있다면 위의 엑티브엑스를 실행 했으니...
if(Installed == true)
{
window.opener='Self';
window.open('','_parent','');
window.close(); //설치되어 있으면 창을 닫는다.
}
else
{
alert("ActiveX 를 설치 하셔야 합니다..");
}
설치되어 있으면 액티브엑스 실행후 창을 닫고 아니면 아래 화면을 쭉 뿌려 주면서
액티브엑스 설치 할 수 있도록 화면에서 안내를 해 줍니다.
제가 웹쪽에 거의 문외한이라 블로그에 화면 덤프 뜬 다음 카피해서 붙여놓은거라...
화면이 예쁘지 않네요...
http://zeron.co.kr/rfid.html 테스트 해 보실 수 있는 주소입니다.
델파이 ActiveX 소스
소스에서 보시면
procedure TaxGuestStart.Set_ButtonClick(Value: Integer);
begin
if Value = 1 then ProgramExcute;
end;
procedure TaxGuestStart.Set_SetID(const Value: WideString);
begin
L_stUserID := string(Value);
end;
이 부분이 스크립트와 연동되는 부분입니다.
이건 요즘 델파이 거의 사용 안하시지만...
혹시라도 델파이와 액티브 엑스 연동 과정에 필요하신 분 있을까 봐서도 올렸지만...
혹시라도 나중에 제가 다시 액티브 엑스 관련된 프로그램 할 수 있으면...
제가 참고 하기 위해...
자료 보관 차원에서 데이터를 올립니다.
에궁...
제가 머 프로그램을 잘 하는 편이 아니라서...
항상 짜집기 인생에...
머하나 잘하는거 없이 이것저것...
닥치면 그제서야 여기 뒤지고 저기 뒤지고...
그러다가 엊그제 C/S로 개발된 방문자예약프로그램을 웹에서 직접 버튼 클릭으로 연동시켜 달라는 주문을 받았습니다.
처음에는 생각도 하지 못했는데...
ActiveX를 만들어서 ActiveX를 실행시켜서...
프로그램 설치 되어 있으면 설치파일 실행 시켜 주고...
설치되어 있지 않으면 다운로드 받아서 설치 해주면 될것 같아서...
ActiveX 만드는 방법을 좀 배워봤습니다.
나중에 또 액티브엑스 만들일 있으면 사용하기 위해서 기록 형식으로 남겨 놓습니다.
1. 프로젝트 생성 시 위와 같이 Other 를 선택함
2. ActiveX 탭에서 ActiveForm 을 선택함
3. 생성된 폼에서 코딩을 합니다. 코딩한 소스는 허접이지만... 다음 글에 올리겠습니다.
4. 코딩을 다 했으면....
5. Project -> Web Deployment Options 를 클릭합니다.
6. Target Dir 은 ocxl 파일이 생성될 위치를 선택합니다. 소스와 같은 디렉토리를 선택해도 상관이 없지만 소스디렉토리 선택하니까 확인메시지 한번 뜨네요...
7. Target URL 은 업로드 할 서버주소를 적는데... 이건 HTML 에서 변경가능함
8. HTML dir 은 HTML 파일이 생성되는 위치 입니다. 저는 TargetDir 과 같은 위치로 넣었습니다.
9. Use CAB file compression 을 체크 하면 ocx 파일이 아닌 CAB 파일로 생성이 되어 사이즈가 작아집니다. 웹에 올릴때는 체크하셔서 생성 하시면 나을듯 싶네요...
10. project -> Web Deploy 를 클릭하면 아래와 같이 htm 파일이 생성됩니다.
================================================================================
위는 액티브엑스 파일을 만드는 과정이었고...
아래는 액티브엑스 파일과 htm 내의 스크립트로 액티브엑스를 동작하게 하기 위해서 통로를 만들어 주는 과정입니다.
가령 html 내에서 액티브엑스 내부의 아이디 를 셋팅 하고 싶을때...
아이디 값을 넘겨 주거나 할때 사용됩니다.
1.view -> type Library 를 선택합니다.
2. 바로 위의 그림과 같이 빨간 탁구채 모양을 선택 후 이미지 처럼 READ|WRITE 등을 선택하면 변수가 하나 생기고 이름을 변경 후 리프레쉬를 하면 함수가 하나 생깁니다.
거기에서 작업을 해 주면 됩니다.