본문 바로가기

전체 글

(88)
[일반/컴포넌트] TEdit 입력이 최대 길이를 벋어나면 focus 이동 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure FormCreate(Sender: TObject); private { Private declarations } procedure WMCommand(var Msg: TWMCommand); message WM_COMMAND; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} // ..
[데이터베이스] Query.RecordCount = -1 사용하는 DB가 로컬에 있는 XBase계열(DBase, Paradox)의 DB라면 이런 문제가 없지만 원격지의 DataBase이라면 이런 문제가 발생합니다 결론부터 말씀드리면 버그는 아니고 TDataSet의 특징입니다 RecordCount는 로컬에 fetch한 레코드의 개수를 세기 때문입니다 BDE는 data-fetching 메커니즘이 있어서 만약 질의한 레코드 갯수가 많을경우 화면의 DBGrid에 한번에 20 개만 보인다면 화면스크롤시 모래시계가 중간중간에 보일겁니다 (DBGrid가 아니더라도 마찬가지 입니다) 즉 질의를 했다고 해서 자료를 다 가지고 오는것이 아니라 중간중간에 필요한 페이지단위로 가져오는 것입니다 그래서 RecordCount가 -1 이라는건 모든 자료를 fetch 하지 않아서 그렇습니..
[일반/컴포넌트] TStringGrid 인쇄하기 procedure PrintGrid(sGrid: TStringGrid; sTitle: String); var X1, X2 : Integer; Y1, Y2 : Integer; TmpI : Integer; F : Integer; TR : TRect; begin Printer.Title:=sTitle; Printer.BeginDoc; Printer.Canvas.Pen.Color:=0; Printer.Canvas.Font.Name:='Times New Roman'; Printer.Canvas.Font.Size:=12; Printer.Ccnvas.Font.Style:=[fsBold, fsUnderline]; Printer.Canvas.TextOut(0, 100, Printer.Title); For F:=1 to ..
[일반/컴포넌트] Outlook Express 설치여부 알아내기 First you will have to add Registry.pas to your unit's uses clause. Next I made a procedure to check if Outlook Express exists and declared it in the TForm1 private area, you can just add it to the same TButton.OnClick event if you wish. When using the registry, first you need to create an instance of TRegistry. Next you need to set the RootKey. Then you will open the key that you want to open. ..
[일반/컴포넌트] ListView에 확장자별 아이콘 넣기 확장자별로 ListView에 아이콘을 넣는 방법입니다. SHGetFileInfo 함수를 이용하면 확장자 정보를 가져 와서 이미지 아이콘을 가져올 수 있지만, 반드시 파일이 로컬에 존재해야만 확장자 아이콘을 가져올 수 있습니다. 그래서, 생각해 낸 것이 이 방법입니다. 임시로 파일을 생성한 후에 임시파일을 ReName시켜 사용합니다. ListView에서 넣고자 하는 확장자 정보가 실제 파일이 없더라도 해당 확장자 아이콘을 넣고자 할 때 유용하게 쓰일 수 있을 겁니다.(사실은 임시파일을 생성하니깐 있는 건가? ^^;) Constructor TEdmListView.Create(AOwner:TComponent); var i: Integer; Path: array [0..260] of Char; Stream: T..
[데이터베이스] BDE Alias 없이 Database 동적으로 연결하기 Database 를 BDE Alias 없이 프로그램 로딩 시에 셋팅하는 방법입니다. 아래 예제는 오라클 사용 시 방법입니다. 다른 DBMS 사용의 경우 Driver명만 바꾸어 주면 됩니다. var Database: TDatabase; sqlProcess: TQuery; procedure Form1.FormShow(Sender: TObject); begin Database := TDatabase.Create(Self); Database.DatabaseName := 'HOWTO'; Database.DriverName := 'ORACLE'; Database.Params.Add('SERVER NAME=ORA_SERVER'); Database.Params.Add('NET PROTOCOL=TCP/IP'); Data..
[네트웍/인터넷] Winsock WriteFile and Overlapped IO procedure SendToSocket(Sock : TSocket; Data : PaData; Len : Integer); var Overlap : OVERLAPPED; BytesWritten : DWord; BytesSend : Integer; begin { create overlapped structure with controlling event } FillChar(OverLap, SizeOf(OVERLAPPED), 0); OverLap.hEvent := CreateEvent(nil, True, False, ''); if OverLap.hEvent = 0 then { event is not created } RaiseLastWin32Error; try BytesSend := 0; while Byte..
[시스템] 마우스 아래의 윈도우 핸들 구하기 // 아래처럼 타이머를 사용하지 않고 마우스 후킹을 사용하면 좀더 간결한 프로그램을 만들 수 있습니다 // SetWindowsHookEx(WH_MOUSE,...) 를 찾아보세요 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations..