[MS-SQL] DATETIME 변환 데이타베이스


0Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 0)
102/22/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 1)
206.02.22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 2)
322/02/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 3)
422.02.06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 4)
522-02-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 5)
622 Feb 06CONVERT(CHAR(9), CURRENT_TIMESTAMP, 6)
7Feb 22, 06CONVERT(CHAR(10), CURRENT_TIMESTAMP, 7)
816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 8)
9Feb 22 2006 4:26:08:020PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 9)
1002-22-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 10)
1106/02/22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 11)
12060222CONVERT(CHAR(6), CURRENT_TIMESTAMP, 12)
1322 Feb 2006 16:26:08:020CONVERT(CHAR(24), CURRENT_TIMESTAMP, 13)
1416:26:08:037CONVERT(CHAR(12), CURRENT_TIMESTAMP, 14)
202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)
212006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 21)
2202/22/06 4:26:08 PMCONVERT(CHAR(20), CURRENT_TIMESTAMP, 22)
232006-02-22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 23)
2416:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 24)
252006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 25)
100Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 100)
10102/22/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 101)
1022006.02.22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
10322/02/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 103)
10422.02.2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 104)
10522-02-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 105)
10622 Feb 2006CONVERT(CHAR(11), CURRENT_TIMESTAMP, 106)
107Feb 22, 2006CONVERT(CHAR(12), CURRENT_TIMESTAMP, 107)
10816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 108)
109Feb 22 2006 4:26:08:067PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 109)
11002-22-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 110)
1112006/02/22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 111)
11220060222CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)
11322 Feb 2006 16:26:08:067CONVERT(CHAR(24), CURRENT_TIMESTAMP, 113)
11416:26:08:067CONVERT(CHAR(12), CURRENT_TIMESTAMP, 114)
1202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 120)
1212006-02-22 16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 121)
1262006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 126)
1272006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 127)
13024 ???? 1427 4:26:08:080PMCONVERT(CHAR(32), CURRENT_TIMESTAMP, 130)
13124/01/1427 4:26:08:080PMCONVERT(CHAR(25), CURRENT_TIMESTAMP, 131)
 
예) reg_date between CONVERT(CHAR(23), '2009-09-23 00:00:00', 25) and CONVERT(CHAR(23), '2009-09-23 23:59:59', 25)


MySQL 명령어 정리 데이타베이스

MySQL 명령어 정리

MySQL의 기본 명령어와 SQL문 정리. 내가 RDBMS에 완전 문외한이기 때문에 기본 SQL쿼리까지...
Redhat Linux 7.3, MySQL 3.23.58 에서 테스트함.
설치는 Redhat 기본 제공 RPM으로 했다.

데이터베이스 접속

          $ mysql -u 사용자명 -p dbname
설치 직후에는 root 사용자에 비밀번호가 없으므로 다음과 같이 접속하여 MySQL을 관리할 수 있다.
          $ mysql -u root mysql


 

비밀번호 변경

MySQL을 설치한 직후에는 root 계정에 암호가 지정되어 있지 않다.
다음 세가지 방법으로 비밀번호를 변경 할 수 있다.


 

  • mysqladmin이용.

              $ mysqladmin -u root password 새비밀번호
  • update문 이용

              $ mysql -u root mysql

    mysql> UPDATE user SET password=password('새비밀번호') WHERE user='root';
    mysql> FLUSH PRIVILEGES;
  • Set Password 이용

              SET PASSWORD FOR root=password('새비밀번호');

일단 root 비밀번호가 설정된 상태에서는 mysql이나 mysqladmin 명령을 실행할 때 -p 옵션을 붙여주고 기존 비밀번호를 입력해야만 한다.


 

사용자 추가/삭제

          mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@localhost IDENTIFIED BY 'password';
username 이라는 사용자를 password라는 비밀번호를 갖도록 하여 추가한다. username은 dbname이라는
데이타베이스에 대해 모든 권한을 가지고 있다.
username 사용자는 로칼 호스트에서만 접속할 수 있다. 다른 호스트에서 접속하려면
          GRANT ALL PRIVILEGES ON dbname.* TO username@'%' IDENTIFIED BY 'password';
위를 또한 번 실행한다. '%'에서 홑따옴표를 주의한다.


 

불필요한 사용자 삭제는
          mysql> DLETE FROM user WHERE user='username';
mysql> FLUSH PRIVILEGES;


 

데이터베이스 생성/보기

  • 데이터베이스를 생성하고,

              mysql> CREATE DATABASE dbname;
  • 현재 존재하는 데이터베이스 목록을 보여준다.

              mysql> SHOW DATABASES;
  • 특정 데이타베이스를 사용하겠다고 선언한다.

              mysql> USE dbname;
  • 쓸모 없으면 과감히 삭제한다.

              mysql> DROP DATABASE [IF EXISTS] dbname;
    IF EXISTS 옵션은 비록 데이타베이스가 없더라도 오류를 발생시키지 말라는 의미이다.

테이블 생성/보기

  • 테이블을 생성하고,

              mysql> CREATE TABLE tablename (
    column_name1 INT,
    column_name2 VARCHAR(15),
    column_name3 INT );
  • 현재 데이타베이스의 테이블 목록을 보고

              mysql> SHOW TABLES;
  • 테이블 구조를 살펴본다.

              mysql> EXPLAIN tablesname;
    혹은
    mysql> DESCRIBE tablename;
  • 이름을 잘못 지정했으면 이름을 변경할 수도 있다.

              mysql> RENAME TABLE tablename1 TO tablename2[, tablename3 TO tablename4];

  • 필요 없으면 삭제한다.

              mysql> DROP TABLE tablename;

현재 상태 보기

          mysql> status

--------------
mysql Ver 11.18 Distrib 3.23.58, for pc-linux (i686)

Connection id: 26
Current database: study
Current user: study@localhost
Current pager: stdout
Using outfile: ''
Server version: 3.23.58
Protocol version: 10
Connection: Localhost via UNIX socket
Client characterset: latin1
Server characterset: euc_kr
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 2 hours 9 min 59 sec

Threads: 1 Questions: 160 Slow queries: 0 Opens: 28 Flush tables: 1
Open tables: 1 Queries per second avg: 0.021
--------------


 

INSERT

          mysql> INSERT INTO tablename VALUES(값1, 값2, ...);
혹은
          mysql> INSERT INTO tablename (col1, col2, ...) VALUES(값1, 값2, ...);


 

SELECT

          mysql> SELECT col1, col2, ... FROM tablename;
컬럼명을 *로 하면 모든 컬럼 의미.
          mysql> SELECT col1 AS '성명', col2 AS '국어점수' FROM grade;
컬럼의 이름을 바꿔서 출력.
          mysql> SELECT * FROM tablename ORDER BY col1 DESC;
mysql> SELECT col1, korean + math english AS '총점' FROM tablename ORDER BY '총점' ASC;
DESC는 내림차순 ASC는 오름차순.
          mysql> SELECT * FROM grade WHERE korean < 90;
조건줘서 SELECT.


 

UPDATE

          mysql> UPDATE tablename SET col1=새값 WEHER 조건


 

DELETE

          mysql> DELETE FROM tablename WEHRE 조건          

 

MySql 명령어

 

1. 기본 명령어


    //-- 데이터 베이스 리스트 보기
mysql> Show Databases;
    //-- 데이터 베이스 사용하기
mysql> Use Test;
    //-- 데이터 베이스 내의 테이블 보기
mysql> Show Tables;

    //-- 데이터 베이스 생성하기

mysql>create database tradementor;

    //-- 테이블 삭제 하기

mysql> drop table testtable1;

 

2. 사용자 등록 & 권한 설정 ( select, insert, update, delete, create, drop )

 

- INSERT 구문사용하기 ( Root 권한으로 설정됨 )

mysql>INSERT INTO user (Host, User, Pasword) VALUES('localhost', 'trade', PASSWORD('mentor'));


mysql>INSERT INTO db VALUES('%', 'tradementor', 'trade', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');
mysql>FLUSH PRIVILEGES;

 

- GRANT 구문사용하기


 //- localhost 에서 trade사용자에게 모든 데이터베이스의 모든 권한생성 password : mentor
mysql> grant all on *.* to 'trade'@'localhost' identified by 'mentor';
 //- localhost 에서 trade사용자에게 tradementor 데이터베이스의 모든 권한생성 password : mentor
mysql> grant all on tradementor.* to 'trade'@'localhost' identified by 'mentor';
 //- localhost 에서 trade사용자에게 tradementor 데이터베이스의 select 권한생성 password : mentor
mysql> grant select on tradementor.* to 'trade'@'localhost' identified by 'mentor';
 //- localhost 에서 trade사용자에게 tradementor 데이터베이스의 update 권한생성 password : mentor
mysql> grant update on tradementor.* to 'trade'@'localhost' identified by 'mentor';
 //- localhost 에서 trade사용자에게 tradementor 데이터베이스의 select,update 권한생성 password : mentor
mysql> grant select,update on tradementor.* to 'trade'@'localhost' identified by 'mentor';
mysql> flush privileges;

 


3. Mysql 원격 접속 설정


- Mysql은 기본적으로 localhost용으로 셋팅되어 있어 리모트로 접속할경우 아래와 같이
  권한설정을 해줘야 한다..
mysql> grant all privileges on DB명.* to 아이디@접속아이피 identified by '패스워드';
mysql> flush privileges;

 

전체 아이피에 대해 접속을 허용할경우 접속아이피 대신 '%' 로 설정한다.

 

4. Root PassWord 분실시

 

1. # killall mysqld

2. #/usr/local/mysql/bin/mysqld_safe --skip_grant &   (패스워드 없이 접근이 가능하도록)

3. # mysql

4. mysql> connect mysql;    (root의 패스워드 수정할 때)

5. mysql> update user set password=password('new-password') where user='root'

6. mysql> flush privileges;

7. mysql> quit;

8. # killall mysqld

9. #/usr/local/mysql/bin/mysqld_safe &

 

5. backup


   mysqldump -uID -p (TABLE명 혹은 DB명) > 백업할 파일이름.sql
   // local 호스트가 아닌경우 호스트를 지정
   mysqldump -h192.168.11.10 -uID -p (TABLE명 혹은 DB명) > 백업할 파일이름.sql
   // 일반 port가 아닌 포트를 지정한 경우 socket 옵션
   mysqldump --socket=(소켓모듈) -uID -p (TABLE명 혹은 DB명) > 백업할 파일이름.sql
   // 테이블 구조만 백업받기
   mysqldump -h host -u user -ppassword -d database > script.sql

 

6. restore

 

   mysql -hDB서버명 -u유저명 -p패스워드 [복구할 테이터베이스명] < [외부로 저장된 파일명]


[펌]집주인이 전세금을 안돌려줄때 대처법 잡동사니

저는 지난 8월말에 전세계약이 만료되었으나 집주인이 1개월 동안 전세금을 반환해주지 않아서 출국이 1개월 가량 늦어졌고, 그 사이에 환율상승으로 환차손을 약 20% 정도 입었던 사람입니다(혹시 이런  피해도 소송을 통해서 피해보상 받을 수 있는지, 아시는 분은 알려주시면, 대단히 감사하겠습니다).

 

해외로 나온지 3개월이다되어가는 현시점에 제가 살던 동네 집값을 검색해보니 아직도 그대로이더군요. 하루빨리 과도한 부동산 거품이 빠져야, 국가전체적으로나 대다수 집없는 사람들에게 좋을텐데, 가격이 그대로라는 것은 실망스러웠습니다.

 

또한 저의 개인적인 희생으로 끝나버리는 것이 너무 아쉽기도 하고 제가 알려드리는 방법대로 하면 한국의 부동산 거품하락에 조금이라도 기여할 수 있을 것으로  생각되어 글을 올립니다. 자 시작해 보겠습니다.

 

  

전세기간이 만료되어도 집주인이 전세금을 안돌려주는 이유는 딱 3가지 입니다.

 

1) 남에게 돈을 빌려서 돌려주면 이자부담이 생긴다. 그래서 싫다.

