본문 바로가기
Delphi/프로시저-함수

델파이 유용한 함수정리 7탄

by MonoSoft 2021. 7. 8.
728x90
반응형

델파이 유용한 함수정리 7탄

 

 

JPEG, String 사용하는 방법

 

MYJPEG JPEG C:\DownLoad\MY.JPG

StringTable

begin

1, "DPSC"

2, "Tips"

3, "Source Code"

4, "Interviews, reviews, and articles"

end

ARJ EXEFILE C:\UTILS\ARJ.EXE

WAVEFILE WAVE c:\WaveSound.wav

MAINICON ICON "MainIcon.ico"

uses Jpeg;

procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture);

var

ResHandle : THandle;

MemHandle : THandle;

MemStream : TMemoryStream;

ResPtr : PByte;

ResSize : Longint;

JPEGImage : TJPEGImage;

begin

ResHandle := FindResource(hInstance, PChar(TheJPEG), 'JPEG');

MemHandle := LoadResource(hInstance, ResHandle);

ResPtr := LockResource(MemHandle);

// create instance of objects.

MemStream := TMemoryStream.Create;

JPEGImage := TJPEGImage.Create;

ResSize := SizeOfResource(hInstance, ResHandle);

MemStream.SetSize(ResSize);

MemStream.Write(ResPtr^, ResSize);

FreeResource(MemHandle);

MemStream.Seek(0, 0);

JPEGImage.LoadFromStream(MemStream);

ThePicture.Assign(JPEGImage);

// remove from memory.

JPEGImage.Free;

MemStream.Free;

end;

 

사용 예) LoadJPEGFromRes('MYJPEG', Image1.Picture);

 

String사용 예

procedure TForm1.Button1Click(Sender: TObject);

var Buffer : Array[0..255] Of Char;

begin

LoadString(hInstance, 1, @Buffer, 255);

Label1.Caption := StrPas(Buffer);

LoadString(hInstance, 2, @Buffer, 255);

Label2.Caption := StrPas(Buffer);

end;

 

파일저장 함수

procedure ExtractRes(ResType, ResName, ResNewName : String);

var

Res : TResourceStream;

begin

Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));

Res.SavetoFile(ResNewName);

Res.Free;

end;

 

사용 예) ExtractRes('EXEFILE', 'ARJ', 'ARJ-1.EXE');

 

WAVE예제

var

Soo: TResourceStream;

begin

Soo := TResourceStream.Create(hInstance, 'WAVEFILE', PChar('Wave'));

sndPlaySound(Soo.Memory, SND_MEMORY or SND_ASYNC);

Soo.Free;

end;

 

아이콘변경

SetClassLong( Dialog, GCL_HICON, LoadIcon( hInstance, 'MAINICON'));

 

 

bde 를이용해 동적으로 엘리어스 만들기

uses BDE;

procedure AddBDEAlias(sAliasName, sAliasPath, sDBDriver : string );

var h : hDBISes;

begin;

DBIInit( nil );

DBIStartSession( 'dummy', h, '' );

DBIAddAlias( nil, PChar( sAliasName ), PChar( sDBDriver ), PChar( 'PATH:' + sAliasPath ), True );

DBICloseSession( h );

DBIExit;

end;

 

사용 예) AddBDEAlias('TestDB','C:\Temp', 'DBASE' );

 

BDE 버전정보

uses BDE;

function BDEVersion: string;

var BDEVer: SYSVersion;

Day,Month,Hour,Min,MilliSec: Word;

Year: Smallint;

begin

DbiGetSysVersion(BDEVer);

with BDEVer do

begin

DbiDateDecode(dateVer, Month, Day, Year);

DbiTimeDecode(TimeVer, Hour, Min, MilliSec);

Result := format('Database Engine version %d.%.3d of %.2d/%.2d/%d, %.2dh:%.2dm:%.2ds',

[Hi(iVersion),Lo(iVersion),Month,Day,Year,Hour,Min,MilliSec div 1000]);

end;

end;

 

BDE가 설치되어있는지 알아내기

1. 레지스트리를 이용한 방법

RootKey := HKEY_LOCAL_MACHINE;

OpenKey('SOFTWARE\Borland\Database Engine', False);

try

s := ReadString('CONFIGFILE01');

//BDE installed

finally

CloseKey;

end;

 

2. BDE를 초기화 해보는 방법

IsBDEExist := (dbiInit(nil) = 0)

두번째 방법이 더 신뢰성이 있습니다. BDE프로그램파일만 지우고 레지스트리정보는 정리하지 않은 경우가

있기때문이죠.

BDE Error list 얻기

procedure TForm1.Button1Click(Sender: TObject);

var Category: byte;

Code: byte;

ResultCode: word;

ErrorString: array[0..DBIMAXMSGLEN + 1] of char;

OutString: string;

begin

DbiInit(nil);

 

Memo1.Lines.BeginUpdate;

for Category := ERRCAT_NONE to ERRCAT_RC do

for Code := 0 to 255 do

begin

ResultCode := (Category shl 8) + Code;

DbiGetErrorString(ResultCode, ErrorString);

if StrLen(ErrorString) > 0 then

begin

OutString := Format('%6d %0.4x %s', [ResultCode, ResultCode, ErrorString]);

Memo1.Lines.Add(OutString);

end;

end;

 

Memo1.Lines.EndUpdate;

DbiExit;

end;

 

bde의 제한

Table and Index Files

48 Clients in system

32 Sessions per client (3.5 and earlier, 16 Bit, 32 Bit)

256 Session per client (4.0, 32 Bit)

32 Open databases per session (3.5 and earlier, 16 Bit, 32 Bit)

2048 Open databases per session (4.0, 32 Bit)

32 Loaded drivers

64 Sessions in system (3.5 and earlier, 16 Bit, 32 Bit)

12288 Sessions in system (4.0, 32 Bit)

4000 Cursors per session

16 Entries in error stack

8 Table types per driver

16 Field types per driver

8 Index types per driver

48K Size of configuration (IDAPI.CFG) file

64K Size of SQL statement (RequestLive=False)

4K Size of SQL statement (RequestLive=True)

16K Record buffer size (SQL or ODBC)

 

이미지를 db에 저장하기

procedure TForm1.Button1Click(Sender: TObject);

begin

Query1.Close;

Query1.SQL.Clear;

Query1.SQL.Add('INSERT INTO test_pic ');

Query1.SQL.Add('(pic_NO,pic_IMAGE) ');

Query1.SQL.Add('VALUES (:pic_NO, :pic_IMAGE)');

Query1.ParamByName('pic_no').AsString := Edit1.Text;

Query1.ParamByName('pic_IMAGE').LoadFromFile('c:\aaaa\4444.jpg',FTBLOB);

Query1.Prepare;

Query1.ExecSQL;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

Query2.open;

// table1.open;

end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);

var

aJpeg : TJpegImage;

Buffer: PChar;

MemSize: Integer;

BStream : TStream;

begin

Image1.Picture := nil;

BStream := Query2.CreateBlobStream(Query2.FieldByName('pic_IMAGE'),bmRead);

// BStream := table1.CreateBlobStream(table1.FieldByName('pic_IMAGE'),bmRead);

MemSize := BStream.Size;

Inc(MemSize);

Buffer := AllocMem(MemSize);

try

BStream.Read(Buffer^, MemSize);

BStream.Position := 0;

aJpeg := TJPEGImage.Create;

try

aJpeg.LoadFromStream(BStream);

Image1.Picture.Assign(aJpeg);

finally

aJpeg.Free;

end;

finally

FreeMem(Buffer, MemSize);

end;

end;

 

blob 사용법

// 다음은 TBlobStream을 사용한 BLOB field와의 연동을 Rich Edit를 예를들어

// 작성했습니다.

if DataSource1.DataSet.FieldByName(field) is TMemoField then

begin

aBlobStream := TBlobStream.Create(

TMemoField(DataSource1.DataSet.FieldByName(field)),

bmRead);

RichEdit1.Lines.LoadFromStream(aBlobStream);

// DataSource1은 TTable과 연결해놓으세요.

procedure TForm1.LoadFromBLOB(field: String); {field는 TTable의 BLOB 필드명}

var

aBlobStream: TBlobStream;

begin

if ((DataSource1 <> nil) and (field <> '')) then

begin

{그래픽을 다루는 프로그램이면 TMemoField -> TGraphicField로}

if DataSource1.DataSet.FieldByName(field) is TMemoField then

begin

aBlobStream := TBlobStream.Create(

TMemoField(DataSource1.DataSet.FieldByName(field)),

bmRead);

RichEdit1.Lines.LoadFromStream(aBlobStream);

aBlobStream.Free;

