왕초보를 위한 아주 기본적인 Tips
1. 데이터 저장 및 누적
내용 : 메모1에 텍스트를 추가하고 싶을때
memo1.lines.add('추가할 내용');
그리고 데이터 누적
var i,a:integer;
begin
a:=a+i;
end;
2. RGB Color 색상값 이용하기(레드 그린 블루)
Form1.Color:=RGB($FF,$99,$CC); // 분홍색
3. 최소화 비활성화(프로퍼티에도 있음)
Form1.bordericons:=form1.bordericons-[biMinimize];
4. 라벨 글자위치 정가운데
프로퍼티에서 Alignment를 taCenter , Layout을 tiCenter으로 한다.
5. MonthCalendar에서 날짜 클릭시 그 날짜를 에디트박스에 불러온다.
procedure MonthCalendar Click // 달력클릭시
Edit1.text:= DateToStr(call.Date);
6. 에디트박스에 통화표시(콤마) 찍는 방법
Edit2의 이벤트(event)에서 EXIT에다가 아래를 쓴다
Edit2.text:= FormatFloat('#,###,##0',StrToint(Edit2.text);)
Edit2의 이벤트(event)에서 Enter에다가 아래를 쓴다
Edit2.text:= StringReplace(Edit2.Text,',','',[rfReplaceAll]);
또는
Edit2.text:=FloatToStrF(StrToInt(edit1.text),ffnumber,10,0);
// 위 한줄로 끝납니다 Edit1에 있는 숫자를 Edit2에 콤마를 찍어서 표현할 수 있습니다
// FFnumber이나 FFGeneral을 쓰시면 됩니다
7. 한글/영어모드 전환
Edit1.ImeMode:= imHanguel; //한글
Edit1.ImeMode:= imAlpha; //영어
8. MonthCalendar를 오늘 날짜로 셋팅
Procedure Form1.Create 에 사용
MonthCalendar1.Date:= Date;
9. 프로그램 시작시 에디트박스에 초점 맞추기
Procedure Form1.Show // Form1의 이벤트 Show에다가 사용
Edit1.SetFocus;
10. Stringgrid 모든셀 가운데 정렬
-> Form3의 이벤트 중에 DrawCell 이벤트에다가 사용
procedure TForm3.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
pStr: string;
pLeft: integer;
begin
with (Sender as TstringGrid) do
begin
SetTextAlign(handle, ta_left);
pStr := Cells[ACol, ARow];
//모든열 가운데 정렬
begin
pLeft := ((Rect.Right - Rect.Left - Canvas.TextWidth(pStr)) div 2) + Rect.Left;
Canvas.TextRect(Rect, pLeft, Rect.Top + 2, pStr);
end;
end;
end;
11. StringGrid 셀에 내용 넣는 방법
Form1 이벤트 중 Create에 사용
StringGrid1.Cells[0,0]:='셀에 넣을 말';
12. Form2 띄우는 방법(새창 띄우기)
먼저 프로그램 맨위에 uses절에 unit2 를 추가합니다.
button1 이벤트 중 Click에 사용
var AForm:TForm2;
begin
Aform:=TForm2.Create(nil);
try
if Aform.Showmodal = mrOK then
finally
FreeAndNil(Aform);
end;
end;
* showmodal을 쓰면 Form1와 Form2 창 전환이 불가능하다.
* 창이동이 자유롭게 만들려면 아래처럼 하면된다.
procedure TForm1.Button1Click(Sender: TObject);
var
Aform:Tform2;
begin
Aform:=TForm2.Create(nil);
Aform.Show;
end;
13. 에디트박스에서 엔터 치면 창 닫는 방법
Edit1 이벤트 중에 KeyPress에 사용
if Key=#13 then Close;
엔터치면 버튼1 실행하는 방법
if Key=#13 then button1Click(nil);
14. StringGrid 내용을 txt파일에서 로딩&세이브 하는 방법
procedure SaveStringGrid(StringGrid: TStringGrid; const Delimiter: char; const FileName: TFileName);
var
y: integer;
buffer: TStringList;
begin
buffer := TStringList.Create;
try
for y := 0 to StringGrid.RowCount - 1 do
begin
StringGrid.Rows[y].Delimiter := Delimiter;
buffer.Add(StringGrid.Rows[y].DelimitedText);
end;
buffer.SaveToFile(FileName);
finally
buffer.Free;
end;
end;
procedure LoadStringGrid(StringGrid: TStringGrid; const Delimiter: char; const FileName: TFileName);
function GetDelimiterCount(const data: string): integer;
var
x: integer;
begin
result := 0;
for x := 1 to Length(data) do
if data[x] = Delimiter then result := result + 1;
end;
var
y: integer;
buffer: TStringList;
begin
buffer := TStringList.Create;
try
buffer.LoadFromFile(FileName);
StringGrid.RowCount := buffer.Count;
StringGrid.ColCount := GetDelimiterCount(buffer[0]) + 1;
for y := 0 to buffer.Count - 1 do
begin
StringGrid.Rows[y].Delimiter := Delimiter;
StringGrid.Rows[y].DelimitedText := buffer[y];
end;
finally
buffer.Free;
end;
end;
// 저장버튼 수행
procedure TForm3.Button1Click(Sender: TObject);
begin
SaveStringGrid(StringGrid1, '=', 'c:/test.txt');
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
// 파일불러오기
LoadStringGrid(StringGrid1, '=', 'c:/test.txt');
end;
15. ListBox에 항목(items) 추가하기
procedure TForm1.FormCreate(Sender: TObject);
begin
listbox1.Items.Add('항목내용');
end;
16. ListBox에서 선택하면 에디트박스에 글써지는 방법
procedure TForm1.Button1Click(Sender: TObject);
Edit1.text:=Listbox1.items.Strings[listbox1.itemindex];
17. StringGrid 셀 내용 클리어하기
var
index:integer;
begin
with stringgrid1 do
for index:=0 to colcount -1 do
cols[index].clear;
end;
18. StringGrid 맨 아래에 글씨를 고정시키기(예를 들어 합계라는 글씨가 맨아래)
begin
StringGrid1.Cells[0,StringGrid1.rowcount-1]:='합계';
end;
19. StringGrid 셀 합계 구하기
With AdvStringGrid do
begin
Edit1.Text:=FloatToStr(ColumnSum(FixedRows,RowCount-1));
end;
또는
var tmp:Double;
begin
tmp:=0;
for i:=0 to AdvStringGrid.Rowcount -1 do
begin
tmp:= tmp + AdvStringGrid.Floats[1,i];
break;
end;
Edit1.text:=FloatToStr(tmp);
20. 에디트박스(Editbox)에 숫자만 입력 가능하도록 하는 방법
Edit1의 KeyPress 이벤트에 작성
if Key in ['0'..'9','-',#25,#08]=false then
// 마이너스(-), #25는 BackSpace, #08은 방향키
begin
key:=#0;
end;
21 ListBox에서 선택한 것 버튼에서 실행
procedure TForm1.Button1Click(Sender: TObject);
begin
if ListBox1.Selected[0] then // 리스트박스의 맨위에거(0) 선택하면
Showmessage('첫번째것을 고르셨습니다ㅋㅋ');
end;
22. 화면 중앙에 Form1이 뜨도록 하는 방법
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Left:= (screen.width - Form.width) div 2;
Form1.Top:= (screen.Height - Form.Height) div 2;
end;
23. CapsLock 키 자동으로 켜주기
procedure TForm1.FormCreate(Sender: TObject);
var ipkeystate:TKeyboardState;
begin
GetKeyboardstate(ipkeystate);
ipkeystate[VK_CAPITAL]:=1;
SetKeyboardState(ipkeyState)
end;
24. 10진수를 2진수로 바꾸는 방법(2가지)
1) 첫번째
function DecToBinStr(n: integer): string;//10진수를 2진수로
var
S: string;
i: integer;
Negative: boolean;
begin
if n = 0 then
begin
Result := '0';
System.Exit;
end;
Negative := False;
if n < 0 then
Negative := True; // 음수표시
n := Abs(n);
for i := 1 to SizeOf(n) * 8 do
begin
if n < 0 then
S := S + '1' else S := S + '0';
n := n shl 1;
end;
Delete(S,1,Pos('1',S) - 1); //remove leading zeros
end;
2) 두번째
procedure TForm1.Button1Click(Sender: TObject);
var b,v:Integer; s:string;
begin
edit1.MaxLength:=10;
s := '';
v := strToint(Edit1.text);
repeat
if Odd(v) then s := '1' + s // odd(v) : v가 홀수면
else s := '0' + s;
v := v shr 1;
until v = 0;
Edit2.text := s;
end;
25. 10진수를 16진수로 바꾸는 방법
// 컴퓨터가 계산할수 있는 최대값이 2147483647까지임.
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.MaxLength:=9; // 에디트박스를 9까지 제한
edit2.text:=InttoHex(strtoint(Edit1.Text),1);
end;
26. 2진수를 10진수로 바꾸는 방법
function Bin2Dec(BinString: string): LongInt;
var
i : Integer;
Num : LongInt;
begin
Num := 0;
for i := 1 to Length(BinString) do
if BinString[i] = '1' then Num := (Num shl 1) + 1
else Num := (Num shl 1);
Result := Num;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.MaxLength:=10;
Edit2.text:=IntToStr(Bin2Dec(edit1.text));
end;
27. 16진수를 10진수로 바꾸는 방법(최대 7FFFFFFF까지 가능)
begin
edit1.MaxLength:=7;
edit2.Text:=IntToStr(strtoint('$'+edit1.text));
end;
28. *.ini 파일로 저장하고 불러오기 (1/28추가)
1) uses 절에 iniFiles 추가
2) ButtonClick 프로시져 만들기
3) 프로그램
var
ini_fun : TiniFile;
ini_cnt : String;
// ini 파일 생성 코드
ini_fun : TiniFile.Create('Options.ini');
ini_fun.WriteString('설정사항','Records',Edit1.Text);
// ini 파일을 읽어오기
ini_cnt := ini_fun.ReadString('설정사항','Records',Edit1.Text);
* Integer를 읽고 쓰려면 Read자리에 Integer를 쓰고 뒤에있는 파라미터에 Integer형으로 기록한다.
* exe파일이 위치한 폴더에 저장하기
myini := TiniFile.Create(ExtractFilePath(Application.EXEName)+'Save.ini');
29. X(종료) 누르면 종료하시겠습니까? 예/아니오 물어보도록 하기 (1/30추가)
Form의 Object Inspector에서 Events에서
OnCloseQuery라고 있습니다.
OnCloseQuery 프로시져를 만듭니다
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := ( MessageDlg('Exit Now?', mtConfirmation, [mbOk, mbCancel], 0) = mrOk)
end;
30. 버튼 누르면 txt파일 또는 exe파일 열기 실행하기(2/4추가)
버튼 눌렀을때 메모장파일을 열고싶었는데 FileOpen을 이용하는줄알았는데
아래와 같이 한줄로 끝나더군요 ShellExecute 잘알아두면 유용할것 같습니다.
uses 절에
ShellAPI; << 추가해줍니다.
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle,'open','c:\jyc\열고싶은파일.txt',Nil,Nil,SW_ShowNormal);
end;
31. TMainmenu 메뉴 바에 구분선 넣기
Caption 에 - << 이것을 입력하면 됩니다.
32. Cnpack 사용시 도구들 줄임말로 표현되는 것 켜고 끄기
Cnpack 메뉴에서 Prefix Wizard... 메뉴를 클릭하고 Continue 클릭
Settings 로 들어가서 Display Settings의
Enable Modify Prefix Automatically를 체크해제하면 자동줄임말이 취소되고
체크를 하면 자동으로 줄여줍니다.
33. 현재시간 memo1에 표시하기
begin
memo1.Lines.add(ForMatDateTime('YYYY-MM-DD HH:MM:SS',now));
end;
34. Form2에서 Form1 사용하기, 연동시키기
Form1에서 Form2를 사용하려면 uses 절에다가 unit2를 추가 시키면 되지만
거꾸로 Form2에서 Form1을 사용하려면 약간 다릅니다.
Form2 프로그램 맨 위에 보면 implementation 이라고 있습니다
implementation
uses
unit1;
이라고 하면 됩니다. implementation절에 uses unit1;을 추가하면 됩니다.
35. 인터넷 창 크기 조절해서 창띄우기(internet explorer)
uses절에 ComObj를 추가하시고요 아래와 같이 하시면 됩니다.
procedure TForm1.Button1Click(Sender: TObject);
const
strURL ='인터넷주소';
var
IE: Variant;
begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Width := 800;
IE.Height := 600;
IE.Navigate(strURL);
IE.Visible := True;
end;
36. 화면 캡쳐 저장 한번에 하는 프로그램 만들기
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
dc:integer;
begin
Bitmap := TBitmap.Create;
Bitmap.Width := screen.width;
Bitmap.Height := Screen.Height;
// 바탕화면은 0, 원하는 프로그램이 있다면 프로그램 핸들
dc := GetDC( 0 );
BitBlt( Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, dc, 0, 0, SRCCOPY );
ReleaseDC( 0, dc );
Bitmap.SaveToFile('c:\jyc\001.bmp');
end;
37. 폴더추가하기
if DirectoryExists('c:\폴더명')=false then
ForceDirectories('c:\폴더명');
38. for 문 사용하기 // listbox1, listbox 자동선택하기 및 자동삭제
procedure TForm1.Timer1Timer(Sender: TObject); // 타이머1 생성하여 interval=1000으로함
var i:integer;
begin
edit1.Text:=FormatDateTime('hh:mm:ss',now); // 저 같은경우 edit1에 현재시간을 표시함
for i:=0 to listbox1.Items.Count-1 do // for문시작
begin
if Edit1.text=ListBox1.Items.Strings[i] then // edit1과 listbox1 항목이 일치하면
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex + i + 1; // 기본이 0이 선택이기때문에(안보임) +i +1을 해줘야 선택이제대로됌
if ListBox1.Selected[i]=True then // 선택되면
begin
listbox1.DeleteSelected; // 지운다
Break; // 반드시 뷁을 써줘야지 에러가 안생김ㅋㅋ 이거때문에 개고생..-_- for문에는 break를 뷁을 꼭쓰세요
end
end
end;
end;
38. 프로그램 중복 실행 방지(13.05.21 추가)
- 프로그램의 기본이 되는 역할
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 1, 'project1.exe');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageDlg('프로그램이 이미 실행중 입니다. 확인 하십시오.', mtError, [mbOK], 0);
Application.Terminate;
Exit;
end;
end;
39. 프로그램 트레이아이콘으로 최소화시키기(130521 추가)
- 트레이아이콘으로 최소화 / 트레이아이콘에서 마우스 오른쪽 버튼 클릭시 종료
프로그램 거의 맨 위쪽에 보시면
private 라고 있습니다 이곳에다가
procedure WndProc(var Msg: TMessage); override; //<-- 선언
위에것을 넣어줍니다
그리고 그 아래쯤에 var이라는 곳에 아래 것을 넣어줍니다.
var
gTray : TNOTIFYICONDATA; //트레이 구조체선언(전역변수)
그리고 아래것을 프로그램 작성하는 부분에 추가해주세여
procedure TForm1.WndProc(var Msg: TMessage);
begin
if Msg.WParam = SC_MINIMIZE then begin//최소화버튼 눌렀을때 트레이로
ShowWindow( Application.Handle, SW_MINIMIZE ); //테스크바..
gTray.Wnd := Form1.Handle;
gTray.uId := 1;
gTray.uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
gTray.ucallbackMessage := WM_RBUTTONDOWN ;
gTray.hIcon := Form1.Icon.Handle; //폼의아이콘 -> Tray 아이콘
gTray.szTip := '툴팁이랍니다..' + #13#10 + 'ㅎㅎㅎㅎㅎ'; //툴 팁~
ShellApi.Shell_NotifyIcon( NIM_ADD, @gTray );
ShowWindow( Application.Handle, SW_HIDE ); //테스크바에서 사라지게
end
else
begin
case Msg.LParam of
WM_LBUTTONDBLCLK://트레이의 아이콘 좌측더블클릭시
begin
ShowWindow( Application.Handle, SW_SHOW ); // 태스크바에 보이기
ShowWindow( Application.Handle, SW_RESTORE ); // 폼 되돌리기
Shell_NotifyIcon( NIM_DELETE, @gTray ); // 트레이의 아이콘 삭제
end;
end;
case Msg.LParam of
WM_RBUTTONDOWN: //트레이의 아이콘 우측클릭시 종료메세지뜸
begin
ok:=Application.MessageBox('Exit now?','Yes',MB_OKCANCEL);
if Ok=idok then
begin
close;
end;
end;
end;
inherited;
end;
그리고 Form1의 Object Inspector (F11하다보면 나오는 설정하는곳)에서
Icon에다가 *.ico 파일을 설정해줍니다.(트레이아이콘에 표시할 아이콘)
그럼 끝
40. 게이지바 만들기
탭메뉴에 보면 Samples라고 있는데
그곳에 Gauge 게이지라고 있습니다.
폼에 게이지바를 하나 넣고
System에서 Timer 를 하나 넣습니다.
타이머를 더블클릭하시구 아래 게이지가 차도록 넣으시면 됩니다.
타이머 동작할때마다 10%씩 올라갑니다.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Gauge1.AddProgress(10);
end;
41. 폼 닫을 때 오류 발생 원인 및 해결
Form1과 Form2가 있을때
Form2를 메인폼으로 사용하고 Form1을 자녀?폼으로 사용하면
Form1을 X표 눌러서 종료해도 Form1 메인폼은 닫히지가 않는다
이유는 X표를 눌러 종료하려면 메인폼을 종료해야하기 때문이다.
Close; 를 사용해도 현상이 해결되지 않는이유다.
이때는 이것을 사용해야한다.
자녀폼에서 종료를 하고 싶을때
Form1 (자녀폼)에서 이벤트 중에
procedure TForm1.Onclose 에다가
Application.Terminate;
이걸 추가해주면 해결 된다.
42. Ctrl+A Ctrl+C Ctrl+V 컨트롤C 컨트롤A 모두선택 복사 아스키코드 구현하기 (13.05.23 추가)
memo1 에서 메모장처럼 컨트롤 A를 하면 안먹힙니다.
이럴땐 아스키코드를 이용해야하는데..
#1 은 Ctrl+A를 뜻합니다
#3 은 Ctrl+C를 뜻합니다
1,2,3,,,, 차례대로 A,B,C,D... 이죠.
아래는 소스입니다.
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #3 then
begin
Memo1.CopyToClipboard;
end;
if Key = #1 then
begin
memo1.SelectAll;
end;
end;
43. 폼에 마우스로 그림 그리기, 마우스 움직이면 그림 그려지는 것
폼에 마우스를 올리고 왔다갔다하면 그림이 그려지는 소스입니다.
폼 이벤트 중 mousemove에다가 아래를 집어넣으세요.
rect안의 숫자를 크게할 수록 큰 브러쉬가 됩니다.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Canvas.Brush.Color:=clblack;
Canvas.FillRect(Rect(x,y,x+3,y+3));
end;
44. 파일이 존재하지 않을 시 파일을 생성
if not FileExists('me.txt') then
begin
CreateFile('me.txt'), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_ALWAYS, 0, 0);
end;
45. 메모(memo)를 txt파일로 저장하기
begin
memo1.Lines.SaveToFile('me.txt);
end;
46. OpenDialog1에서 Listbox로 여러파일 불러오기 (13.07.12 추가)
OpenDialog1 Option에서 ofAllowMultiSelect = True하고.
if OpenDialog1.Execute then
begin
for i := 0 to OpenDialog1.Files.Count - 1 do
begin
Listbox.items.Add(OpenDialog1.Files[i]);
end;
end;
'Delphi Tip > +Tip' 카테고리의 다른 글
Delphi Tip (0) | 2022.03.24 |
---|---|
안드로이드에서 MessagDlg 사용방법(주의 점) (0) | 2022.03.11 |
윈도우 포커스 및 최상위로 올리기/활성화 (0) | 2022.02.23 |
외부 프로그램 실행하고 대기하기 (0) | 2022.02.22 |
시스템 대기모드/화면 보호기/모니터 끄기 이벤트 감지하기 (0) | 2022.02.17 |
댓글