2) 이전가격보다 전세가를 저렴하게 내놓으면 그 차액을 집주인이 부담해야 한다. 그래서 싫다.

3) 집을 팔아서 돈을 돌려주면 된다. 그러나 비싸지 않으면 안팔겠다.

 

이것을 한마디로 정리하면, 집주인은 절대 손해보기 싫다것입니다.  그래서 집주인들은 어영부영 현 세입자가 그 가격에 그대로 눌러살거나 그 가격에 다른 세입자가 나타나면 돈 받아 나가라고 하면서 전화도 안받고 편지를 보내도 폐문부재로 되돌아 오지요.

 

이런 경우를 당하는 분들이 부지기 수인데 대부분  잘몰라서 그냥 당하는 경우가 많고 개인의 문제로 생각하고 말기 때문에 집값하락시에 충분한 집값하락을 부추기는 힘으로 작용하지 못하고 끝납니다. 우선 절차를 살펴보기로 합니다.

  

1) 계약기간 만료 최소 1개월 전에는 집주인에게 내용증명(우체국에 신청)으로 계약만료와 함께 이사하겠다는 의사를 분명히 통보한다(내용증명은 세입자의 이사간다는 의사를 우체국을 경유하여 집주인에게 통보하였음을  국가가 보증한다는 형식임).

 

2) 계약만료일이 지나면 바로 그 다음날 임차권등기를 신청한다. 임차권등기라는 것은 한마디로 집에 대하여 세입자가 그 집을 압류하는 것과 같습니다. 비용은 2만원 약간 더 듭니다. 가까운 법원으로 가세요.

 

3) 약 2주 후면 임차권등기가 실제로 등기소에 설정되었는지 확인한다. 그 이후에는 이사를 가도 되고 주민등록을 모두 옮겨도 그 집은 세입자의 허락없이 거래가 불가능한 상태가 됩니다. 대부분 집주인들은 임차권이 설정되면 무슨 수를 써서라도 전세금을 마련하려고 노력하게 됩니다 --> 바로 이 싯점에서 집주인들이 요즘과 같이 돈을 구하기 어려우면 급매로 집을 내놓게 되어 집값 하락이 유도되는 것입니다.  

 

4) 임차권이 설정되었음에도 돈이 돌아올 기미가 없으면 가까운 지방법원에 '전세금 반환소송'을 신청한다. 모르면 인터넷 검색하여 '전세금반환'을 치면 법무사들이 친절히 설명해줍니다. 돈도 몇푼 안듭니다.

 

다른 소송이나 다툼과 달리 전세계약위반사건은 집주인의 일방적이고 명백한 불법행위에 관한 것이기 때문에 단 한건도 세입자가 지는 경우가 전무합니다. 법무사를 통하든 직접하든 전세금반환소송은 길어야 6개월이고 그것이 끝나면 그동안 못받은 전세원금 +매월 이자 20%씩 되돌려 받게되고 법무사, 변호사 등 소송비용 전부를 집주인이 토해내야 합니다.

 

5) 만일 그럼에도 돈을 안주면 바로 경매신청하여 그 집을 매각한다물론 세입자가 사고 싶으면 참여해도 된다.

 

그러나 세입자들이 바보같이 가만히 앉아 있으니 집주인들은 요즘과 같이 집값이 하락하는 시기에 전세금 돌려줄 돈도 없으면서 버티면서 집을 안팔고 버티기 때문에 정상적인 시장질서가 왜곡되고 있다는 것을 말씀드립니다.

 