end

else

begin

RichEdit1.Text := DataSource1.DataSet.FieldByName(field).AsString;

end;

end;

end;

 

// 물론 아래의 SaveToBLOB를 호출하기전에 TTable을 edit 나

// insert상태로 만들어 놓고 사용해야죠, 그리고 호출후 post도...

procedure TForm1.SaveToBLOB(field: String); {field는 TTable의 BLOB 필드명};

var

aBlobStream: TBlobStream;

begin

if ((DataSource1 <> nil) and (field <> '')) then

begin

if DataSource1.DataSet.FieldByName(field) is TMemoField then

begin

aBlobStream := TBlobStream.Create(

TMemoField(DataSource1.DataSet.FieldByName(field)),

bmWrite);

RichEdit1.Lines.SaveToStream( aBlobStream );

aBlobStream.Free;

end

else

begin

DataSource1.DataSet.FieldByName(field).AsString := RichEdit1.Text;

end;

end;

end;

 

dataset의 현재 레코드 복사하여 붙여넣기

procedure AppendCurrent(Dataset:Tdataset);

var

aField: Variant;

i: Integer;

begin

// 주어진 DataSet(TTable, TQuery...)의 필드 갯수만큼의 배열요소 갯수로

// Variant 배열을 만든다

aField := VarArrayCreate([0, DataSet.Fieldcount-1], VarVariant);

// Variant 배열에 모든 필드의 값을 저장한다

for i := 0 to (DataSet.Fieldcount-1) do

aField[i] := DataSet.fields[i].Value;

// DataSet의 상태를 insert로 만든다

DataSet.Append ;

// Variant 배열에 저장된 필드의 값을 신규 레코드의 해당 필드에 할당한다

for i := 0 to (DataSet.Fieldcount-1) do

DataSet.fields[i].Value := aField[i];

end;

 

blob 필드에서 다른 table의 blob 필드로 복사를 하려면...

procedure TForm1.Button1Click(Sender: TObject);

var

BS1, BS2: TBlobStream;

begin

BS1 := TBlobStream.Create(Table1Notes,bmRead);

try

Table2.Edit;

BS2 := TBlobStream.Create(Table2MyBlob,bmReadWrite);

try

BS2.CopyFrom(BS1,BS1.Size);

finally

BS2.Free;

end;

finally

BS1.Free;

end;

Table2.Post;

end;

 

blob필드의 size 구하는 함수

function GetBlobSize(Field: TBlobField): Longint;

var

bi: TBlobStream;

begin

bi := TBlobStream.Create(Field, bmRead);

try

Result := bi.Seek(0,2);

finally

bi.Free;

end;

end;

 

sqlserver에서 프로시져호출

with Query1 do begin { 추가 }

Close;

Sql.Clear;

Sql.Add('declare @bal_sno numeric(07,0) ');

Sql.Add(' ,@io_no numeric(03,0) ');

Sql.Add(' ,@bal_no varchar(20) ');

Sql.Add('select @bal_sno = :bal_sno ');

Sql.Add('select @io_no = :io_no ');

Sql.Add('select @bal_no = :bal_no ');

Sql.Add('exec SP_JJ_BALJU_I @bal_sno output ');

Sql.Add(' ,:sa_sno ,:b_sno ,:io_store ');

Sql.Add(' ,@io_no output ,:io_seq ');

Sql.Add(' ,:io_date ,:c_sno ,:js_sno ,:jb_sno ');

Sql.Add(' ,:j_sno ,:io_qty ,:io_price ,:io_amt ');

Sql.Add(' ,:m_name ,:w_whan ,:io_amt_w ,:d_date ');

Sql.Add(' ,@bal_no output ,:bal_gubun ,:chk_inv ');

Sql.Add(' ,:needj_sno ,:can_qty ,:inv_qty ,:ga_qty ');

Sql.Add(' ,:bad_qty ');

Sql.Add('select @io_no as IO_NO ');

ParamByName('bal_sno' ).AsInteger := MEditBAL_NO.Tag;

ParamByName('sa_sno' ).AsInteger := MeditSA_NAME.Tag;

ParamByName('b_sno' ).AsInteger := MeditB_NAME.Tag;

ParamByName('io_store' ).AsInteger := MeditIO_STORE.Tag;

ParamByName('io_no' ).AsFloat := MeditIO_NO.ValueF;

ParamByName('io_seq' ).AsInteger := 0;