세입자분들이 위 절차만 잘 따라주면 현재 대한민국의 과도한, 부동산 거품을 터뜨리는데 상당히 기여할 수 있습니다. 꼭 사용하십시오.


emoticons 잡동사니

COMMONLY USED EMOTICONS

:-) Your standard smiley face. User is happy, or just made a mildly sarcastic comment
:-( Sad face
;-) Winky face - expressing a flirtatious or sarcastic remark.
:-> User just made an especially mean or sarcastic comment - more powerful than :-) or ;-)
>:-)Grinning devil - either the user is a Marilyn Manson fan or they justmade an extremely devilish comment. More powerful than :->.
>;-> Winking devil - Eep! User just made a very, very mean or evil comment. Strongest of them all.
O:-) User is angelic/just made a sweet and innocent remark
:-O Yelling or shocked. Can be typed in bold for extra impact.
:-I Indifferent

NOT QUITE AS COMMONLY USED EMOTICONS

:^) Profile smiley.
=) Variation on a classic.
#-) What a night!/has been staring at a computer screen for 5 hours straight
:-$ Put your money where your mouth is!
:-P or :-p or :-6 Sticking tongue out (Na, na, na na na!)
:-P~~ Blowing a raspberry
:-9 Yum!
:-@ Screaming/swearing/about to hurl
:*) Drunk
:-# or :-X An emoticon of many meanings - being smacked in the mouth/wears braces/kiss/my lips are sealed
8-) or B-) or ::-) Wearing glasses
B:-) Wearing glasses on head
R-) Broken glasses
(:-) Bald/wearing a bike helmet
:-{} Wears lipstick
{:-{) Has a moustache and a toupee
@:-) Wears a turban
$-) Yuppie/just won a large sum of money
:-T Keeping a straight face/tight lipped
:-y Said with a smile
:'-( or :~-( Crying
:-Q or :-! Smoker
%-/ Hangover
|-O Bored/yawn
=:-) Hosehead/punk
:-D Big mouth/grinning
:+) Big nose
[:-) Walkman
;^) Smirking
(:-D Blabbermouth
:-& Tongue tied
:-S Just made a statement that didn't make sense
:-/ Skeptical
:-C Very, very sad
%-/ braindead
<:-| Dunce/just made a stupid statement
:-8( Condescending
8-# Dead
:@ or :{ What?
[]:* Hugs & kisses!
@>-->-- A rose
8:] A gorilla
^_^ A cute li'l anime type thing, viewed from front
+-<:-) The pope
*<|:o)> Santa Claus
:-% A banker
:-: A mutant
(-:|:-) Siamese twins
C):-O
C):-O
C):-O
C):-O A barbershop quartet
3:-o A cow
8:-) A pig/a little girl
:\/ A woodpecker
.-) One eye
,-) One eye, and it's winking
':-) One eyebrow
,:-) Same, but it's the other eyebrow
#:-) Messy hair/fur hat/crew cut
&:-) Curly hair
C=:-) A chef
><:>== A turkey
><:>==O A butterball turkey
:=) Two noses
:_) Broken nose/nose is sliding off face/a boxer who got hit one too many times
<<<<<<:-) a hat salesman
p:-) Wearing a baseball cap
:-[ A vampire
:-] A happy vampire
:-E A bucktoothed vampire
:-F A bucktoothed vampire with one tooth missing
(:I An egghead
p:-) Baseball fan
(-) Needs a haircut
[:] A robot
>>:-) A klingon
:-? Smokes a pipe
:-----} Liar!/Pinnochio
!-( Black eye
#^%&*@$:-) A schizophrenic
:-|:-| Deja vu
><*:oDX A clown
~:o A baby
P-) A pirate
{:-) Toupee
:<) From an ivy league school
O-) Scuba diver
:-' Spitting
@== Pro nuclear war
3:] My pet smiley!
3:[ My pet smiley doesn't like you

델파이를 쓰며 얻은 20개의 팁들 프로그래밍

1. 임시 스트링 리스트 사용


임시 스트링 리스트를 사용하는 것이 어떤경우 훨씬
빠른 결과를 나타낼 수 있다.

ListBox1.Clear;
Ini := TIniFile.Create('win.ini');
ReadSection('Colors', ListBox1.Items);
Ini.Free;

위와같이 하는 대신에 이렇게 해 보자.

StrList := TStringList.Create;
ListBox1.Clear;
Ini := TIniFile.Create('win.ini');
ReadSection('Colors', StrList);
Ini.Free;
ListBox1.Items.Assign(StrList);
StrList.Free



2. 리소스로부터 비트맵 로드.

MyBitmap.Handle := LoadBitmap(HInstance, 'BITMAPID');

물론 이 전에 RES파일을 실행파일에 구겨넣어야 한다.
{$R MYSTUFF.RES}



3. 폼위에 있는 컴포넌트의 갯수 찾기

폼위에 몇개의 컴포넌트가 있는지 알고 싶다면,
ComponentCount메소드를 사용하면 된다. 예를들어
아래의 코드는 폼위에 있는 모든 판넬의 색깔을
파랗게 바꾼다.

procedure TForm1.Button1Click(Sender: TObject);
var
a : Integer;
begin
for a:= 1 to ComponentCount do
if Components[a-1] is TPanel then
TPanel(Components[a-1]).Color := clBlue;
end;



4. 컴포넌트를 이름으로 찾기.

FindComponent 메소드를 사용하면, 컴포넌트를 이름으로
찾을 수 있다. 아래 예제는 에디트박스에 나타난 이름으로
컴포넌트를 찾고, 그 색깔을 바꾸고 있다.

procedure TForm1.Button1Click(Sender: TObject);
var
MyComponent : TComponent;
begin
MyComponent := FindComponent(Edit1.Text);
if MyComponent is TPanel then
TPanel(MyComponent).Color := clBlue;
end;



5. 프로그램의 메모리 요구를 줄이기.

프로그램이 OLE를 사용하지 않는다면 이렇게 해 보자

FreeLibrary(GetModuleHandle('OleAut32'));

노턴유틸리티에 의하면, 델파이 프로그램은 실행시
1메가 이상의 메모리를 차지한다고 한다.
위의 코드를 수행함으로써 OleAut32.dll과 OLE32.Dll이
사용하는 만큼의 메모리를 아낄 수 있다.



6. 마우스의 동작범위 제한하기

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
R : TRect;
begin
R := BoundsRect;
InflateRect(R,-30,-30);
ClipCursor(@R);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ClipCursor(Nil);
end;



7. 네모나지 않은 폼 만들기

아래의 소스는 폼을 타원형으로 만들어 준다.

procedure TForm1.FormCreate(Sender: TObject);
var
R : HRgn;
begin
R := CreateEllipticRgn(-15,-15,Width+15,Height+15);
SetWindowRgn(Handle,R,True);
end;



8. 현재 시스템의 언어체계 알기 (한/영 윈도 판단)

시스템에 설치된 IME의 버전을 알아내는 루틴이다.

setlength(s, Max_PAth);
VerLanguageName(GetSystemDefaultLangID, PChar(S), max_path);
SetLength (S, StrLen (PChar(S)));
caption := s;


9. 데스크탑의 위치 알아내기. (델 2.01 이상)

uses 문에 Shlobj를 포함시키고...

var
s : String;
PIDL : PItemIDList;
begin
SetLength(S, MAX_PATH);
SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, PIDL);
SHGetPathFromIDList(PIDL, PChar(S));
SetLength (S, StrLen (PChar(S)));
Caption := s;
end;

아래는 상수의 목록이다.
CSIDL_DESKTOP = $0000;
CSIDL_PROGRAMS = $0002;
CSIDL_CONTROLS = $0003;
CSIDL_PRINTERS = $0004;
CSIDL_PERSONAL = $0005;
CSIDL_FAVORITES = $0006;
CSIDL_STARTUP = $0007;
CSIDL_RECENT = $0008;
CSIDL_SENDTO = $0009;
CSIDL_BITBUCKET = $000A;
CSIDL_STARTMENU = $000B;
CSIDL_DESKTOPDIRECTORY = $0010;
CSIDL_DRIVES = $0011;
CSIDL_NETWORK = $0012;
CSIDL_NETHOOD = $0013;
CSIDL_FONTS = $0014;
CSIDL_TEMPLATES = $0015;


10. Set 변수 조작..

Set 변수에서 +, -조작은 바람직 하지 못하다.
대신에 Include(), Exclude() 를 사용하자!!!


11. 컴포넌트 위의 마우스 존재여부

Controls.Pas 에 나와있는 컴포넌트 메시지를 이용한다.

마우스가 컨트롤 안에 들어오면 CM_MOUSEENTER 가 발생하고,
반대로 커서가 밖으로 나가면 CM_MOUSELEAVE가 발생한다.
컴포넌트의 메소드로 다음을 추가합니다.

procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

그런 다음 함수의 구현부에서

procedure TMyCompo.CMMouseEnter(var Message: TMessage);
begin
TForm(parent).Caption := '들어왔네!';
end;

procedure TMyCompo.CMMouseLeave(var Message: TMessage);
begin
TForm(parent).Caption := '나갔네!';
end;

아버지의 캡션 즉 폼의 캡션에 상태가 나타나게 된다.


12. 스트링에서 원하는 캐릭터 삭제

function CharDelete(Const Str : String ; Const C : Char) : String;
var
Temp : String;
begin
Temp := Str;
while Pos(C,Temp) > 0 do Delete(Temp,Pos(C,Temp),1);
Result := Temp;
end;


13. 스트링 그리드에서 오른쪽 정렬.

StringGrid의 DrawCell 이벤트를 아래와 같이 작성한다.

procedure TForm1.StringGrid1DrawCell(Sender:TObject; Col,Row:Longint,
Rect:TRect; State:TGridDrawState);
var oldalign : word;
begin
if (row=0) or (col<2) then
stringGrid1.canvas.font.style := StringGrid1.canvas.font.style +
[fsbold];
if col<>1 then
begin
oldalign:=settextalign(StringGrid1.canvas.handle,ta_right);
StringGrid1.canvas.textrect(rect,rect.right-2,rect.top+2,
StringGrid1.cells[col,row]);
settextalign(StringGrid1.canvas.handle,oldalign);
end
else
StringGrid1.canvas.textrect(rect,rect.left+2,rect.top+2,
StringGrid1.cells[col,row]);
StringGrid1.canvas.font.style := StringGrid1.canvas.font.style-[fsbold];
end;


14. 파일의 날짜와 크기.