ParamByName('io_date' ).AsDate := MeditIO_DATE.ValueD;

ParamByName('c_sno' ).AsInteger := MeditC_NAME.Tag;

ParamByName('js_sno' ).AsInteger := MeditJS_NAME.Tag;

ParamByName('jb_sno' ).AsInteger := MeditJB_NAME.Tag;

ParamByName('j_sno' ).AsInteger := MeditJ_NAME.Tag;

ParamByName('io_qty' ).AsFloat := MeditIO_QTY.ValueF;

ParamByName('io_price' ).AsFloat := MeditIO_PRICE.ValueF;

ParamByName('io_amt' ).AsFloat := MeditIO_AMT.ValueF;

ParamByName('m_name' ).AsString := MeditM_NAME.Text;

ParamByName('w_whan' ).AsFloat := MeditW_WHAN.ValueF;

ParamByName('io_amt_w' ).AsFloat := MeditIO_AMT_W.ValueF;

if MEditD_DATE.Text = ' - - ' then

ParamByName('d_date' ).AsString := ''

else

ParamByName('d_date' ).AsDate := MEditD_DATE.ValueD;

ParamByName('bal_no' ).AsString := '';//MeditBAL_NO.Text;

ParamByName('bal_gubun').AsInteger := 1; //발주구분:0=일괄,1=개별

ParamByName('chk_inv' ).AsInteger := RadioGroupCHK_INV.ItemIndex;

ParamByName('needj_sno').AsInteger := 0; //소요량계산키

ParamByName('can_qty' ).AsFloat := 0; //취소수량

ParamByName('inv_qty' ).AsFloat := 0; //Invoice수량

ParamByName('ga_qty' ).AsFloat := 0; //가입수량

ParamByName('bad_qty' ).AsFloat := 0; //불량수량

Open;

MEditIO_NO.Tag := FieldByName('IO_NO').AsInteger;

end;

 

 

sqlserver에서 삭제(delete) sql문사용

with Query1 do begin

Close;

Sql.Clear;

Sql.Add('declare @error_cnt numeric ');

Sql.Add('select @error_cnt = 0 ');

Sql.Add('begin tran ');

Sql.Add(' delete from JJ_BALJU where BAL_SNO = :bal_sno');

Sql.Add(' select @error_cnt = @error_cnt + @@error ');

Sql.Add('if @error_cnt = 0 COMMIT else ROLLBACK TRAN ');

Params[0].AsInteger := QueryIO.FieldByName('BAL_SNO').AsInteger;

ExecSql;

end;

 

bitmap을database field로 loading하는 법

TImage 컴포넌트를 이용하거나 그래픽 툴을 이용하거나

프로그램 자체내에 클립보드에 Bitmap 파일을 Copy하는

기능을 가지고 TClipboard에 Bitmap을 Paste하는 것이

바로 이 방법입니다.

 

TTable과 TDataSource, TDBGrid, 그리고 TDBImage정도면

쉽게 구현을 할 수 있습니다.

 

TDBImage에는 PasteFromClipboard 메소드가 있습니다..

이를 이용하여 DB에 Bitmap 이미지를 저장하게 됩니다.

여기에서 DB에 이미지를 저장하기전, Clipboard에서

데이타의 포맷이 어떤 것인지 체크하는 것이 작성한

프로그램에 버그를 없애는데 한 몫을 합니다.

아래 예제는 Clipboard의 데이타 포맷을 체크하고 BITMAP일

경우 TDBImage에 이미지를 Paste하는 예입니다.

 

그리고, 또 한가지 TClipboard 개체를 사용하기 위하여

Clipbrd 유닛을 사용하여야 합니다.

Uses섹션에 추가하는 것을 잊지 맙시다.

Procedure TFrom1.Button1Click(Sender:TObject);

var

C:TClipboard;

Begin

C := TClipboard.Create; // creating TClipboard

Try

If Clipboard.HasFormat(CF_BITMAP) Then // check data format at clipboard

DBImage1.PasteFromClipboard // paste image to DBImage

Else // fail

ShowMessage('Clipboard does not contain a bitmap');

Finally

C.Free; // remove at the memory

End;

End;

 

화면상에 키보드 Down

var b: Byte;

begin

//문자를 숫자로 변환

b:= ord('A');

//키보드 누름

Keybd_Event( B, MapVirtualkey( B, 0 ), 0, 0 );

end;

 