(*----------------------------------------------------------------------------
*)
function SizeOfFile(const FileName: String): LongInt;
// 파일 이름으로 파일의 크기 알아내기.
(*----------------------------------------------------------------------------
*)
var fd : TWIN32FindData;
hFind : THandle;
begin
Result := 0;
try
hFind := FindFirstFile(pChar(FileName), fd);
if (hFind <> INVALID_HANDLE_VALUE) and
((fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0) then
Result := fd.nFileSizeLow;
finally
windows.FindClose(hFind);
end;
end;

(*----------------------------------------------------------------------------
*)
function DateOfFile(const FileName: String): String;
// 파일의 날짜를 스트링으로 반환.
(*----------------------------------------------------------------------------
*)
var
FileHandle : THandle;
begin
Result := '';
try
FileHandle := FileOpen(FileName, fmOpenRead);
if FileHandle > 0 then
Result := DateToStr(FileDateToDateTime(FileGetDate(FileHandle)));

finally
FileClose(FileHandle);
end;
end;

(*----------------------------------------------------------------------------
*)
function IconOfFile(const FileName : String; IconID : Integer) : THandle;
// 아이콘의 핸들을 리턴하는 함수.
// IconID = SHGFI_LARGEICON : 32X32, SHGFI_SMALLICON : 16X16
(*----------------------------------------------------------------------------
*)
var
SHFileInfo : TSHFileInfo;
begin
SHGetFileInfo(PChar(FileName), 0, SHFileInfo, SizeOf(SHFileInfo),
IconID or SHGFI_ICON);
Result := SHFileInfo.hIcon;
end;


15. DC를 스크롤 하기..
The ScrollDC function scrolls a rectangle of bits
horizontally and vertically.


16. 힌트의 위치및 색깔 조작.
procedure TForm1.DoOnShowHint(var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo);
var
XYPoint : TPoint;
begin
if HintInfo.HintControl = PlayBtn then
begin
getcursorpos(XYPoint);
XYPoint.Y := XYPoint.Y + 15;
with HintInfo do
begin
HintPos := XYPoint; // 이 버튼 힌트의 위치 바꾸기.
HintColor := clAqua; // 이 버튼의 색깔만 바꾸기
HintMaxWidth := 50; // 이 버튼 힌트 워드랩 주기.
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnShowHint := DoOnShowHint;
end;


17. 다른 프로그램의 실행
(*-------------------------------------------------------------------*)
FUNCTION WINRUN(COMMAND,PARAMS,WORKDIR:STRING) : BOOLEAN;
(* 명령어, 파라미터, 작업디렉토리를 인수로 받아서 실행한다.
(*-------------------------------------------------------------------*)
BEGIN
COMMAND:=COMMAND+#0;
PARAMS:=PARAMS+#0;
WORKDIR:=WORKDIR+#0;
RESULT := TRUE;
IF SHELLEXECUTE(0{HANDLE},Nil{'OPEN'{},@COMMAND[1],@PARAMS[1],
@WORKDIR[1],SW_SHOWNORMAL)<32 THEN
BEGIN
RESULT := FALSE;
MESSAGEDLG('FAILED TO EXECUTE '+COMMAND,MTERROR,[MBOK],0);
END;
END;

이 함수를 사용하려면 Uses문에 ShellAPI를 포함해야 한다.


18. 17번을 조금 수정해 다른 프로그램이 끝날때까지 기다리는 함수.
(*-------------------------------------------------------------------*)
FUNCTION WINRUN(COMMAND,PARAMS,WORKDIR:STRING) : BOOLEAN;
(* 명령어, 파라미터, 작업디렉토리를 인수로 받아서 실행한다.
(*-------------------------------------------------------------------*)
var inst : THandle;
BEGIN
COMMAND:=COMMAND+#0;
PARAMS:=PARAMS+#0;
WORKDIR:=WORKDIR+#0;
RESULT := TRUE;
inst := SHELLEXECUTE(0{HANDLE},'OPEN',@COMMAND[1],@PARAMS[1],
@WORKDIR[1],SW_HIDE);
IF inst<32 THEN
BEGIN
RESULT := FALSE;
MESSAGEDLG('FAILED TO EXECUTE '+COMMAND,MTERROR,[MBOK],0);
END else begin
while GetModuleUsage(inst) <> 0 do Application.ProcessMessages;
end;
END;


19. 스트링을 좌우로 정렬하기.

format( '%10s', formatFloat( '#,0', aNumber) );

위와같이 한다면, 10자리 문자열이 만들어지며 우측으로 정렬이 된다.
좌측으로 정렬을 원한다면 '%-10s'라고 주면 된다.


20. 시간과 날짜의 표시

FormatDateTime('yyyy/mm/dd hh:nn:ss :',Now);

1 2 3 4 5 6 7 8 9 10 다음