THotKey사용 및 전역HotKey로 등록

//THotKey.HotKey같을 받아서 Key값과 Shift값으로 분리한다.

procedure ShortCutDiv(var Key, Shift: Integer);

begin

Shift:= 0;

if (Key shr 15) = 1 then

begin

Key:= Key xor (1 shl 15);

Shift:= MOD_ALT;

end;

if (Key shr 14) = 1 then

begin

Key:= Key xor (1 shl 14);

Shift:= Shift or MOD_CONTROL;

end;

 

if (Key shr 13) = 1 then

begin

Key:= Key xor (1 shl 13);

Shift:= Shift or MOD_SHIFT;

end;

end;

사용)

//선언부

//HotKey이벤트 발생을 처리

procedure WMHotKey(var Message: TWMHotKey); message WM_HotKey;

var iHotKey; //전역변수로 선언

procedure TFrmMain.WMHotKey(var Message: TWMHotKey);

begin

if Message.HotKey = iHotKey then

begin

//할일

end;

end;

 

//HotKey값을 받아서 RegisterHotKey로 등록한다.

procedure TFrmMain.Button1Click(Sender: TObject);

var k, sc: Integer;

s: string;

begin

k:= HotKey1.HotKey;

ShortCutDiv(k, sc); //Key값과 Shift값을 분리한다.

UnRegisterHotKey(Self.Handle, iHotKey);

iHotKey:= GlobalAddAtom('xxx');

if not RegisterHotKey(Self.Handle,iHotKey, sc, k) then

ShowMessage('HotKey등록 실패');

end;

 

KeyPress 키값

sTmp := IntToStr(Ord(Key));

KeyDown 키값

var

tempstr: string; {used to spell out keys typed}

begin

 

{be sure to set Form.KeyPreview to True}

Edit4.Text := '';

if (Shift = ([ssShift])) then Edit4.Text := Edit4.Text + 'Shift';

if (Shift = ([ssShift, ssAlt])) then Edit4.Text := Edit4.Text + 'Shift+Alt';

if (Shift = ([ssShift, ssCtrl])) then Edit4.Text := Edit4.Text + 'Shift+Ctrl';

if (Shift = ([ssShift, ssAlt, ssCtrl])) then Edit4.Text := Edit4.Text + 'Shift+Ctrl+Alt';

if (Shift = ([ssAlt])) then Edit4.Text := Edit4.Text + 'Alt';

if (Shift = ([ssAlt, ssCtrl])) then Edit4.Text := Edit4.Text + 'Ctrl+Alt';

if (Shift = ([ssCtrl])) then Edit4.Text := Edit4.Text + 'Ctrl';

 

tempstr := '';

case Key of

VK_CANCEL: tempstr := 'CANCEL';

VK_BACK: tempstr := 'BACKSPACE';

VK_TAB: tempstr := 'TAB';

VK_CLEAR: tempstr := 'CLEAR';

VK_RETURN: tempstr := 'ENTER';

VK_PAUSE: tempstr := 'PAUSE';

VK_CAPITAL: tempstr := 'CAPS LOCK';

VK_ESCAPE: tempstr := 'ESC';

VK_SPACE: tempstr := 'SPACEBAR';

VK_PRIOR: tempstr := 'PAGE UP';

VK_NEXT: tempstr := 'PAGE DOWN';

VK_END: tempstr := 'END';

VK_HOME: tempstr := 'HOME';

VK_LEFT: tempstr := 'LEFT ARROW';

VK_UP: tempstr := 'UP ARROW';

VK_RIGHT: tempstr := 'RIGHT ARROW';

VK_DOWN: tempstr := 'DOWN ARROW';

VK_SELECT: tempstr := 'SELECT';

VK_EXECUTE: tempstr := 'EXECUTE';

VK_SNAPSHOT: tempstr := 'PRINT SCREEN';

VK_INSERT: tempstr := 'INS';

VK_DELETE: tempstr := 'DEL';

VK_HELP: tempstr := 'HELP';

{VK_1..VK_0 and VK_A..VK_Z are not defined so you have to use the Ord()

function instead which yields the equivilent VK code}

Ord('0'): tempstr := '0';

Ord('1'): tempstr := '1';

Ord('2'): tempstr := '2';

Ord('3'): tempstr := '3';

Ord('4'): tempstr := '4';

Ord('5'): tempstr := '5';

Ord('6'): tempstr := '6';

Ord('7'): tempstr := '7';

Ord('8'): tempstr := '8';

Ord('9'): tempstr := '9';

Ord('A'): tempstr := 'A';

Ord('B'): tempstr := 'B';

Ord('C'): tempstr := 'C';

Ord('D'): tempstr := 'D';

Ord('E'): tempstr := 'E';

Ord('F'): tempstr := 'F';

Ord('G'): tempstr := 'G';

Ord('H'): tempstr := 'H';

Ord('I'): tempstr := 'I';

Ord('J'): tempstr := 'J';

Ord('K'): tempstr := 'K';

Ord('L'): tempstr := 'L';

Ord('M'): tempstr := 'M';

Ord('N'): tempstr := 'N';

Ord('O'): tempstr := 'O';

Ord('P'): tempstr := 'P';

Ord('Q'): tempstr := 'Q';

Ord('R'): tempstr := 'R';

Ord('S'): tempstr := 'S';

Ord('T'): tempstr := 'T';

Ord('U'): tempstr := 'U';

Ord('V'): tempstr := 'V';

Ord('W'): tempstr := 'W';

Ord('X'): tempstr := 'X';

Ord('Y'): tempstr := 'Y';

Ord('Z'): tempstr := 'Z';

 

VK_NUMPAD0: tempstr := 'Numeric keypad 0';

VK_NUMPAD1: tempstr := 'Numeric keypad 1';

VK_NUMPAD2: tempstr := 'Numeric keypad 2';

VK_NUMPAD3: tempstr := 'Numeric keypad 3';

VK_NUMPAD4: tempstr := 'Numeric keypad 4';

VK_NUMPAD5: tempstr := 'Numeric keypad 5';

VK_NUMPAD6: tempstr := 'Numeric keypad 6';

VK_NUMPAD7: tempstr := 'Numeric keypad 7';

VK_NUMPAD8: tempstr := 'Numeric keypad 8';

VK_NUMPAD9: tempstr := 'Numeric keypad 9';

VK_MULTIPLY: tempstr := 'Multiply';

VK_ADD: tempstr := 'Add';

VK_SEPARATOR: tempstr := 'Separator';

VK_SUBTRACT: tempstr := 'Subtract';

VK_DECIMAL: tempstr := 'Decimal';

VK_DIVIDE: tempstr := 'Divide';

VK_F1: tempstr := 'F1';

VK_F2: tempstr := 'F2';

VK_F3: tempstr := 'F3';

VK_F4: tempstr := 'F4';

VK_F5: tempstr := 'F5';

VK_F6: tempstr := 'F6';

VK_F7: tempstr := 'F7';

VK_F8: tempstr := 'F8';

VK_F9: tempstr := 'F9';

VK_F10: tempstr := 'F10';

VK_F11: tempstr := 'F11';

VK_F12: tempstr := 'F12';

VK_F13: tempstr := 'F13';

VK_F14: tempstr := 'F14';

VK_F15: tempstr := 'F15';

VK_F16: tempstr := 'F16';

VK_F17: tempstr := 'F17';

VK_F18: tempstr := 'F18';

VK_F19: tempstr := 'F19';

VK_F20: tempstr := 'F20';

VK_F21: tempstr := 'F21';

VK_F22: tempstr := 'F22';

VK_F23: tempstr := 'F23';

VK_F24: tempstr := 'F24';

VK_NUMLOCK: tempstr := 'NUM LOCK';

VK_SCROLL: tempstr := 'SCROLL LOCK';

end;

if Edit4.Text = '' then Edit4.Text := tempstr

else if tempstr <> '' then Edit4.Text := Edit4.Text + '+' + tempstr;

Key := 0; {set key to 0 to send no key stroke}

Ctrl -Alt-Del Key Enable/Disable

var

iDummy: Integer;

begin

SystemParametersInfo(97, Word(True), @iDummy, 0); //Disable

SystemParametersInfo(97, Word(False), @iDummy, 0); //Enable

end;

 

728x90
반응형

'Delphi > 프로시저-함수' 카테고리의 다른 글

델파이 Delphi FileExists  (0) 2021.07.11
델파이 Delphi Fillchar  (0) 2021.07.09
델파이 유용한 함수정리 6탄  (0) 2021.07.07
델파이 유용한 함수정리 5탄  (0) 2021.07.06
델파이 유용한 함수정리 3탄  (0) 2021.07.02

댓글