2008년 12월 29일 월요일

조나단 에드워즈(J. Edwards)의 70가지 결심문


  나는 하나님의 도움 없이는 아무 것도 할 수 없음을 알기 때문에 이 결심문(Resolution)이 하나님의 뜻에 일치하는 한 그리스도를 위해 하나님의 은혜로 내가 이것을 지킬 수 있도록 내게 능력을 주시기를 겸손하게 하나님께 간청합니다. 
  잊지 말고 매주 한번씩 이 결심문을 읽자. 

1 전생애 동안 최우선적으로 힘쓸 일 
  나의 전생애 동안 하나님의 영광과 나 자신의 행복과 유익과 기쁨에 최상의 도움이 되는 것이면 무엇이든지 하자. 지금 당장이든지 아니면 지금부터 수많은 세월이 지나가든지간에 시간은 전혀 고려하지 말자. 내가 해야 할 의무와 인류 전체의 행복과 유익에 최상의 도움이 되는 것이면 무엇이든지 하자. 내가 부딪히게 될 어려움이 무엇이든지간에 또한 그 어려움이 아무리 많고, 아무리 크다 할지라도 그렇게 하자. 

2 하나님의 영광을 위해 살기 위한 수단과 방법을 찾음에 대하여 
  위에서 언급한 사항을 잘 지키기 위해 도움을 주는 어떤 새로운 수단이나 방법을 찾기 위해 계속적으로 노력하자. 

3 결심문을 지키지 못했을 때 
  혹시라도 내가 넘어지거나 점점 무감각해져서 이 결심문 중 어떤 내용을 지키지 못하게 된다면, 다시 제정신이 돌아왔을 때 내가 기억할 수 있는 모든 것들을 회개하자. 

4 하나님의 영광에 도움되지 않는 일들에 대하여 
  하나님의 영광에 도움되는 것이 아니면 영혼에 관계된 것이든지 육체에 관계된 것이든지 또는 적든지 많든지간에 어떤 것이라도 절대로 하지 말자. 만일 내가 그런 일을 피할 수 있다면 피하자. 

5 시간 사용에 대하여 
  한 순간의 시간도 절대로 낭비하지 말고 그 시간을 가능한 한 최대로 유익하게 사용하자. 

6 삶의 자세와 태도에 대하여 
  내가 살아있는 동안 힘껏 살자. 

7 생애의 최후 순간이라고 가정했을 때 
  만일 내 생애의 최후 순간이라고 가정했을 때, 하기가 꺼려지는 것이면 절대로 하지 말자. 

8 다른 사람의 실패를 보았을 때 
  모든 면에서 즉 말과 행동에 있어서 아무도 나만큼 그렇게 약하지는 않은 것처럼, 또한 내가 다른 사람과 똑같은 죄를 범하고, 똑같은 잘못과 실수를 범한 것처럼 행동하자. 다른 사람의 실패를 나 자신의 잘못을 살피는 계기로 삼고, 나의 죄와 비참을 하나님께 고백하는 기회로만 삼자. 

9 죽음에 대한 묵상 
  매사에 나의 죽음과 죽고 난 뒤에 무슨 일이 일어날지에 대해서 많이 생각하자. 

10 고통스러울 때 
  고통스러울 때는, 순교의 고통과 지옥의 고통을 생각하자. 

11 풀리지 않는 신학적 문제를 만났을 때 
  해결해야 할 어떤 신학 원리가 있을 때, 만일 상황이 방해하지만 않는다면 그 문제 해결을 위해 내가 할 수 있는 것을 즉시로 하자. 
12 교만과 허영심에 빠졌을 때 
  만일 내가 교만이나 허영이나 이런 것들을 만족시키기 위해서 어떤 것을 좋아하고 있다면 즉시로 그런 것을 들 버리자. 

13 이웃 사랑의 실천에 대하여 
  도움과 사랑을 꼭 받아야 할 사람이 누구인지를 찾기 위해 노력하자. 

14 복수심에 대하여 
  절대로 복수심을 가지고 어떤 일을 하지 말자. 

15 분노에 대하여 
  비이성적인 인간에게는 아무리 사소한 화라도 내지 말자. 

16 다른 사람에 대한 비방에 대하여 
  절대로 다른 사람을 비방하지 말자. 그렇게 하는 것은 다소간 다른 사람을 불명예스럽게 하는 것이며, 실제로 아무런 유익이 없기 때문이다. 

17 임종의 순간에 비추어 본 삶의 자세 
  내가 죽게 되었을 때 '그 일을 했었다면 좋았을 텐데'하고 바라는 것처럼 그렇게 살자. 

18 최고도로 헌신한 상태에 비추어본 삶의 자세 
  내가 최고로 헌신한 상태일 때, 그리고 내가 복음과 천국에 대해서 가장 분명한 생각을 가지고 있을 때, 그때 내가 최선이라고 생각하는 것처럼 언제나 그렇게 살자. 

19 최후의 순간에 비추어 본 삶의 자세 
  마지막 나팔 소리를 듣기 전, 최후의 한 시간도 남지 않았을 때, 하기가 꺼려지는 것은 절대로 하지 말자. 

20 먹고 마시는 것에 대하여 
  먹고 마시는 것은 엄격하게 절제하며 살자. 

21 다른 사람의 잘못된 행동을 보았을 때 
  다른 사람이 하는 행동 가운데 내가 판단하거나 생각하기에 경멸받을 만한 행동이나 비열한 행동이라고 생각되는 것은 절대로 하지 말자. 

22 천국을 준비하는 삶 
  내가 생각할 수 있는 그리고 내가 할 수 있는 모든 나의 힘, 능력, 활력, 열심, 적극성을 다하여 가능한 한 천국에서 많은 행복을 누릴 수 있도록 노력하자. 

23 하나님의 영광을 위한 일이 아니라는 생각이 들었을 때 
  하나님의 영광을 위해서 하는 일이 아닌 것같이 생각되는 일을 할 때는 매우 신중하게 행하자. 그리고 그 일의 원래 의도와 계획과 목적이 무엇인지 원인을 파악하자. 만일 그 일이 하나님의 영광을 위한 것이 아니라는 것을 알게 되면 그 일은 4번째의 결심문을 어기는 것을 간주하자. 

24 나쁜 행동을 고치는 문제에 대하여 
  내가 어떤 현저한 나쁜 행동을 할 때마다 그 원인이 무엇인지를 철저하게 추적하자. 그런 다음 더 이상 그런 행동을 하지 않도록 조심하자. 또한 나쁜 행동의 원인이 되는 것과 힘껏 싸우도록 하자. 



25 하나님의 사랑을 의심하게 만드는 일에 대하여 
  하나님의 사랑을 의심하게 만드는 일이 무엇인지를 조심스럽고도 지속적으로 찾아내자. 그런 다음 내 모든 힘을 다해 그것과 싸우자. 

26 구원의 확신을 약화시키는 것들에 대하여 
  내 구원의 확신을 약화시키는 것들을 발견하면 버리자. 

27 게으름에 대하여 
 절대로 고의로 어떤 일을 태만하게 하지 말자. 하나님의 영광을 위한 태만은 예외지만 말이다. 자주 내 태만을 점검하자. 

28 성경 연구에 대하여 
  성경을 아주 꾸준하게 지속적으로 자주 연구하자. 그렇게 해서 깨닫고 쉽게 이해한 지식을 바탕으로 자라가자. 

29 잘못된 기도에 대하여 
  절대로 하나님께서 응답해주실 것이라고 바랄 수 없는 것을 기도라고 생각하거나 기도로 인정하거나 간구라고 하지 말자. 또한 하나님께서 받아주실 것이라고 바랄 수 없는 것을 죄 고백이라고 생각하지 말자. 

30 실천적인 삶에 대한 매주 반성 
  지난주보다 신앙과 은혜를 실천하는 삶이 더 나아지도록 매주마다 노력하자. 

31 비판에 대하여 
  결코 다른 사람을 비판하는 어떤 말을 하지 말자. 그러나 성도의 명예를 아주 실추시키거나, 인류에 대한 사랑을 아주 저해하는 것에 대한 비난은 정당하다. 또한 극도로 교만하거나 나의 잘못이나 실수에 대해서 그리고 황금의 법칙에 어긋나는 것에 대해서는 정당하다. 종종 내가 다른 어떤 사람을 비난했을 때는 이 결심문에 비추어 엄격하게 검사해 보자. 

32 충성된 삶에 대하여 
  잠언 20장 6절에 "충성된 자를 누가 만날 수 있으랴"라고 기록된 말씀이 비록 부분적으로라도 내게 해당되지 않도록 분명하고도 확실하게 나의 믿음(trust)에 충실하자. 

33 평화를 만드는 삶 
  다른 면에서 손해가 지나치게 발생하지 않는다면 평화를 만들고 평화를 유지하고 평화를 지키는 방향으로 내가 할 수 있는 것을 하도록 하자. 1722년 12월 26일 

34 진실한 언어생활 
  이야기하면서 어떤 사실에 대해서 말할 때는 반드시 참되고 단순한 진실만을 말하자. 

35 내가 지킨 의무에 대한 의심이 생길 때 
  내가 지킨 의무에 대해서 의심이 많이 생길 때마다 그 일로 내 마음의 고요함과 평안함이 깨어지면 의문 사항들을 기록하고 그 의문을 풀 수 있는 방법을 강구하자. 1722년 12월 18일 

36 다른 사람을 평가 절하하는 것에 대하여 
  어느 누구에 대해서도 나쁘게 말하지 말자. 단 그렇게 하는 것이 잘했다고 말할 수 있는 어떤 특별한 경우는 예외다. 

37 매일, 매주, 매월, 매해마다 반성할 일 
  매일 밤 잠자리에 들기 전 내가 게으름을 피웠는지, 내가 무슨 죄를 지었는지, 내가 나 자신을 부인했는지에 대해서 자문해보자. 또한 매 주말, 매 월말, 매 연말에도 그렇게 하자. 1722년 12월 22일, 26일 


38 주일을 경건하게 보내는 일에 대하여 
  주일에는 절대로 농담이나 우스개 소리를 하지 말자. 1722년 12월 23일 안식일 저녁 

39 합법적인 일을 하는 문제에 대하여 
 절대로 합법성에 의문이 많이 제기되는 일은 하지 말자. 동시에 그런 일을하고 난 후에는 그 일이 합법적인 것인지 아닌지를 생각하고 조사하자. 또한 만일 내가 어떤 일을 하지 않는 것이 합법적인가에 대해 의문이 제기되는 일도 마찬가지다. 

40 먹고 마시는 일에 대한 반성 
  매일 밤 잠자리에 들기 전에 먹고 마시는 일에 있어서 내가 할 수 있는 최선을 다했는지 자문해보자. 1723년 1월 7일 

41 매일, 매주, 매달, 매해의 마지막에 반성해야 할 일 
  매일, 매주, 매달, 매해의 마지막에, 어떤 면에서 더 낫게 행동할 수 있었는데 그렇지 못했던 것이 있었는지에 대해서 자문해보자. 1723년 1월 11일 

42 재헌신에 대한 다짐 
  세례 받을 때 하였고, 성찬식에 참여할 때 진지하게 하였던 하나님께 대한 헌신을 종종 새롭게 하자. 그리고 오늘 1월 12일 나는 진지하게 하나님께 대한 헌신을 새롭게 하였다. 1723년 1월 12일 

43 하나님의 전적인 주권 아래 사는 삶 
  오늘부터 죽을 때까지 내 인생이 나의 것인양 행동하지 말고 전적으로, 그리고 완전히 하나님의 것인양 행동하자. 토요일에 깨달은 것과 일치하게 행동하자. 1723년 1월 12일 

44 신앙 우선적인 삶1 
  다른 어떤 목적도 아닌 신앙만이 나의 행동에 영향을 미치도록 하자. 신앙적인 목적이 아니라면 어떤 환경 속에서도 행동하지 말자. 1723년 1월 12일 

45 신앙 우선적인 삶2 
  신앙에 도움되는 것이 아니면 그 어떤 것에도 절대로 쾌락이나 고통, 기쁨이나 슬픔 등을 느끼지 말자. 어떤 감정도, 조금의 감정도 품지 말자. 그리고 그런 것과 관련된 어떤 환경도 만들지 말자. 1723년 1월 12일, 13일 

46 부모님과 가족들에 대한 태도 
  부모님에게 어떠한 걱정이나 심려도 끼쳐드리지 말자. 말이나 눈동자에 가능한 한 전혀 내색을 하지 않도록 해서 그런 결과가 생기지 않도록 하자. 그리고 특히 가족 중 누구에 대해서도 똑같이 존경심을 가지고 그렇게 하도록 조심하자. 

47 그리스도를 닮은 성품 개발 
  최선의 노력을 다해서 선하고, 보편적으로 부드럽고, 친절하고, 조용하고, 평화롭고, 만족하고, 편안하고, 자비롭고, 관용적이고, 겸손하고, 온유하고, 순종적이고, 의무를 다하고, 부지런하고, 근면하며, 자애롭고, 침착하고, 인내하고, 절제하고, 용서하고, 진지한 성품에 도움되지 않는 것이라면 무엇이든지 하지 말자. 그리고 항상 이러한 성품이 되도록 하자. 그리고 매 주말마다 내가 그렇게 실천했는지의 여부를 엄격하게 점검하자. 

48 철저한 자기 점검에 대하여 
  내가 참으로 그리스도에 대해서 관심을 가지고 있는지 그렇지 않은지를 알기 위해서, 그리고 내가 임종의 손간에 이 문제에 대해서 회개할 무관심의 죄를 조금도 짓지 않도록 하기 위해서, 지속적으로 아주 세밀하고도 부지런하게 그리고 가장 엄격하게 내 영혼의 상태를 조사하도록 하자. 1723년 5월 26일 

49 조심스러운 삶 
  만일 내가 잘못을 저지르지 않을 수만 있다면 절대로 잘못을 하지 않도록 하자. 

50 내세에 비추어본 삶의 자세 
  내가 내세에 들어갔을 때, 그렇게 한 것이 최선이었고, 가장 지혜로운 것이었다고 판단하게 될 것처럼 그렇게 행동하도록 하자. 

51 임종의 순간에 비추어 본 삶의 자세 
  죽을 때 내가 뒤를 돌아보면서 '이런 일을 했으면 좋았을텐데'하고 생각하는 것처럼 모든 면에서 그렇게 하자. 1723년 6월 8일 

52 노인이 되었을 때에 비추어본 삶의 자세 
  나는 종종 노인들이 자기가 인생을 다시 살 수만 있다면 어떻게 살겠다라고 말하는 것을 듣게 된다. 그러므로 내가 노인이 되었다고 가정했을 때 그때 가서 내가 '이런 일을 했으면 좋았을텐데'하고 생각되는 바로 그런 일들을 하자. 1723년 6월 8일 

53 주님에 대한 온전한 신뢰의 삶 
  내가 가장 기분이 좋은 상태일 때 모든 기회를 이용해서 내 영혼을 주 예수 그리스도께 던지고 맡기자. 주님을 신뢰하고 의뢰하자. 완전히 주님께 헌신하자. 이로써 내가 나의 구속주를 알므로 내 구원의 확신을 가질 수 있을 것이다. 1723년 6월 8일 

54 다른 사람의 장점을 보았을 때 
  어떤 사람을 칭찬하는 내용을 들을 때마다 나도 그런 칭찬 받을 만한 일을 해야 하겠다고 생각되면 그 일을 본받도록 노력하자. 1723년 6월 8일 

55 천국과 지옥을 맛본 사람처럼 
  이미 천국의 행복과 지옥의 고통을 맛본 사람처럼 행동하도록 최선을 다하자1723년 6월 8일 

56 자신과의 싸움에 대하여 
  아무리 내가 실패하더라도 내 안에 있는 부패와의 싸움을 절대로 포기하지도 말고 또한 긴장을 조금도 풀지도 말자. 

57 불행한 일을 만날 때 
  불행과 불운에 대한 염려가 생길 때 내 의무를 다했는가를 돌아보고 의무를 다하도록 결심하자. 그리고 그런 사건들이 일어난 것은 하나님의 뜻이라고 생각하자. 할 수 있는 한 나는 내 의무와 내 죄에 대해서만 관심을 가지자. 1723년 6월 9일, 13일 

58 대화를 나눌 때 
  대화를 나눌 때 불쾌하거나 초조하거나 화난 표정을 짓지 말고 사랑스럽고 즐거우며 친절한 모습을 보이도록 하자. 1723년 5월 27일, 6월 13일 

59 나쁜 성격이 표출되려고 할 때 
 나쁜 성질과 분노가 더 치밀어 오를수록, 더 많이 노력해서 좋은 성격이 드러나도록 행동하자. 그렇다. 그럴 때, 비록 다른 측면에서 불이익이 있을 수도 있고, 다른 때는 경솔하게 될 때도 있다고 생각하겠지만, 좋은 성격을 드러내도록 하자. 

60 감정이 불안정하게 될 때 
  감정이 극도로 불안정하게 되기 시작할 때마다, 그리고 아주 미미한 정도라 하더라도 내가 내면적으로 편하지 않은 느낌을 가지게 되고, 또 감정이 밖으로 일관성 없이 표출될 때는 나 자신을 엄격하게 점검해보자. 1723년7월 4일, 13일 

61 게으름 극복에 대하여 
  핑계가 무엇이든지간에-사실 게으름은 핑계거리를 만들도록 하는 경향이 있지만-신앙에 온전하게 집중하지 못하도록 내 생각을 흐트러뜨리고 풀어지게 하는 게으름에 빠지지 않는 것이 최선이다. 
62 주께 하듯 일하는 자세 
  결코 어떤 일을 의무감으로만 하지 말고, 에베소서 6장 6-8절에 따라서, 기쁘고 자원하는 마음으로 주님께 하듯 하고, 사람에게 하듯 하지 말자. 어떤 사람이 어떤 선한 일을 하든지간에 그는 주께로부터 그대로 받을 것이라는 것을 알자. 1723년 6울 25일, 7월 13일 

63 완벽한 성도의 삶을 살기 위한 노력 
  어떤 순간에도, 모든 측면에서 인격의 어떤 부분이나 어떤 환경 아래서도, 언제나 성도다운 참 빛을 비추며 탁월하고 사랑스럽게 행동하는, 완벽한 성도가 세상에 단 한 명 있다고 가정할 때, 내가 그 한 사람이 되기 위해 힘껏 노력한다면 그렇게 될 수 있을 것처럼 행동하자. 1723년 1월 14일, 7월 13일 

64 하나님을 추구하는 마음 
  바울 사도가 말하는 '말할 수 없는 탄식'과 시편 기자가 시편119편 20절에서 말하는 '주의 규례를 항상 사모하는 마음'이 내 안에 있는 것을 발견하게 되면, 있는 힘을 다하여 이것들을 항상 지키도록 하자. 또한 나의 소원을 아뢰기 위해 간절히 노력하는 것이 약해지지 않도록 그리고 그러한 열심을 반복적으로 내는 것이 약해지지 않도록 하자. 1723년 7월 23일, 

65 맨톤의 시 119편 설교를 실천하는 삶 
  전생애 동안 이것을 있는 힘을 다해 연습하자. 즉 맨톤박사(Dr.Manton)의 시편 119편 설교에 따라, 내가 할 수 있는 최대한 열린 마음을 가지고 나의 모든 죄와 유혹과 어려움과 슬픔과 두려움과 희망과 소원 그리고 모든 것과 모든 상황 속에서 나의 길을 하나님께 맡기면서, 나의 영혼을 하나님께 열어놓자. 1723년 7월 26일, 8월 10일 

66 친절한 태도 
  어느 곳에서나 어느 누구에게나, 말이나 행동에 있어서 항상 친절한 태도와 분위기를 유지하기 위해 노력하자. 의무상 다르게 행동해야 할 때는 예외다. 

67 고난을 통해 유익을 얻는 법 
  고난 후에는 고난으로 인해 내가 더 나아진 점이 무엇인지, 어떤 유익을 얻었는지, 또한 무엇을 얻을 수 있는지를 스스로 묻도록 하자. 

68 솔직한 죄고백 
  약점이든지 죄든지간에 내 안에서 발견되는 모든 것을 나 자신에게 솔직히 고백하자. 만일 그것이 신앙에 관련된 것이면 모든 것을 하나님께 고백하고 필요한 도움을 간구하자. 1723년 7월 23일, 8월 10일 

69 타산지석 
  다른 사람이 하는 것을 볼 때, 나도 저렇게 했으면 하는 것들을 항상 행하도록 하자. 1723년 8월 11일 

70 유익을 끼치는 언어 생활 
  내가 하는 모든 말이 다른 사람들에게 유익이 되도록 하자.


------------------------------------------------------------------------------------------------------

많이 읽어봐야겠다. ^^

2008년 12월 19일 금요일

[홀리기타펌] 죄와 유혹에 대하여...

우리는 유혹과 죄에 대해서 많이 들어왔다. 구원, 용서함 등은 교회에서 많이 듣는 단어들이다. 그런데도 아직 우리는 이것들과 시름하고 있고, 결국 자신 나름대로 이 부분에 대해 정의하고 어느정도 타협하면서 사는 사람들도 있다. 성경에 나온 사실들과 자신의 현실을 어느정도 절충한 나름대로의 정의를 만들어내는 것이다. 진실은 다음과같다. 

1) 하나님꼐서는 죄를 미워하신다. 
2) 우리가 회개하면 하나님은 우리를 용서하신다. 
3) 우리의 힘으로는 죄를 이길 수없다. 
4) 하나님은 우리가 죄에대해 승리하기 원하신다. 

현실은 다음과 같다. 

1) 세상은 유혹꺼리를 많이제공한다. 
2) 우리는 여전히 죄를 짓는 연약한 존재이다. 
3) 죄를 진 다음에는 죄책감이 온다. 


우리는 항상 어떤 문제점이 발견되었을 때 그 현실을 인정하기위해 성경에 나오는 진실을 나름대로 이용하고있다. 사실 이것은 참 위험한 방법이다. 이스라엘 백성이 리더가 없는 불안한 현실을 이기기 위해 하나님을 상징하는 금송아지를 만든것과 같은 실수를 할 수 있는것이다. 예를 들어 어떤 교회를 이단화 하기위해서 그냥 마태복음 24:24 절을 인용하면 되고 변화하는 문화에 대해서 (성경적으로 받아 들일 수 없는 것 까지도) 우리는 베드로의 환상(사도행전 10장)을 예로 들면서 인정 시킬 수 있다. 죄에 대한 부분도 마찬가지다. 죄에 대해서 우리의 약한 부분을 명기한 성경의 몇개의 구절을 인용하면 우리는 어쩔 수 없이 죄에 대해 약한 존재이고 그 것은 사실(Truth) 로 인정하면서, "그래서 우리는 주님의 자비가 필요하다." 로 결론을 짓는다. 여기서 한가지 질문은, 

하나님께서 우리가 그냥 거기에(죄에 대해 연약한 존재로) 머무르기 원하시는가? 이다. 

많은 교회에서 "우리는 죄에 대해 약한 사람들이기 때문에, 그래서 날마다 하나님의 자비가 필요하다"라고 이야기 한다. 문제는 이 사실을 우리는 왜곡해서 받아들이기 쉽다는 것이다. 죄에 대해서 약한 사람들이라는 사실은 죄를 지어도 된다는 뜻은 아니다. 

매일 똑같은 죄에 대해서 넘어지고 위로가 필요한 사람들에게 너무 잔인한 이야기를 내가 하는지도 모르겠다. 그러나 위와같은 위로를 먼지를 툴툴 털어버리듯이, '언제나 용서하시는 하나님'을 빌미 삼아 죄를 짓는 것에 대해 습관화가 되어있는 상태인지 한번 확인해볼 필요가 있다. 자신에겐 이미 회개라는 것은 죄를 고백하고 위로를 받음으로써 자신의 죄책감을 없애려는 습관이 되어졌을 수도 있다. 

하나님을 포기하기 싫고, 죄는... 싫긴하지만 간혹 그 달콤한... 그래서 그리운 마음이 있기에 어느덧 우리는 양다리를 걸치고 있다. 그렇지만 항상 우리에게 남는것은 죄책감이다. "사실 죄책감이라는 것만 없다면 죄를 진 후에 우리가 꺼릴길 것은 없는데 말이다..." <- 마음속 깊은 곳에서 사실은 이렇게 생각하고 있지 않은가. 

우리는 더운가, 아니면 찬가. 하나님께서는 덥거나 차기를 원하신다. 그분에게 있어서 미지근함은 뱉어버리는 존재일 뿐이다. (계3:15) 

한가지 더... 죄를 범한 이후 남는것은 과연 죄책감 뿐일까? 
우리가 죄를 범하고 용서함 받으면 우리는 다시 정결케 된다. 그런데 한가지 우리가 용서함 받으면 그 죄에 대한 기억과 정보들도 같이 사라졌으면 좋겟지만. 사실은 우리의 기억속에 고스란히 남아있다는 것이다. 그 죄를 어떤 경로로 통해 범했고 죄를 지었을 때의 느낌까지 우리는 모두 기억하고 있다. 회개한 이후 우리는 돌이킴(회개란 정확한 다른 이름이 이것이 아닐까 생각한다.)을 위해 그 기억들을 제거하기 원한다. 그러나 어느 순간 그 때 상항과 연결되는 정보를 우리의 오감으로 얻었을 때, 예를 들어 그 때 들었던 음악이나. 비슷한 장면을 보거나 그때의 냄새를 맡게 된다면. 그 순간 그때를 연상하는 기억을 떠오르게 된다. 우리는 여기에서 "유혹"이라는 놈을 다시 직면하게 된다. 유혹자체는 죄가 아니다. 그리고 그 유혹에 대처하는 우리의 마음가짐이 그것을 죄로 키우거나 아니면 유혹으로 끝나게 할 수 있다. 문제는 우리가 죄의 경험을 많이 쌓으면 위와같은 경험에 의해 더 많은 유혹을 내 삶 가운데로 가져오게 된다. 나의 삶 가운데 이런 구체적인 유혹들이 더 많이 내 삶에 있다는 것은 불행한 일이다. 

죄와 유혹에 대한 대처 
죄를 대적하는 것을 구체적으로 알기 원하는 사람들에게 플로이드 맥글랑의 '어떻게 죄를 이길 것인가' 
라는 책을 권해드린다. 아주 얇은 책이며 간결하게 나와있다. 간단하게 이야기하면 자신이 죄에 나약함을 인정하고 육체를 신뢰하지 말라는 것이다. 육체가 죄에 대한 통로를 열지 못하도록 지혜롭게 대처해야한다. 그리고 항상 죄에 대한 자신의 마음가짐을 점검해야한다. 

나는 유혹에 대한 대처를 추가로 이야기 하고 싶다. 위에 이야기한 사람과 같이 죄에 대한 많은 경험으로 자신이 유혹에 많이 노출되어있는 사람이 회개이후 만일 죄와 타협하지 않은 삶을 결정했다면 그 삶은 유혹에 많이 노출되어있고 삶이 많이 어려울 것이다. 당신이 만일 그렇게 느낀다면 난 당신을 축복하며 승리하라고 격려해주고 싶다. 만일 자신이 그런 삶 속에서 아주 조금이라도 죄와 타협을 했다면 당신의 생활은 쉽게 흘러갈 수 있다. 이전 시나리오 대로 죄와 회개를 번복하며 살면 되니까 말이다. 그러나 당신의 미지근하여짐의 대가를 기억하기 바란다. 

아무튼 원점으로 돌아가, 우리는 과거의 잘못된 기억들을 온전함으로 바꿀 필요가 있다. 예를 들어 인도풍의 노래가 흘러나오는 커피숍에서 두 남자가 있는데 한 남자에게는 그 음악이 동양의 이국적인 상상을 일으키고 다른 한 남자에게는 성적인 상상이 일어났다. 사실 첫번째 남자는 얼마전에 내셔널 지오그래피를 보는중에 인도풍의 음악을 들었고 두번째 남자는 얼마전 성인물을 보았는데 그 배경음악이 인도 음악이였던 것이다. 첫번째 남자에게 이 음악은 그냥 하나의 아름다운 음악에 불가했지만. 두번째 남자에겐 유혹의 매개체였던 것이다. 어떤 사물에 대한 연상은 우리의 경험에 따라 바뀌어진다. 우리는 삐뚤어진 연상을 옳은 것으로 바꿀 필요가 있다. 

어느순간 유혹이 왔을 경우 그 유혹이 어디에서 왔는지에 대한 질문에 중심을 둘 필요는 없다. 알게되면 다음번에 그 부분에 대해 조심할 수 있는 점은 있지만. 그것을 알려고 자신을 추긍하면 더 구체적인 과거의 상상으로 자신을 빠트리게 될 수 있다. 중요한것은 그 유혹을 어떻게 뿌리치느냐 이다. 
결국 자신의 마음가짐이 벗어나는데 있다면 그 순간 하나님께 간절히 구할 수있는 자세도 나온다. 그 자세를 가진 상황에서 하나님앞에 지혜를 구해보자. 많은 사람들이 구체적인 '찬양을 듣는다거나', '기도를 하는것'을 이야기 하지만 사실 자신이 죄악을 벗어나 하나님께로 가까이 가고자하는 강한 마음가짐이 있지 않으면 위와같은 것도 사실 크게 효과를 보지 못하기 때문이다. 

우리스스로 죄의 문제를 감당하려고 노력하지 마라 라는 부분을 우리가 유혹을 감당하려고 노력하지 마라 라는 말로 오해 하고있는지는 아닌가? 유혹을 뿌리치는 결정은 우리들 자신이다. 계속 유혹이 머리속에서 커가게 놔둘 것인가, 아니면 처음 싹이 났을 때 잘라버릴 것인가. 그것은 전적으로 우리 책임이다. 

어느순간 갑자기 좋지않은 상상이 들면 환경을 바꾸어보자 음악을 듣고 있다면 음악을 멈추고 꺼꾸로 그렇지 않다면 음악을 들어보자. 아는 크리스챤 친구에게 안부전화를 거는 것도 좋은 방법이다. 산책을 가거나. 다른 일에 집중을 하는것도 좋다. 그런 여건이 되지 않아도 된다. 어떤 행위를 하여 바꾸는 것은 보조수단일 뿐, 머리속의 채널을 바꾸는것은 특히 무엇을 하지 않아도 가능하다. 그리고 잠시 자신이 있는 장소와 자신을 축복하는 기도를 하자. 길을 걷고 있다면 그 거리를 축복하고(눈을 감을 필요는 없다) 어느 장소에 있다면 그 장소를 축복하자.. 그 장소를 지나치는 사람들이 하나님을 만날 수 있도록... 이 연습도 처음에는 어렵지만 자주하면 요령이 생기게 된다. 

'자신이 의지가 약한 사람'이라거나, '벗어날 수없는 상처'에 핑게를 대지 말자 하나님께서는 감당할 만한 시험 이외에는 주시지 않는다고 하셨다. (고전 10:13)

출처: http://holyguitars.com/home/bbs/board.php?bo_table=talk&wr_id=86524

---------------------------------------------------------------------------------------------

죄와 유혹..어려운 문제다.. 유혹이 오면 엎어지고, 내가 죄를 지었구나 한다..

같은문제로 몇번이고 실패하고, 좌절하고... 그치만 그래도 언제나 주님앞에 가야한다..

십자가앞에 가야한다.. 내안에 다시한번 일어섬이 있어야겠다.

다음번엔 좀더 지혜롭게 이길수 있었으면 좋겠다. 그래서 주님 승리했어요. 말하고 기도했으면 좋겠다.

.

.

.

2008년 12월 10일 수요일

장애는 불편하지만 불행하진 않는다.

자주가는 사이트에 가서 발견한 동영상...눈물날뻔했다. ㅜㅡ;

내게 너무 다른사람에 비해 가진게 없다고 불평하는 나...(무언의 불평, 행동 등등...)

감사한일이다.

요즘 여러 어려운상황(경제, 사회) 들을 보면서 실망할수 있고 낙망 할수도 있지만...

절망보다..다시 일어날 수 있는 힘을  내야할때 인거 같다.

또 이런 생각이 났다.

동영상의 닉부이치치안에서 무슨일이 일어났을까...

무슨일이 일어났길래....

닉부이치치안에 그안에 생명이신 빛이신 예수님이 있지 않을까 싶다. 

우리모두 OTL 금지, 실망금지다. ^^

폴 포츠 오페라 동영상 + Spotify 자랑 ^^

(12.10 수정)

요즘 Spotify 에서 곡리스트를 즐겨찾기를 자주 한다.. 주로 CCM Worshiper들이다..Avalon, Chris Tomlin 등등.

이게 있으니 외국곡들을 마음대로 들을수있어 좋더라. 그래서 아는분께도 초대권을 몇장 보내주었다.

잘쓰실지는 잘모르지만. ^^

머리속에 맴돌던 멜로디가 있었는데... 인터넷에서 검색해보았다.

"Nessun Dorma" 이곡 이었다. 근데 이곡과 함께 나온곡이 위의 동영상이 었다..

평범한 핸드폰 판매하는분이라니, 몇년전에는 단기 오페라 연수도 갔다왔고, 노래에만 올인한사람... 이라고 말할수있겠다.

사회자들의 말이 잘 않들린다...한국어로 써있는 자막을 읽고나니 아 이거구나 느낌이 왔다. 대단하다는 말밖에는

노래에대한 열정.. 무었에대한 열정... 먼저 자기가 뭘 하고 싶은지를 찾아야 할 듯하다. 찾은사람은 거기에대한 열정을 갖추면 될것같다. 

열정.....열심.....

2008년 12월 5일 금요일

C, C++에서 동적배열 생성하기


오래동안의 숙제였던 동적배열이 해결되었다. ^^
항상 메모리 동적배열에서 실패하고 우회하고 했는데 먼가 해결된 느낌이다. 다행이다.

첨부한 파일은 www.winapi.co.kr에서 가져와서 워드로 편집한거다..그냥 카피 & 페이스트 했다.
첨부파일은 아래에서 참조하면 되겠다.

일단 조사하고 알게된 사항을 간단히 정리하자면,

처음에는 calloc함수를 이용 변수에 메모리를 할당하고
중간에 좀더 메모리 공간을 확장하기 위해서는 realloc을 사용하고,
해제할때는 free를 사용한다.

다음은 사용함수의 원형(Prototype)이다.

void *malloc( size_t size );

void *realloc( void *memblock, size_t size );

void *calloc( size_t num, size_t size );

calloc(씨얼록)은 메모리를 size크기의 num갯수만큼 할당하고 0으로 초기화한다.

realloc(리얼록)은 현재 메모리를 재할당한다.(확장, 축소)

malloc(엠얼록)은 메모리를 size만큼 할당한다. (0으로 초기화하지 않느다)



예) 다음 소스는 한빛미디어사의 'API정복' 이라는 책의 과제중 소스 몇줄이다.

     프로그램내용:
     사용자가 그리는 그림을 다른프로그램이 언커버 되더라도 복구하는 프로그램인데
     자료구조를 복덩은 배열을 선택했다. 링크드리스트는 조금 복잡한 감이있어서... 다음에
     링크드 리스트로도 함 이용해봐야겠다.
     책에 예제에서는 배열을 1000으로잡았으나, 다음소스에서는 동적배열로 구현해 보았다.

1. 구조체는 다음과 같다.
struct tagLine
{
    int x;
    int y;
    int iThick;
    COLORREF tColor;
    BOOL IsMove;
} *pLine;

2. 프로그램시작시 즉 WM_CREATE일때, 
    tagLine의크기만큼, INILINE개 메모리를 할당한다. 그리고 0으로 초기화한다.        
    pLine = (tagLine *)calloc(INILINE, sizeof(tagLine));

3. 이제 동적배열을 생성한다.
 
    tagLine *Temp;
    size_t size;

    size = _msize(pLine);  // 현재까지 설정된 구조체의 포인터의 크기를 구한다. 유용한 함수다.
    Temp =(tagLine *) realloc(pLine,size + sizeof(tagLine));
   
    if (Temp == NULL){
        MessageBox(hWnd, TEXT("메모리를 할당할 수 없습니다."), TEXT("에러"), MB_OK);
    }
    pLine = Temp; 

   → 이부분은 함수로 작성하여 프로그램내에서 Call하는 방식으로 했다.

4. 메모리를 해제한다.
 
   free(pLine); // 간단하다..^^



추가......


전에부터 고민이었던 문제가 해결되어 기쁜다. ^^

한단계 진보한 느낌이다. 다른사람들은 .Net이다 C#하는 마당에 이제 API공부중디다. 앞으로 해결한 문제들을 포

스팅 해볼까한다.


첨부파일




2008년 11월 28일 금요일

MS-SQL 사용자 프로세스에서 부동 소수점 예외가 발생했습니다. 현재 트랜잭션이 취소됩니다.


사용자 프로세스에서 부동 소수점 예외가 발생했습니다. 현재 트랜잭션이 취소됩니다.

회사에서 수불프로그램을 돌리던중 이런 메시지를 만났다. 아무리 찾아봐도..오리무중...

결국은 해결은 하긴했으나 수수께끼로 남아있다.

해결은 SP내부에 "1=1" 을 제거했다. 쿼리에 WHERE절에 조건이 없을경우를 대비해 추가한 부분인데...

(팀장님생각으로는 대형 스토어드 프로시져 실행시 메모리오류에서 나오지 않을까.. 복덩생각은 무한루프 '1=1' 이 무한루프란생각에서 추측을 해본다.)

한편 다른웹사이트를 찾아보니 이런 경우에도 에러가발생한다. 점점미궁이다.

http://sqler.pe.kr/web_board/view_list.asp?id=51473&read=301&pagec=&found=is&part=myboard1&ser=yes

데이터베이스프로그램이란거 힘든가보다. 특히 MS-SQL은 ㅡㅡ;

잠정적으로 데이터베이스 메모리가 오류났던가같다..다른쪽에서 원래의 문장으로 실행하니 되네..ㅎㅎ  어려워...디비는...

2008년 11월 27일 목요일

C++로 만든 DLL, VB에서 호출할때...

인터넷 웹검색하고..책 다시 읽어보고.. 이게 왜 않되는것이야..?

하루동안 C++,VB간 호출시 삽질끝에 결론을 내렸다..

다음가 같은 규칙이 있단다..

그래서 뭍어둘라다가 정리를 해본다.

** C++로 만든코드 VB에서 호출시 주의 사항

1. 파라미터 'ByVal'로 사용하기

2. C++에서 Debug모드, Release모드 상관없슴.

3. 반환값 뒤에 __stdcall 사용할것
  --> 호출규정 오류 발생

4. Def파일 생성
  --> 미생성시 DLL입력점 오류 발생

5. vb에서 실행화일(exe)은 Lib경로를 파일명.dll으로 셋팅
  디버깅시 Lib경로를 절대경로로 셋팅해야함.
  (*C로 만든DLL은 절대경로를 주지 않아도 가능하다.)

  cf. vb에서 #Const문을 사용 조건부 컴파일변수를 사용
  (* #Const Dev =1 ; 1이면 True, 0이면 False)

6. C++에서 int 사용시 VB에서는 ByVal Long 사용
7. C++에서 char* 사용시 VB에서 ByVal String 사용

8 데이터형은 가급적이면 표준 데이터형

2008년 11월 21일 금요일

감기에 걸렸을때 코 지압법

코 지압법. 

1. 부비강을 가볍게 3초 누르고 2초 쉽니다. 막힌 콧구멈을 위로 하고 3 - 5분 지압하면 
  막힌 콧구멍은 뚫리지만, 콧물이 밑으로 내려가므로 아래 쪽 콧구멍이 막히게 되며, 
  다시 반대로 합니다. 4 - 5일이 되면 피딱지가 떨어져 나오는데, 축농증, 비염, 코감
  기는 낫기는 하지만 재발하므로 계속하여 주어야 합니다.

2. 손을 비비어 따뜻하게 한 다음 엄지나 검지로 얼굴과 코 사이를 상하로 이마 밑에서 
  코끝까지 문질러 줍니다. 18번

3.영향혈 : 콧망울과 얼굴 사이에 있음. 3초 누르고 2초 쉼. 9번나. 콧구멍 세척법물이
  나 소금물로 코를 씻어 준다.한 쪽을 막고 빨대로 빨아드려 입으로 내 뱉는다. 
  코골이도 약해지지만 완전히 치유되지 않읍니다.
  술과 담배와 관계없이 알레르기성 비염,축농증, 비염이 낫습니다.


치유법

가. 코 지압법. 

1. 부비강을 가볍게 3초 누르고 2초 쉽니다. 코가 막힌 부분을 위로 하고 3-5분하면 막힌 
  부분이 뚫리면서, 아래로 코가 내려가서 아래 코가 막히게 되고, 그러면 다시 반대로 
  합니다. 4-5일이 되면 피딱지가 떨어져 나오는 데, 축농증, 비염, 코감기는 완전히 
  낫습니다.

2. 손을 비비어 따뜻하게 한 다음 가운데 손가락으로 얼굴과 코 사이를 18번 상하로 이마 
  밑에서 코끝까지 문질러 줍니다.(영향혈)


나. 코 구멍 세척법 

물이나 소금물로 코를 씻어 준다.
한 쪽을 막고 빨대로 빨아드려 입으로 내 뱉는다.
체질 개선이 될 때가지 계속하셔야 합니다.
술과 담배와 관계없이 알레르기성 비염,축농증은 다 낫습니다.

차 - 보리차

알레르기성 비염(일지도 모름) - 생강차 


출처 : http://blog.naver.com/h1590?Redirect=Log&logNo=140021839504  

   
집에서 할 수 있는 비염 치료법

* 무 = 맵지 않은 무를 갈아 즙을 낸 다음 면봉에 적셔 하루에 두, 세번 코안에 
  바르면 막혔던 코가 뚫린다.

* 모란 뿌리껍질(목단피) = 한 번에 5~6g을 물에 달여 하루에 한 번씩 10일 동안 자기 
  전 에 먹는다. 알레르기성으로 자주 오는 비염에 효과가 있다.

* 도꼬마리 열매(창이자) = 가루를 내 95% 알콜에 12일 동안 담가뒀다가 가라 앉은 
  부분을 추출, 햇빛에 말린 다음 꿀로 반죽해 0.5g 정도의 알약으로 만들어 한번
  에 두 알씩 하루 세 번 2주 동안 먹는다.
  코 안의 염증을 가라앉히는 데 좋다.

*석창포, 주엄나무가시(조각자) = 동일한 양으로 가루를 낸 다음 천에 4g정도 싸서
  콧구멍에 넣고 40분~1시간 정도 반듯하게 눕는다. 막힌 코를 열리게 하는 작용이 
  있다.



출처 : 블로그 집필 - 153 한의원 한형희의 약초이야기 


알레르기성 비염의 물리요법 | 비염클리닉 

*약탕 목욕: 찬 기운으로 인해 생긴 비염에는 진피나 당귀 천궁 등 따뜻한 성질의 
  입욕제를 사용해 몸 안의 찬 기운도 없어지고 감기도 예방이 됩니다. 

*지압법: 코막힘이 심할 때는 코 가장자리의 양쪽과 양미간 사이(인당혈)를 지압
  하면 효과적입니다. 
  인당혈은 손가락이나 둘째손가락으로 아픈 감을 느끼도록 올려 누릅니다. 

*찜질법: 재채기를 갈아 앉히려면 섭씨 45도쯤 되는 따뜻한 물수건으로 코를 덮어
  줍니다. 이렇게 하면 코막힘도 개선됩니다. 

*족탕법: 특히 겨울에 발이 찬 사람은 발을 따끈한 물에 15분 정도 담그면 그 즉석
  에서 코가 뻥- 뚫리는 경우가 많으며 그 다음 아침까지도 코가 시원하다. 

*소금물 코 세척법: 만성 비염일 때는 소금물에 코를 씻어주는 것이 효과적입니다. 
  3%의 소금물을 만들어 그 물을 코로 들여 마셔 씻어주는데, 한쪽 콧구멍을 막고 
  다른 쪽 코에 소금물을 대고 들여 마시는 식으로 번갈아 가며 실시합니다. 

이렇게 하면 콧물이 마구 나오며 시원해지는데, 아침저녁 하루 2회씩 4-5일 씻어주고 
하루 이틀은 쉬고, 이렇게 반복적으로 2주정도 해야 합니다. 
하지만 급성비염이나 감기일 때 소금물이 오히려 자극을 주어 좋지않습니다. 
그냥 물로 씻어 주는 것이 무난합니다. 

* 물구나무서기 운동 : 하루 2-3분씩 물구나무서기를 하면 
  코의 혈액순환이 좋아져 비염의 치료에 도움이 됩니다. 
  평소에도 가끔씩 콧속을 소금물로 씻고,물구나무서기 운동을 하면 
  감기와 비염을 예방할 수 있습니다. 

* 자연 코막힘 제거제 : 코가 막힐 때는 무 즙을 이용해 봅시다. 
  무즙은 살균작용이 있어서 코감기를 비롯한 
  상기도 염증, 비염 등으로 인한 코막힘을 푸는 데 효과적입니다. 

맵지 않은 무를 강판에 갈아서 즙만 짜내어 짠 다음 
면봉에 적셔 콧구멍 안에 넣고 이곳 저곳에 잘 바르도록 합니다. 
좀 쓰리긴 하지만 코가 잘 뚫립니다. 

그러나 코의 위쪽 깊은 곳에 넣으면 재채기가 나니까 주의해야 합니다. 
무 즙 대신 연근 즙을 써도 되고, 
복숭아 잎사귀를 찧어 그 즙을 면봉에 묻혀 
조금씩 코 속에 넣어줘도 됩니다


출처: http://blog.daum.net/leo-jp/14461698

클립보드 뷰어 VB + (C++)

Clipboard Ramifications

Christian Ernst Rysgaard
Senior System Developer Consultant
Software Research Department, SimCorp A/S

Created May 23, 2001

Click to get the source files for this technical article


Introduction

This article describes all the ramifications I found, trying to reveal the mysteries of the windows clipboard combined with Drag & Drop from Visual Basic. My initial idea was to create a clipboard viewer, that could show a hex/ascii dump of the current contents of the clipboard. The standard windows clipboard viewer will do just fine in most cases, but if you need to hack private clipboard formats during Drag & Drop operations it will leave you somewhat baffled since private clipboard formats will never be displayed and besides, the viewer does not support Drag & Drop operations.

The Need

Why on earth would anybody need an application like this? Well, obviously for clipboard hacking! A few applications had annoyed me for quite a while due to  their unwillingness to reveal the supported formats and contents of items copied to the clipboard or items being dragged into my own window.

First problem I encountered during the development of a small program that takes a Visual SourceSafe hosted file and extracts information about the differences introduced between two versions. It seemed to be somewhat easier to catch a file being dragged from the SourceSafe Explorer, instead of rewriting a treeview/listview application just to make the user select a SourceSafe item. Funny thing is that SourceSafe does not support copy/paste, so the items can only be extracted by Drag & Drop, but unfortunately the Drag & Drop format is completely undocumented. Not a big problem, once you discovered that the format is actually present (using brute force attacks on the VB dataobject) and even funnier a few hours later when the binary format is hacked!

A similar problem I ran into, was the missing details around Drag & Drop and good old Copy & Paste on Outlook items. A knowledgebase article Q172752  gently informs that when you drag outlook items, only a few fields are exposed, and there is no way to change which fields are exposed. Actually the fields Subject, SenderName and RecievedTime are exposed, but this is not enough to guarantee a perfect match if you should need to link back to the Outlook item. In disagreement with that article, it is actually possible to drag a message to a file folder and save the entire message with all fields available.

In both cases you might think that magic does the trick - or like me - Start thinking that some obscure secret Drag & Drop formats allow an application access to information not otherwise accessible. This explains my need for a binary clipboard viewer that supports Drag & Drop operations, but to tell you the truth, I really just needed an excuse to play around.

Straight Visual Basic developers must indulge me for a few paragraphs, as this cannot be solved in VB alone - Explanation follows!

Clipboard Operations

The clipboard can contain different representations of the same data at the same time. For instance: A text copied to the clipboard can be placed in both the unicode and the ansi version, leaving the choice about the preferred format to the client. Manipulation from code is no big deal, since the clipboard allow developers to enumerate on all formats using the clipboard API functions. Get the number of supported formats on the current item in the clipboard using the function CountClipboardFormats and extract information about each supported format using the EnumClipboardFormats function. Having decided on a specific format, the actual contents are extracted using GetClipboardData. Detailed information about the system clipboard can be found in the Platform SDK beneath the Interprocess Communications section. 

Drag & Drop

Basically the same data formats are available during Drag & Drop operations. In order to use a control as drop target from ATL based applications, you call the RegisterDragDrop function with a class that implements the IDropTarget interface and the window handle of the control. For MFC apps you create a class that inherits from COleDropTarget (a wrapper for IDropTarget) and uses the Register method of this class to bind it to the window handle of a control. For both solutions the result is a set of functions: DragEnter, DragOver, DragLeave and Drop, that will be called on obvious events. MFC wrappers tends to be a bit easier to code against, especially the EnumFormatEtc method of IDataObject can cause some pain (which is probably why they left it out of the VB DataObject wrapper). Once you respond to the Drop function you'll get an IDataObject pointer or the MFC equivalent wapper COleDataObject. Both can be used to extract the data using the same format identifiers as the clipboard. 

Ole Clipboard functions

The API has a rather cunning function OleSetClipboard which will give you the option to transfer an entire dataobject to the clipboard. But to make all dataformats hosted by the dataobject available to other programs, it is necessary to call OleFlushClipboard. This call will extract all formats from the IDataObject and place each of them on the clipboard, ready to use for those with a special need. The Ole interfaces IDataObject and IDropTarget can both be located in the "Component Services" part of the "Ole and Data Transfer" section in the Platform SDK.

Dragging with style

The shell exposes an interface IDropTargetHelper as an extra bonus for C++ developers. This interface allows drop targets to display a drag image while the image is above the target window. Implementation is simple - Just create an instance of the helper object and call the four functions DragEnter, DragOver, DragLeave and Drop when the handlers are invoked on the IDropTarget interface. The result is a nice drawing of the item being dropped on your object. See the article "Drop Helper Object Part 1- IDropTargetHelper" in msdn library for a good description.

VB Format Enumeration

A lot of options are available to Visual Basic developers. Drag & Drop support can be added painlessly to your UI elements and the entire range of API calls are operational with only a few Declare statements and some CopyMemory calls! A lot of options - But none of them really serves the need of this application:

  • VB Clipboard object - available to all applications but with no enumeration possibility.
  • VBRun.DataObject - available during drop on a UI element, but does not support format enumeration.
  • API functions - declarations can be extracted from winuser.h, but does not support Drag & Drop.

The lack of support for dataformat enumeration is a major shortcoming in the first two cases. This can be done with the API functions, but switching to these will remove the possibility of supporting Drag & Drop! Unfortunately the Visual Basic dataobject wrapper does not expose the internal IDataObject interface. Even sending the DataObject to a VC component for a call to QueryInterface to ask for the IDataObject interface, will return the notorious "Interface not supported". This leaves you with only one option as far as I can see: Enumerate on all clipboard formats from &HC000 to  &HFFFF and ask the dataobject using the GetFormat to check if the format is supported or not.

Dim idx As Integer, cnt As Long

For idx = &HC000 To &HFFFF

  If [DataObject].GetFormat(idx) Then

    debug.print "Supports "; idx

    cnt = cnt + 1

  End If

Next

Debug.Print "Total="; cnt

This is not a well-performing solution, as you might have guessed, but obviously only a problem if you need to develop an application like a clipboard viewer with a need to enumerate on all supported formats during a Drag & Drop operation. Normal programs would only be interested in a few known formats, and the needed clipboard format can always be extracted using the integer value returned from the RegisterClipboardFormat function. Hardcoding a private clipboard format identifier into your program is not a bright idea, as the integer values will change from machine to machine. For instance the SourceSafe format CF_SOURCESAFE is registered as 0xC1A5 on my server and 0xC1CC on my laptop. Use the clipboard format  name instead and call RegisterClipboardFormat with the formatname as argument to obtain the clipboard format identifier.

' ** Will probably never work **

const CVSSID = &HC1A5

if [DataObject].GetFormat(CVSSID) then res = [DataObject].GetData(CVSSID)



' ** Works every time **

Declare Function RegisterClipboardFormat Lib "user32" Alias _

  "RegisterClipboardFormatA" (ByVal lpString As String) As Long

const CVSSNAME = "CF_SOURCESAFE"

dim idx as integer

idx = RegisterClipboardFormat(CVSSNAME)

if [DataObject].GetFormat(idx) then res = [DataObject].GetData(idx)

ATL to the rescue

I decided on keeping the userinterface in VB and create a small ATL based component to assist me with the Drag & Drop support. This seemed to  combine the best of the two worlds and at least keep things cunningly complicated. The idea was to stop using the OleDragDrop functionality of a VB control, and instead bind an ATL component to the windowhandle of the control using the RegisterDragDrop function. Once a Drop was detected, the ATL component should move the given dataobject onto the clipboard with OleSetClipboard, expand the data with OleFlushClipboard and fire an event to the VB application, to indicate that new data was available. The VB application would receive the event and start working on the clipboard, as if data was inserted using the clipboard Copy operation. The ATL component ended up with these parts (to improve readability a lot of lines were left out):

class ATL_NO_VTABLE CBinder : ... public IDropTarget ...

{

  HWND m_hwnd;

  STDMETHOD(Unbind)();

  STDMETHOD(Bind)(long hwnd);

  HRESULT DragEnter(IDataObject *pData, ..., DWORD *pdwEffect);

  HRESULT DragLeave();

  HRESULT DragOver(DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);

  HRESULT Drop(IDataObject *pData, ..., DWORD *pdwEffect);

};
STDMETHODIMP CBinder::Bind(long hwnd) { 

  m_hwnd = (HWND)hwnd;

  return RegisterDragDrop(m_hwnd, this); }



STDMETHODIMP CBinder::Unbind() { 

  return RevokeDragDrop(m_hwnd); }



HRESULT CBinder::DragEnter(... DWORD *pdwEffect){ 

  *pdwEffect = DROPEFFECT_COPY;  

  return S_OK; }



HRESULT CBinder::DragLeave() { 

  return S_OK; }



HRESULT CBinder::DragOver(... DWORD *pdwEffect) { 

  *pdwEffect = DROPEFFECT_COPY;

  return S_OK; }



HRESULT CBinder::Drop(IDataObject *pData, ..., DWORD *pdwEffect) { 

  OleSetClipboard(pData);

  OleFlushClipboard();

  Fire_OnDrop();

  *pdwEffect = DROPEFFECT_NONE;

  return S_OK; }

Calling Bind with a window handle will register the ATL component to receive notifications when an object is being dragged over the UI element. Calling Unbind will stop the notification. The Drag/Drop notification methods are overridden in order to modify the dwEffect argument to enable the UI element as a drop target. The Drop notification method just leaves all the corny bits to the Ole clipboard functions, fire an event and resets the dwEffect to indicate success.

Dropping VB

After setting a reference to the ATL component it can be used from a Visual Basic form like this:

Dim WithEvents oBind As ATLBINDLib.Binder



Private Sub Form_Load()

  Set oBind = New ATLBINDLib.Binder

  oBind.Bind Command1.hWnd

End Sub



Private Sub Form_Unload(Cancel As Integer)

  oBind.Unbind

  Set oBind = Nothing

End Sub



Private Sub oBind_OnDrop(ByVal Formats As String)

  Debug.Print "DROP" & vbCrLf & Formats

  Clipboard.GetData(...)

End Sub

The button Command1 must leave its DragMode attribute at 0-Manual in order to catch the events in the ATL component. Notice that existing contents on the clipboard will get wiped using this approach - This not expected behavior for a Drag & Drop operation and should never be used in normal applications. However, I do find this behavior acceptable in a clipboard viewer used for Drag & Drop clipboard hacking!

Extracting the data

Leave aside the support for Drag & Drop for a moment and dwell on the actual data extraction. The VB application displays a listbox with the formats currently on the clipboard. The user should be presented with a hexdump of the raw data contents after selecting a format. The listbox of supported formats lstFormats is easily populated using the EnumClipboardFormats functions, following this scheme:

Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long

Declare Function EnumClipboardFormats Lib "user32" _

  (ByVal wFormat As Long) As Long

Declare Function CloseClipboard Lib "user32" () As Long
Dim FormatID As Long, FormatName As String, FormatNameLen As Long

If not OpenClipboard(0&) Then err.raise "cannot open clipboard"

lstFormats.Clear

Do

  FormatID = EnumClipboardFormats(FormatID)

  If FormatID = 0 Then Exit Do

  FormatName = String$(1024, 0)

  FormatNameLen = GetClipboardFormatName(FormatID, FormatName, 1024)

  If FormatNameLen = 0 Then

    FormatName = "<UNKNOWN>"

  Else

    FormatName = Left$(FormatName, FormatNameLen)

  End If

  lstFormats.AddItem fhex(FormatID, 4) & " - " & FormatName

  lstFormats.ItemData(lstFormats.NewIndex) = FormatID

Loop While True

CloseClipboard

For every click in the formats listbox, the corresponding data should be extracted and the contents dumped in hex format. It is quite easy to extract the data into a local byte array once you learn how to declare and use the CopyMemory function correctly:

Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" _

  (Destination As Any, Source As Any, ByVal Length As Long)

Declare Function GlobalSize Lib "Kernel32" (ByVal hMem As Long) As Long

Declare Function GlobalLock Lib "Kernel32" (ByVal hMem As Long) As Long

Declare Function GlobalUnlock Lib "Kernel32" (ByVal hMem As Long) As Long

:

Dim FormatID As Long, VarData as variant

FormatID = lstFormats.ItemData(lstFormats.ListIndex)

VarData = GetDataBytes(FormatID)

:

Function GetDataBytes(FormatID as integer) as Variant

  Dim hndData As Long, hndLock As Long, 

  Dim DataSize As Long, DataBytes() As Byte

  FormatID = lstFormats.ItemData(lstFormats.ListIndex)

  If OpenClipboard(0) = 0 Then Err.Raise "cannot open clipboard"

  hndData = GetClipboardData(nFmt)

  If hndData = 0 Then Err.Raise "invalid clipboard format " & nfmt

  DataSize = GlobalSize(hndData)

  If DataSize > 0 then

    ReDim DataBytes(0 To DataSize - 1)

    hndLock = GlobalLock(hndData)

    CopyMemory DataBytes(0), ByVal hndLock, DataSize

    GlobalUnlock hndData

  End If

  CloseClipboard

  GetDataBytes = DataBytes

End Function

The CopyMemory function will copy each byte into a local byte array after getting a pointer to the data, estimating the size and locking for exclusive usage. Error handling is a bit sloppy in the sketched code above, but this is intentionally, just to draw your attention away from the real problems!

Finishing touch

The application is not finished yet - And as most other hacker projects, it probably never will be! But if you need to brag about having implemented a Clipboard viewer, you will need to (at least) register in the chain of clipboard viewers and respond correctly to clipboard messages sent to your main window. The needed functions can (not surprisingly) be found in the clipboard API. The SetClipboardViewer function adds the specified window to the chain of clipboard viewers. Clipboard viewer windows will then receive a WM_DRAWCLIPBOARD message whenever the content of the clipboard changes. A clipboard viewer window must eventually remove itself from the clipboard viewer chain by calling the ChangeClipboardChain function.

Visual Basic magician Karl E Peterson has produced some rather good samples for clipboard manipulation. Tune into his site at http://www.mvps.org/vb and save yourself the trouble of having to rewrite everything from scratch by downloading his clipview sample. Particulary extraction of bitmaps from the clipboard is well documented in his code, where you can probably pick up a few tricks!

The finished application along with all the sourcecode can be downloaded from the location shown at top of this article. Unpack the zipfile to a local directory and run the executable clipx.exe. All sourcecode for the ATL component is located project in the ATLBind Folder and the Visual Basic project can be found in the Viewer directory.

Good Intentions

...are normally used for paving the road to hell! Never the less - Here is a few of my explanations:

  • Why on earth would you create a program like this in Visual Basic?

For sheer fun! Because it's a good technical challenge to add the pieces left out by the VB team! I didn't really think it would be this difficult! Starting from fresh I would definitively implement the entire viewer in C++ and skip the annoying Visual Basic part! Having said that, I would like to add that this started out as a solid well-working Visual Basic application that "just" needed the additional Drag & Drop functionality.

  • How did the ATLBind component become registered on my own machine?

A tricky part of the startup main procedure is devoted to the localization and registration of the ATL component. If a failure is encountered trying to create an instance of the com object, the startup procedure will locate the needed DLL file in the same directory as the application and call the DllRegisterServer function on that DLL - Pretty cunning functionality and easy to adopt in your own programs!

  • My clipboard contents are destroyed during Drag & Drop operations!

What did you expect from a hacker tool? To make a few shortcuts I ended up sacrificing the clipboard. Forced to rethink the design, I would probably save a copy of the DataObject received during Drag & Drop and extract the formats from that one, instead of just placing the contents on the clipboard.   

I aint got a clue - But given how easy it is to add the support yourself, I wouldn't think more about it!

  • Why doesn't the Visual Basic DataObject expose the enumeration method EnumFormatEtc like IDataObject?

My guess is that it was left out for two reasons. First of all the returned interface IEnumFORMATETC is probably too complicated to be used directly from Visual Basic. And secondly - Only clipboard viewers would need access to this kind of functionality. It's like asking a com object to reveal all the interfaces it supports! The Zen answer is - What would you do with that information (unless you are coding an object browser/viewer?) There's no way you can code against an interface you didn't know existed at the development time. And likewise - There is no way you can decode a format that you didn't know existed when you created the code! I'll grant you that it is a hackers dream to force an object to reveal all of the supported interfaces or formats, but real world developers have no use for that kind of functionality!

  • What is hidden inside the CF_SOURCESAFE format and how do I get the Drag & Drop Outlook item?

Why spoil all the fun and tell you a well-kept secret. Use the clipboard dumper to dig into the formats yourself and discover the truth - Or stay tight and wait for my next article about SourceSafe Automation & Integration.


출처: http://www.glimt.dk/code/clipx.htm

소스파일

2008년 11월 20일 목요일

Wget 한글 메뉴얼제작

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Wget 한글 메뉴얼제작 - by pbi12
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GNU Wget 1.7, a non-interactive network retriever.
그누 Wget 1.7 버젼, 대화창없이 네트워크에서 자료를 찾아오는 리트리버(사냥개)

Usage: wget [OPTION]... [URL]...
사용법: wget을 쓴후에 옵션을 적고 난후에 URL을 적으세요.

Mandatory arguments to long options are mandatory for short options too.
필수적인 긴 옵션의 변수는 필수적인 짧은 옵션을 적는것과 같다. <-- (맞는말인지 -_-a )

Startup:

  -V, --version display the version of Wget and exit.
  Wget의 버젼을 보여주고 종료 합니다.

  -h, --help print this help.
  도움말을 보여줍니다.

  -b, --background go to background after startup.
  시작한 후에 백그라운드에서 작동합니다.

  -e, --execute=COMMAND execute a `.wgetrc'-style command.
  .wgetrc 라는 스타일의 명령을 실행합니다.


Logging and input file:

  -o, --output-file=FILE log messages to FILE.
  메세지들을 파일로 남깁니다.

  -a, --append-output=FILE append messages to FILE.
  메세지를 파일에 추가합니다.

  -d, --debug print debug output.
  디버그 내용을 보여줍니다.

  -q, --quiet quiet (no output).
  출력없이 종료함.

  -v, --verbose be verbose (this is the default).
  다양함. 기본값입니다.

  -nv, --non-verbose turn off verboseness, without being quiet.
  기본옵션을 제거한다.

  -i, --input-file=FILE download URLs found in FILE.
  다운받을 URL주소를 파일에서 찾습니다.

  -F, --force-html treat input file as HTML.
  HTML 과 같은 파일을 입력값으로 취급합니다.

  -B, --base=URL prepends URL to relative links in -F -i file.
  --sslcertfile=FILE optional client certificate.
  --sslcertkey=KEYFILE optional keyfile for this certificate.
  파일이나 링크에 관련한 URL, keyfile 을 사용하여 ssl을 증명한다.


Download:

  --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host.
  로컬 호스트의 주소를 설정한다.
   
  -t, --tries=NUMBER set number of retries to NUMBER (0 unlimits).
  설정한 숫자 만큼 다시 시도한다. 0은 무한대이다.

  -O --output-document=FILE write documents to FILE.
  문서를 파일로 쓴다.

  -nc, --no-clobber don't clobber existing files or use .# suffixes.
  지나치게 파일이나 사용을 종료 하지 않는다.# 첨가.

  -c, --continue resume getting a partially-downloaded file.
  부분적으로 파일을 이어 받을 수 있게 한다.
  --dot-style=STYLE set retrieval display style.
  복구 스타일로 설정한다.

  -N, --timestamping don't re-retrieve files unless newer than local.
  로컬에 있는 것보다 새롭지 않으면 파일을 다시 받지 않는다.

  -S, --server-response print server response.
  서버의 응답을 출력한다.
  --spider don't download anything.
  다운로드를 하지 않는다.

  -T, --timeout=SECONDS set the read timeout to SECONDS.
  종료될 시간을 초단위로 설정한다.

  -w, --wait=SECONDS wait SECONDS between retrievals.
  --waitretry=SECONDS wait 1...SECONDS between retries of a retrieval.
  검색하고 기다리는 시간을 초단위로 설정한다.

  -Y, --proxy=on/off turn proxy on or off.
  프락시 모드를 켜고 끈다.

  -Q, --quota=NUMBER set retrieval quota to NUMBER.
  숫자 만큼 분담하도록 셋팅한다.

Directories:
  -nd --no-directories don't create directories.
  디렉토리를 생성하지 않는다.

  -x, --force-directories force creation of directories.
  디렉토리를 강제로 생성한다.

  -nH, --no-host-directories don't create host directories.
  호스트 이름의 디렉토리를 생성하지 않는다.

  -P, --directory-prefix=PREFIX save files to PREFIX/...
  지정한 곳에 파일을 저장한다...
  --cut-dirs=NUMBER ignore NUMBER remote directory components.
  디렉토리 구성요소를 숫자많큼 지우고 무시한다.


HTTP options:

  --http-user=USER set http user to USER.
  http 유저의 아이디를 설정한다.
  --http-passwd=PASS set http password to PASS.
  http의 패스워드의 암호를 설정한다.

  -C, --cache=on/off (dis)allow server-cached data (normally allowed).
  서버측의 캐쉬 데이터를 허용하는게 보통이나, 제거 할수도 있다.

  -E, --html-extension save all text/html documents with .html extension.
  모든 text/html형식의 문서들과 .html 파일을 같이 확장해서 저장한다.
  --ignore-length ignore `Content-Length' header field.
  Content-Length라는 헤더의 부분은 무시한다.
  --header=STRING insert STRING among the headers.
  헤더들간의 사이의 글씨를 추가한다.
  --proxy-user=USER set USER as proxy username.
  프락시의 유저이름을 설정한다.
  --proxy-passwd=PASS set PASS as proxy password.
  프락시 패스워드를 설정한다.
  --referer=URL include `Referer: URL' header in HTTP request.
  http가 요청하는 헤더에서 URL참조한 것을 추가한다.

  -s, --save-headers save the HTTP headers to file.
  파일에서 HTTP 헤더를 저장한다.

  -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.
  Wget/Version 보다 나은 에이전트를 조사한다.
  --no-http-keep-alive disable HTTP keep-alive (persistent connections).
  HTTP 의 Keep-alive 제거 (끈질기게 연결해준다.)
  --cookies=off don't use cookies.
  쿠키사용 안함.
  --load-cookies=FILE load cookies from FILE before session.
  쿠키를 세션전의 파일에서 불러온다.
  --save-cookies=FILE save cookies to FILE after session.
  세션이후의 파일에서 쿠키를 저장한다.


FTP options:

  -nr, --dont-remove-listing don't remove `.listing' files.
  .listing 이라는 파일에 있는건 지우지 않는다.

  -g, --glob=on/off turn file name globbing on or off.
  하나의 파일 이름으로 하는지를 켜고 끈다.
  --passive-ftp use the "passive" transfer mode.
  반응하지 않는 전송모드를 사용한다.
  --retr-symlinks when recursing, get linked-to files (not dirs).
  복구중에 링크가 걸린 파일을 가져온다.(디렉토리는 아니다.)


Recursive retrieval:

  -r, --recursive recursive web-suck -- use with care!
  웹을 빨아들이는 것을 반복한다. 조심해서 사용하라!

  -l, --level=NUMBER maximum recursion depth (inf or 0 for infinite).
  최대한 반복한다. 정도는 0 으로하면 헤아릴수 없이 반복한다.
  --delete-after delete files locally after downloading them.
  그것들을 다 받으면 로컬의 파일들을 삭제 한다.

  -k, --convert-links convert non-relative links to relative.
  관계 없는 링크에서 관계있는 것으로 변환해준다.

  -K, --backup-converted before converting file X, back up as X.orig.
  변환하기 전에 X라는 파일을 X.orig 라는 파일로 백업해준다.

  -m, --mirror shortcut option equivalent to -r -N -l inf -nr.
  -r -N -l inf -nr 이라는 옵션과 동일한 옵션을 손쉽게 사용할 수 있다.

  -p, --page-requisites get all images, etc. needed to display HTML page.
  모든 이미지와 기타 HTML 페이지가 표현 가능한 모든것을 가져온다.


Recursive accept/reject:

  -A, --accept=LIST comma-separated list of accepted extensions.
  받아들일 것을 확장하기 위해 콤마로 분리된 리스트로 받아들인다.

  -R, --reject=LIST comma-separated list of rejected extensions.
  거절할 것을 확장하기 위해 콤마로 분리된 리스트로 받아들인다.

  -D, --domains=LIST comma-separated list of accepted domains.
  받아들일 도메인을 콤마로 분리된 리스트로 받아들인다.
  --exclude-domains=LIST comma-separated list of rejected domains.
  거절할 도메인을 콤마로 분리된 리스트로 받아들인다.
  --follow-ftp follow FTP links from HTML documents.
  HTML 문서에서의 FTP 링크를 따라간다.
  --follow-tags=LIST comma-separated list of followed HTML tags.
  HTML 태그에서 따라갈 콤마로 분리된 리스트로 받아들인다.

  -G, --ignore-tags=LIST comma-separated list of ignored HTML tags.
  무시할 HTML 태그를 콤마로 분리된 리스트로 받아들인다.

  -H, --span-hosts go to foreign hosts when recursive.
  반복할때에 다른 호스트로도 가게 한다.

  -L, --relative follow relative links only.
  관계있는 링크만 따라간다.

  -I, --include-directories=LIST list of allowed directories.
  허용할 디렉토리를 리스트로 받아들인다.

  -X, --exclude-directories=LIST list of excluded directories.
  차단할 디렉토리를 리스트로 받아들인다.

  -nh, --no-host-lookup don't DNS-lookup hosts.
  DNS의 검색 호스트를 사용하지 않는다.

  -np, --no-parent don't ascend to the parent directory.
  상위 디렉토리를 올라가지 않도록 한다.


출처: http://coffeenix.net/board_print.php?bd_code=168

2008년 11월 18일 화요일

그리스도인의 생활을 위한 열 두 가지 준칙



옛적에 예수님의 제자들이 행했던 것처럼, 그렇게 진실되고 훌륭하게 예수님 따르기 위해서는 오늘을 살아가는 우리는 어떻게 해야 할까 ? 


1). 규칙적으로 성경을 읽자 
신문이나 라디오, 혹은 TV를 보고 듣는 것 이상으로 매일 규칙적으로 성경 - 하나님의 말씀을 읽고 생활합시다. "주의 말씀은 내 발에 등이요 내 길에 빛이니이다" 

 

2). 매일 아침저녁으로 기도하자 
하루 동안에 무슨 일이 일어나든지 하나님께 대해 고하고 회개하며, 감사를 드리고, 어려운 문제나 필요한 것 등을 간구합시다. 남을 위해 서로 기도합시다. 그리고 주님의 인도를 받을 시간을 가집시다. "여호와는 자기를 부르는 자들에게 가까이 계신다" 

 

3). 매 주일 교회에서 각종 예배드리라 
일찍 일어나든지, 편할 때나, 일할 때나, 놀 때나 주님께 경배합시다. 
나의 삶의 견고한 지지를 얻기 원하면 주일마다 교회에 가 각종 예배드리는 습관을 간직하라. 
"사람들이 주의 성전에 올라가자고 하는 말을 듣고 내가 기뻐하였나이다" 

 

4). 나의 가정에 항상 하나님을 모셔라 
식사 기도 시간이나, 가정 기도 시간이나 언제나 나의 가정과 친족들 모두가 하나님의 임재를 나의 가정에서 느낄 수 있도록 합시다. 
"여호와께서 집을 지켜주시지 않으면 집을 짓는 자의 수고가 헛되고.." 

 

5). 안식일을 거룩하게 지키라(주일성수) 
예배를 위해서나, 가정과 친구들 간의 우애를 위해서나, 인생에 있어서 가장 훌륭한 것을 위하여 특별한 한 날을 거룩히 지킵시다. 
"안식일을 기억하여 그 날을 거룩하게 지키라" 

 

6). 하나님이 원하시는 대로 매일 일하라 
그리스도의 이름으로 봉사하고, 그리스도인의 윤리에 따라 나의 욕망을 억제하면서 내 뜻대로 살려고 하지말고 하나님이 원하는 대로 일하라 
"나의 수고가 주 안에서 헛되지 않을 것이라" 

 

7). 남에게 봉사할 일을 찾자 
나의 이웃이나 세상 어디에서나 보다 필요한 일에 최선을 다하여 봉사하도록 하라. 평화를 위해 힘써 일하고, 불의와 죄악을 이겨내라. 
"네 이웃을 네 몸처럼 사랑하라" 

 
8). 수입의 일부를 바치자 
교회에서나 자선하는 일에 나의 수입의 십분의 일(십일조)이나 그 밖의 헌금을 기꺼이 바치라. 
"받는 자보다 주는 자가 더 복이 있나니" 

 

9). 즐겁게 살자 
나 자신에게나 남에게 즐거움과 기쁨을 주려고 힘쓰는 태도는 매우 유익한 삶을 끼쳐준다. 
"하나님은 모든 것 위에 더욱 풍성히 기쁨을 주신다" 

 

10). 나의 교회나 나의 신앙을 남과 함께 나누라 친구들을 나의 교회에 함께 데리고 나오고 그리스도인의 믿음을 나의 말과 생활로 보여서 남을 이끌도록 하라. 
"거져(무료로) 받았으니 거저 주라" 

 

11). 나의 생활에 교회를 가장 큰 비중으로 두라. 
교회를 내 생활의 안내와 친구간의 교제나, 내 봉사할 장소로나. 내 영적 가정으로 생각하고 교회를 중심으로 생활하라. 내가 이사하면 즉시 가까운 교회부터 나가서 교회를 통하여 모든 생활 여건을 찾도록 하라. 
"교회는 예수 그리스도의 이름을 부르는 모든 자들의 모임" 

 

12). 내 모든 관계를 사랑으로 조정하라 
어떠한 분류의 사람이든 내게 접촉하는 모든 사람과 분쟁이나 다툼을 피하고 사랑으로 관계를 유지하라. 
"하나님은 사랑이시라" /자료ⓒ창골산 봉서방 

2008년 11월 14일 금요일

델파이 함수 정리

 함수 레퍼런스 정리...(A)  
 Abs 
  문 법 function Abs(X); 
  X 의 절대값을 구하는 함수이다.
절대값이란 값은 같으며 부호가 양수인 수를 말한다.
X 는 정수 또는 실수값이다. 
  예 제 Abs(-3.14); {결과는 3.14}
Abs(3.14); {결과는 3.14}  
 Addr 
  문 법 function Addr(X):Pointer; 
  X 의 번지를 구할 때 쓴 함수이다.
X 는 변수나 함수의 명칭이며 결과는 X의 메모리 번지를 나타내는 포인터 값이며, Pointer형이다. Addr 함수의 리턴값이 Pointer형이므로 Pointer형의 변수에 곧바고 대입될 수 있지만 이 함수의 리턴값으로 메모리를 직접 참조할 수는 없다.
메모리를 참조하기 위해서는 타입 캐스트를 해 주어야 한다. 
  예 제 Var i : Interger;
begin
  P := Addr(i); {i의 번지를 구한다.} 
end;  
 Append 
  문 법 procedure Append(Var f:Text); 
  파일을 추가 기록용으로 오픈할 때 쓰는 함수이다.
파일 변수 F 는 Assign으로 외부 파일과 연결되어 있어야 한다.
외부 파일이 없으면 에러가 발생하며 이미 열려 있는 경우는 파일을 닫은 후 다시 연다.
파일을 오픈한 후 에디터라인은 파일의 끝(EOF)에 위치시키므로 추가적인 데이터를 파일 끝에 추가할 수가 있다.
다음 예는 루트 디렉토리의 Autoexec.Bat 파일 끝에 Prompt 문을 추가시키는 예제이다. 
  예 제 Var F : Textfile;
begin
  AssignFile(F,'c:/autoexec.bat');
  Append(F); {파일 오픈}
  Writeln(F,'Prompt $p$g');
  CloseFile(F); {파일 닫음}
end;  
 AppendStr 
  문 법 procedure AppendStr(Var Dest: String; Const S: String); 
  두 개의 문자열을 결합하는 함수이다.
Dest 문자열 뒷부분에 Src 문자열이 추가되는 것으로, Dest := Dest + S 와 문법적으로 동일한 기능을 수행한다. 
  예 제 Src := 'Apple';
Dest := 'Orange';
AppendStr(Dest, Src);

즉, Dest 문자열은 OrrangeApple 이 된다. 
 AssignFile 
  문 법 procedure AssignFile(Var f, String); 
  텍스트 파일 변수와 외부 파일을 연결시키는 함수이다.
파일 핸들에 파일을 할당하는 것으로 일단 파일과 핸들이 연결되면 핸들에 대한 모든 조작은 파일로 입출력이 된다.
이 프로시져로 핸들에 파일을 할당한 후 Reset이나 Rewrite등을 사용하여 파일을 오픈하며, Writeln이나 Readln으로 파일 입출력을 수행한다.
파일 이름은 문자열 형태로 전달하되 필요한 경우 드라이브명과 디렉토리명을 사용할 수 있다. 주의할 것은 이미 열려져 있는 파일핸들을 재할당해서는 안된다는 점이다.
다음 예는 text.txt파일에서 첫 줄을 읽어 에디트 박스로 출력하는 예이다. 
  예 제 Var F: TextFile; S: String;
begin
  AssignFile(F, 'text.txt');
  Reset(F);
  Readln(F,S);
  Edit1.Text := S;
  CloseFile(F);
end;  
   
  
 함수 레퍼런스 정리...(C)  
 ChangeFileExt 
  문 법 function ChangeFileExt(Const FileName, ExTension:string):string; 
  첫번째 인수 FileName으로 주어진 파일의 이름 중 파일의 확장자만 두번째 인수 Extension 으로 변경하는 함수이다.
다음 예는 인수로 주어진 파일의 확장자를 무조건 INI파일로 변경하는 예이다. 
  예 제 ChangeFileExt(ParamStr(0),'.INI');  
 Chdir 
  문 법 procedure chdir(S:string); 
  인수 S가 지정하는 경로로 현재 디렉토리를 변경하는 함수이다.
만약 S가 드라이브 문자를 포함하고 있을 경우 현재 드라이브도 변경된다. 
 Chr 
  문 법 function Chr(X:Byte):Char; 
  서수값 X가 지정하는 무자를 구하는 함수이다.
아스키 코드값을 X로 전달하면 해당하는 문자를 얻을 수 있는데 Chr(65)는 알파벳 문자로 A를 뜻한다. 이 함수를 사용하면 키보드로 직접 입력할 수 없는 문자를 입력할 수 있는 쓰임새가 많은 함수이다. 
 CloseFile 
  문 법 procedure CloseFile(Var F); 
  파일 핸들과 외부 파일과의 연결을 끊고 파일 핸들을 닫는 함수이다.
파일 변수 F는 Reset, Rewrite, Append 등에 의하여 오픈된 파일 핸들이며 파일 핸들은 사용 후에 반드시 닫아주어야 하는 함수이다. 
  예 제 Var F: TextFile; S: String;
begin
  AssignFile(F, 'text.txt');
  Reset(F);
  Readln(F,S);
  Edit1.Text := S;
  CloseFile(F); // 파일을 반드시 닫아줘야 한다.
end;  
 CompareStr 
  문 법 function CompareStr(Const Si, S2: string):Integer; 
  두개의 문자열 S1 과 S2 를 비교하되 대소문자를 구분하여 비교하는 함수이다.

S1 과 S2 문자열이 같으면 0 값을 리턴한다.
S1 < S2 이면 음수의 값을 리턴하며, S1 > S2 이면 양수를 리턴한다.

문자열끼리의 비교는 문자열을 이루는 각 문자의 문자 코드를 비교하여 수행되며, 현재 설치된 언어 드라이버에는 영향을 받지 않는다. 
 CompareText 
  문 법 function CompareText(Const S1, S2 : String):Integer; 
  두개의 문자열 S1 과 S2를 비교하되 대소문자를 구분하지 않고 비교하는 함수이다.

S1 과 S2 문자열이 같으면 0을 리턴하며 S1 < S2 이면 음수의 값을 리턴한다.
S1 > S2 이면 양수를 리턴한다.

문자열끼리의 비교는 문자열을 이루는 각 문자의 문자 코드를 비교하여 수행된다.
"Apple" 과 "APPLE" 을 CompareText 함수로 비교하면 결과는 0 이다.
두 문자열이 같은 것으로 비교되지만 CompareStr 함수로 비교하면 결과는 두 문자열이 서로 다른 것으로 비교된다. 
 Concat 
  문 법 function Concat(S1 [, S2, ... , Sn]:String):String; 
  두개 이상의 문자열들을 결합하여 새로운 긴 문자열을 만드는 함수이다.
만약 문자열을 연결한 결과가 255문자 이상일 경우 255번째 이후의 문자는 잘려나간다.
이 함수 대신 + 연산자를 사용하여 문자열을 결합해도 결과는 동일하다.
Concat('Korea','China') 의 경우는 'Korea'+'China'는 같은 결과의 예이다.
다음 예는 Edit1에 입력된 문자열과 Edit2에 입력된 문자열을 한해 Edit3에 대입한다. 
  예 제 Edit3.Text := ConCat(Edit1.Text, Edit2.Text); 
 Continue 
  문 법 procedure Continue; 
  For, While, Repeat 등의 반복문에서 사용되며 다음 반복 부분으로 흐름을 옮기도록 하는 함수이다.
루프의 남은 뒷부분은 무시되며 루프의 조건 점검부로 점프한다.
만약 반복 루프 외부에서 이 프로시저가 사용되면 에러가 발생한다.
다음 예는 i가 1~100 까지 증가하며 모종의 처리를 하되 i 가 10인 경우만 특별히 처리가 생략되는 예이다. 
  예 제 For i := 1 to 100 do
begin
  If i = 10 then continue;
  ...
end;  
 Copy 
  문 법 procedure Copy(S:String; Index, Count:Integer):String; 
  한 문자열의 부분 문자열을 추출해 내는 함수이다. 
S 문자열의 Index 위치에서부터 Count 문자분의 부분 문자열이 추출된다.
Index 가 문자열의 전체 길이보다 길 경우 빈 문자열을 리턴하며 Count가 문자열의 남은 부분보다 클 경우 문자열의 끝까지 추출해 낸다.
Dest 문자열이 'Orange'일 경우 Copy(Dest, 2, 3)은 Dest문자열의 두번째 문자에서부터 3문자분의 부분 문자열인 'ran'을 추출해 낸다. 
   
  
 함수 레퍼런스 정리...(D)  
 Date 
  문 법 function Date(Date:TDateTime); 
  시스템의 시계를 참조하여 오늘 날짜를 구하는 함수이다.
날짜는 TDateTime형이므로 곧바로 문자열로 출력할 수 없으며, DateToStr 함수를 사용하여 문자열로 바꾸어 주어야만 한다. 
다음 예는 Label1에 오늘 날짜가 출력되는 예제이다. 
  예 제 Label1.Caption := DateToStr(Date);  
 DateTimeToFileDate 
  문 법 function DateTimeToFileDate(DateTime: TDateTime):Longint; 
  TDateTime형의 날짜,시간 값을 DOS형식의 날짜,시간형식으로 바꾸는 함수이다.
도스 형식의 날짜는 4바이트의 정수형이며 각 비트에 날짜,시간 요소를 포함하고 있다.
다음 예는 도스형식의 날짜, 시간 형식을 레이블로 출력하는 예제이다. 
  예 제 Label1.Caption := IntToStr(DateTimeToFileDate(Now)); 
 DateTimeToStr 
  문 법 function DateTimeToStr(DateTime: TDateTime):String; 
  날짜와 시간을 담은 TDateTime형의 변수를 문자열로 바꾸는 함수이다.
만약 DateTime 인수가 날짜를 포함하지 않으면 날짜는 00/00/00 이 되며, 시간을 포함하지 않으면 00:00:00 AM이 된다.
다음 예는 현재 시간과 날짜를 레이블로 출력하는 예이다. 
  예 제 Label1.Caption := DateTimeToStr(Now); 
 DateToStr 
  문 법 function DateToStr(Date: TDateTime):String; 
  날짜를 담는 TDateTime형의 변수에서 날짜를 문자열로 바꾸는 함수이다.
다음 예는 오늘 날짜를 레이블로 출력하는 예이다. 
  예 제 Label1.Caption := DateToStr(Date); 
 DayOfWeek 
  문 법 function DayOfWeek(Date: TDateTime):Integer; 
  특정 날짜의 요일을 계산하는 함수이다. 리턴되는 값은 1~7까지의 정수이며, 1이 일요일, 7일 토요일이다. 리턴되는 값이 정수형이므로 월, 화, 수 , 목, 금, 토, 일 로 실제요일 이름으로 바꾸어 주어야 한다. 
다음예는 요일이름을 레이블로 출력한다. 
오늘이 무슨 요일인지 조사해서 요일 이름을 레이블로 출력하는 예이다.  
  예 제 Var 
  Yo : String; 
  ONUL: TDateTime; 
begin 
  ONUL := Now; 
  Case DayOfWeek(ONUL) of 
  1 : Yo := '일'; 
  2 : Yo := '월'; 
  3 : Yo := '화'; 
  4 : Yo := '수'; 
  5 : Yo := '목'; 
  6 : Yo := '금'; 
  7 : Yo := '토'; 
  end; 
  Label1.Caption := '오늘은 ' + YO + '요일입니다.'; 
end; 
 DecodeDate 
  문 법 procedure DecodeDate(Date : TDateTime; Var Year, Month, Day: Word); 
  날짜를 담는 TDatetime형의 변수에서 년,월,일의 값을 분리시키는 함수이다. 
분리된 값들은 각각 Year, Month, Day 등의 정수형 변수에 대입된다. 
날짜값은 DateToStr 함수로, 문자열로 바꾼 후 한꺼번에 출력할 수 있지만 개별적인 요소를 가공할 후 한꺼번에 출력할 수 있지만, 개별적인 요소를 가공한 후 출력하고자 할 경우는 이 함수를 사용한다. 이 함수의 반대 함수는 EncodeDate 함수이다. 
다음예는 오늘 날ㅉ와 현재 시간을 조사한 후 문자열 조립을 통해 말로 시간과 날짜를 알려준다. 
  예 제 Var 
  Present: TDateTime; 
  Year, Month, Day, Hour, Min, Sec, MSec: Word; 
begin 
  Present := Now; 
  DecodeDate(Present, Year, Month, Day); 
  Label1.Caption := '오늘은'+IntToStr(Year)+'년'+IntToStr(Month)+'월'
  +IntToStr(Day)+'일입니다.'; 
  DecodeTime(Present, Hour, Min, Sec, MSec); 
  Label2.Caption := '지금은'+IntToStr(Hour)+'시'+IntToStr(Min)+'분'
  +IntToStr(Sec)+'초입니다.'; 
end;  
 DecodeTime 
  문 법 fun; 
  시간을 담는 TDateTime형의 변수에서 시, 분, 초의 값을 분리시키는 함수이다. 
분리된 값들은 각각 Hour, Min, Sec, MSec 등의 정수형변수에 대입된다. 
시간값은 TimeToStr 함수로 문자열로 바꾼후 한꺼번에 출력할 수 있지만 개별적인 요소를 가공한 후 출력하고자 할 경우는 이 함수를 사용한다. 
이 함수의 반대 함수는 EncodeTime 함수이다. 
DecodeTime 함수의 예제를 참조하기 바란다.  
 Delete 
  문 법 procedure Delete(var S:String; Index, Count: Integer); 
  한 문자열에서 부분 문자열을 삭제하는 함수이다.
S 문자열의 Index위치에서부터 Count 문자분의 부분 문자열이 삭제된다. 
Index 가 문자열의 전체 길이보다 길 경우 삭제는 이루어지지 않으며, Count가 문자열의 남은 부분보다 클 경우 문자열이 끝까지 삭제된다. 
Dest 문자열이 'Orange'일 경우 Delete(Dest, 2, 3)은 Dest 문자열의 두번째 문자에서부터 3분자분의 부분 문자열인 'ran'을 삭제하며 Dest 문자열은 'Oge'가 된다. 
 DeleteFile 
  문 법 function DeleteFile(const FileName: String): Boolean; 
  디스크 상의 파일을 지우는 함수이다. 
파일이 없거나 읽기 전용 속성을 가질 경우 False를 리턴하며 파일은 지워지지 않는다. 
그러나 파일을 지울 수 없는 경우라도 예외는 발 생하지 않는다. 
파일은 경로를 포함할 수 있으며, 다음 예는 C 드라이브의 루트에 있는 Command.com 파일을 지우는 예이다. 
물론, 이 명령을 실행한 후부터 부팅이 되지 않으니 다른 파일로 실험하세요.  
  예 제 DeleteFile('C:/Command.Com'); 
 DirectoryExists 
  문 법 function DirectoryExists(Name: string): Boolean; 
  인수로 전달된 디렉토리가 존재하는지 검사하며 존재할 경우 True값을 리턴하고 존재하지 않을 경우 False값을 리턴한다. 
   
  
 함수 레퍼런스 정리...(E)  
 EncodeDate 
  문 법 function EncodeDate(Year, Month, Day: Word): TDateTime; 
  정수형으로 주어진 년, 월, 일의 값을 사용하여 날짜를 담은 TDateTime 형의 변수 하나를 만들어 주는 함수이다. 
Year 는 1~9999까지의 값을 가지며 Month는 1~12, Day는 1~31까지 가능하다. 
단, Day값의 범위는 Month 값의 영향을 받으며 Year는 윤년인 경우의 영향도 받는다. 
만약 날짜값이 무효일 경우, 예를 들어 2월30일 등의 값이 주어지면 EConvertError예외가 발생하다. 
년,월,일을 개별적으로 입력받아 하나의 날짜값을 만들고자 할 때 이 함수를 사용한다. 
이 함수의 반대는 DecodeDate 이다.  
 EncodeTime 
  문 법 function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime; 
  정수형으로 주어진 시, 분, 초의 값을 사용하여 시간을 담은 TDatetime형의 변수 하나를 만든다. 
Hour 는 0~12까지 가능하며, 만약 Time24Hour가 True일 경우 0~23까지의 24시간을 표현할 수 있다. 
Min, Sec은 0~59까지 가능하며 MSec은 0~999까지 가능하다. 
시간값이 무효일 경우, 예를 들어 8시 86분 등의 값이 주어지면 EConvertError 예외가 발생한다. 
시,분,초를 개별적으로 입력받아 하나의 시간값을 만들고자 할 때 이 함수를 사용한다. 
이 함수의 반대는 DecodeTime 이다.  
 Eof 
  문 법 function Eof[(Var F: Text)]: Boolean; 
  입력한 값들에 대한 끝인가를 점검하는 함수로서 Eof는 End Of File을 의미한다. 
DB 작업을 할때, While문을 많이 쓰게 되는데 이경우 필드의 끝이 아닐때까지 계속 루프를 돌리는 작업때 많이 쓰이게 된다.  
 ExpandFileName 
  문 법 function ExpandFileName(const FileName: string): String; 
  파일 이름에 드라이브명과 디렉토리명을 붙여 완전 경로(Full Path)를 만들어내는 함수이다. 덧붙여지는 경로는 현재 드라이브와 현재 디렉토리이다.  
 ExtractFileExt 
  문 법 function ExtractFileExt(const FileName: string): string; 
  완전 경로에서 파일의 확장자만 분리시키는 함수이다. 
특정 파일의 확장자를 알고자 할 때 이 함수를 사용하여 확장자만 분리한 후 문자열 비교를 수행하면 된다. 
 ExtractFileName 
  문 법 function ExtractFileName(const FileName: String): String; 
  완전 경로에서 파일 이름만 분리해 내는 함수이다. 
파일의 확장자도 같이 분리된다. 
즉, 완전 경로에서 드라이브명과 디렉토리명이 제외된다.  
 ExtractFilePath 
  문 법 function ExtractFilePath(const FileName: String): String; 
  완전 경로에서 파일 이름을 제외하고 드라이브명과 디렉토리명만 분리해 내는 함수이다.
다음 예는 완전 경로를 가진 FileName 으로부터 경로만 분리해낸 후 파일이 있는 디렉토리로 이동한다. 
  예 제 Chdir(ExtractFilePath(FileName)); 
   
  
 함수 레퍼런스 정리...(F)  
 FileExists 
  문 법 function FileExists(const FileName: String): Boolean; 
  파일이 디스크상에 존재하는지를 조사하는 함수로서, 파일이 없을 경우 False를 리턴한다. 존재하지 않는 파일을 사용하고자 할 경우 예외가 발생하므로 먼저 이 함수를 사용하여 파일이 있는지를 먼저 확인해 보아야 한다. 
다음 예는 파일의 존재 여부를 점검해 본 후 파일을 삭제하는 예이다.  
  예 제 If FileExists(FileName) Then DeleteFile(FileName); 
 FileOpen 
  문 법 function FileOpen(const FileName: String; Mode: Word): Integer; 
  델파이가 사용하는 내부적인 함수로서 사용자가 직접 사용하는 경우는 드문 함수이다. 파일을 오픈할 때는 델파이가 제공하는 Reset, Rewrite, Append등의 프로시저를 사용한다.  
 FileSearch 
  문 법 function FileSearch(const Name, DirList: String): String; 
  DirList에 주어진 디렉토리의 경로에 Name파일이 있는지를 조사해주는 함수로서, DirList는 도스의 Path문에서와 같이 여러개의 디렉토리명을 세미콜론으로 끊어 기입한다. 파일을 찾을 경우 파일의 완전경로를 리턴하며 파일을 찾지 못할 경우 널스트리을 리턴한다.  
 FindClose 
  문 법 procedure FindClose(var SearchRec: TSearchRec); 
  FindFirst, FindNext 함수를 사용한 파일검색을 종료하는 함수로서, 굳이 파일 검색 작업을 종료해 주어야 할 필요는 없으며, 실제로 16비트 버젼의 윈도우에서 이 함수는 아무런 일도 하지 않지만, 32비트 버젼의 윈도우에서는 반드시 검색 종료를 해 주어야 하므로 호환성을 위해 검색 후 종료해 주는 것이 좋다.  
 FindFirst 
  문 법 function FindFirst(const Path: String; Attr: Word; Var F: TSearchRec): Integer; 
  주어진 검색조건과 파일의 속성을 사용하여 첫 번째 일치하는 파일을 검색해 내는 함수로서, Path는 검색하고자 하는 디렉토리와 파일의 조건이며 와일드 카드식으로 표현이 된다. 
예를 들어 'c:/windows/*.exe'는 windows 디렉토리의 확장자가 EXE 인 첫번째 파일을 검색한다. Attr인수는 검색대상이 되는 파일의 속성을 지정하며 아래와 같은 속성 상수를 사용한다. 
여러가지 속성을 사용할 경우에는 'Or' 연산자로 속성을 연결하면 된다. 예를 들어 읽기전용이면서 숨은 파일을 검색하고 싶다면(faReadOnly + faHidden)과 같이 Attr인수를 설정하면 되는 것이다.  
  상 수 값 의 미 
faReadOnly $01 읽기 전용 
faHidden $02 숨은 파일 
faSysFile $04 시스템 파일 
faVolumeID $08 디스크 볼륨 
faDirectory $10 디렉토리 
faArchive $20 기록 속성 
faAnyFile $3F 모든 속성 
 
 FindNext 
  문 법 function FindNext(var F:TSearchRec): Integer; 
  FindFirst에 이어 계속 검색을 수행하는 함수이다. FIndFirst가 첫번째 검색한 결과를 저장한 F를 다시 인수로 넘겨주면 계속해서 일치하는 조건을 가진 파일을 검색해 내며, 검색한 결과는 역시 F로 저장된다. 
검색이 계속 이루어지고 있다면 0을 기턴하며 검색중 에러가 발생했거나 더 이상 조건이 일치하는 파일이 없으면 음수의 에러코드를 리턴한다. 
FindFirst와 FindNext는 조건에 맞는 모든 파일을 검색해 낼 때 사용한다.  
 Format 
  문 법 function Format(const Format: String; const Args: Array of const): String; 
  서식 문자열과 뒤따라오는 변수에 의해 문자열을 포맷하는 함수이다. 계산식이나 회계분야에서는 가끔씩 써먹는 함수로서, 이러한 포맷도 지원하는구나하는 정도로 가볍게 받아두고 필요시 다시 살펴보는 방법이 가장 좋은 방법인것 같다. 

C의 pintf함수와 사용방법이 유사하며 문자열 내부에 변수값을 삽입할 수 있는 아주 편리한 방법을 제공한다. 
서식 문자열에는 일반 문자열과 서식이 삽입되며 일반 문자열은 그대로 출력되지만 서식은 대응되는 인수값으로 채워진다. 

서식은 % 기호와 변수의 타입으로 이루어지며 % 와 타입 사이에 인덱스, 좌측 정렬 지정, 폭, 정밀도 지정이 삽입된다. 

%[인덱스:][-][폭][.정밀도]타입 일단 Format함수를 사용하는 예를 들어보자... 

Var A : Integer; S, 
  St : String; 
Begin 
  A := 29; 
  B := 'Lyon, Kim'; 
  St := Format('My age is %d, My Name is %s', [A,S]); 
End; 

서식 문자열에 포함된 %d 자리에는 정수형 변수인 A의 값인 29 가 삽입되며, %s 의 자리에는 문자열 변수인 S의 값 Lyon, Kim 이 삽입되는 방식이다. 
그럼, 당연히 St 의 문자열은 My age is 29, My Name is Lyon, Kim 이 되는 것이다. 

서식 문자열 내의 서식은 인수 리스트의 변수들과 순서대로 대응되며 서식의 개수와 인수의 개수가 일치해야 할뿐만 아니라 대응되는 서식과 변수의 타입도 일치해야만 한다. 

만약 개수나 타입이 일치하지 않을 경우 컴파일은 가능하지만 실행중에 에러가 발생하게 된다. 폭 지정이란 변수값이 문자열 내부에서 차지하는 자리수를 지정하며 생략시는 변수값의 길이만큼만 자리를 차지한다. 강제로 자리를 늘리고자 할 경우 서식과 타입사이에 폭을 정수로 지정한다. 예를 들어 %5d 라고 하면 이 서식에 대입되는 정수가 5자리가 안되더라도 5자리를 강제로 차지한다. 

단, 여기서 지정하는 폭 지정은 최소한의 폭을 의미할 뿐이며 폭값이 실제값보다도 작더라고 강제로 폭에 맞추지는 않는다. 예를 들어 I가 12345라는 다섯자리 값을 가지는데 %2d와 대응될 경우 폭지정 2를 지키기 위해 45만 출력하지 않으며 이경우는 폭 지정이 무시된다. 즉, I의 12만이 대응된다고 볼 수 있다. 

정밀도 지정이란 실수에 사용되며 소수점 이하 몇 자리까지를 문자열로 바꿀 것인가를 지정한다. %10.5f 서식은 10자리를 차지하며 소수점 이하 5자리까지 문자열로 출력한다. 좌측 정력 지정은 폭이 변수값보다 길 경우 공백을 우측에 배치하도록 하며 폭 지정 앞에 '-' 기호를 붙여 표현한다. 
%5d 에 대응되는 정수값이 만약 12일 경우 출력은 'bbb12' 가 되지만, 서식을 %-5d 로 변경하면 '12bbb'가 된다. 여기서 b 표시는 공백을 의미한다. 

인덱스 지정자는 인수 리스트의 몇 번째 인수를 사용할 것인가를 지정하며 정수 하나와 ':' 을 사용한다. 인덱스 지정자가 없으면 인수 리스트에 나타나는 순서대로 서식과 대응되지만 인덱스를 밝힘으로써 중복되는 인수 리스트를 재사용할 수 있다. 

예를 들어 '%d%d%d,1,2,3'은 앞쪽 서식부터 순서대로 정수 1,2,3로 대응되지만 '%d%d%0:d'는 앞쪽 둘은 순서대로 1,2에 대응되고 세번째 서식은 인덱스 지정에 의해 첫 번째 인수 1에 대응된다. 

타입 문자는 아래와 같으며 대문자와 소문자를 구분하지는 않는다.  
  문 자 의 미 
d 정수값 하나에 대응된다.
대응되는 변수는 반드시 정수이어야 한다. 
e 실수값을 공학적 표기법, 즉 부동 소수점 형식으로 변환된다. 
f 실수값을 부동 소수점 형식으로 변환한다. 
g 실수값과 대응하되 고정 소수점 형식과 부동 소수점 형식 중 길이가 짧은쪽으로 변환한다. 
n 실수값에 대응하며, 천단위로 콤마를 삽입해 준다. 
p 포인터 값에 대응된다.
출력되는 문자열은 SSSS:0000 형태의 세그먼트, 오프셋 형태를 띄며 이때, 세그먼트, 오프셋은 모두 네 자리의 16진수를 사용한다. 
m 실수값에 대응되며, 화폐 형태의 문자열로 변환한다. 
s 문자열 변수, 문자 변수에 대응된다. 
x 정수에 대응되며, 16진수 형태의 문자열로 변환된다. 
 
 FormatDateTime 
  문 법 function FormatDateTime(const Format: String; DateTime: TDateTime): String; 
  TDateTime형의 변수에 저장된 시간과 날짜 정보를 특정한 형태의 문자열 포맷으로 변환하는 함수이다. 
이 함수는 시스템의 날짜와 시간을 받아 사용하므로 Y2K 문제를 해결해 나갈 수 있는 아주 유용한 함수임을 알았으면 한다. 

문자열로 출력되는 형식은 다음과 같은 지정자에 의해 결정되며 각 지정자는 한 칸 이상의 공백으로 구분되어야 한다. 포맷을 지정하는 Format 인수에는 지정자와 일반 문자열들이 올 수 있으며 일반 문자열들은 겹 따옴표로 싸 주어야 한다. 
지정자의 대소문자는 구분하지 않는다. 

아래는 FormatDateTime함수내에서 사용하는 문자들이다. 
  지 정 자 의 미 
c 전역변수 ShortDateFormat, LongTimeFormat이 지정하는 형식대로 출력되며 지정자가 생략될 경우의 디폴트 지정자이다.  
d 날짜값을 출력하되 선행 제로를 생략한다. (1~31) 
dd 날짜값을 출력하되 선행 제로를 출력한다. (01~31) 
ddd 요일을 생략형으로 출력한다. Sun, Mon, Sat 등과 같이 출력된다.
이 생략형 요일 이름은 ShortDayNames 변수에 의해 지정된다. 
dddd 요일이름은 완전한 형식으로 출력한다.
Sunday, Monday 등과 같이 출력된다. 완전한 요일 이름은 LongDayNames변수에 의해 지정된다. 
ddddd ShortDateFormat 전역 변수가 지정하는 형식으로 날짜가 출력된다. 
dddddd LongDateFormat 전역 변수가 지정하는 형식으로 날짜가 출력된다. 
m 월을 출력하되 선행 제로를 생략한다. (1~12) 
mm 월을 출력하되 선행 제로를 출력한다. (01~12) 
mmm 월 이름을 생략형으로 출력한다. Jan, Dec 등과 같이 출력한다.
이 생략형 월 이름은 ShortMonthName 변수에 의해 지정된다. 
mmmm 월 이름은 완전한 형식으로 출력한다. 
January, December 등과 같이 출력된다.
완전한 월 이름은 LongMonthName 변수에 의해 지정된다. 
yy 년도를 두자리 숫자로 출력한다. (00~99) 
yyyy 년도를 네자리 숫자로 출력한다. (0000~9999) 
h 시간을 출력하되 선행 제로를 생략한다. (1~12) 
hh 시간을 출력하되 선행 제로를 출력한다. (01~12) 
n 분을 출력하되 선행 제로를 생략한다. (1~59) 
nn 분을 출력하되 선행 제로를 출력한다. (01~59) 
s 초를 출력하되 선행 제로를 생략한다. (1~59) 
ss 초를 출력하되 선행 제로를 출력한다. (01~59) 
t 시간값을 ShortTimeFormat 전역 변수가 지정하는 형식으로 출력한다. 
tt 시간값을 LongtimeFormat 전역 변수가 지정하는 형식으로 출력한다. 
am/pm 오전과 오후를 출력하며 h 나 hh 지정자의 시간을 12간제로 출력한다.
오전이면 am 이 출력되며 오후면 pm 이 출력된다.
대문자 소문자 모두 쓸 수 있으며, 혼합해서 쓸 수도 있다.
출력되는 결과는 이 지정자의 대소문자 구성을 따른다.
즉, Am/Pm 지정자를 쓰면 Am 이나 Pm 이 출력되며,
AM/PM 지정자를 쓰면 AM 이나 PM 이 출력된다.  
a/p 오전과 오후를 출력하며 h 나 hh 지정자의 시간을 12시간제로 출력한다.
오전이면 a 가 출력되며 오후면 p 가 출력된다.
대문자 소문자 모두 쓸 수 있으며 혼합해서 쓸 수도 있다.
출력되는 결과는 이 지정자의 대소문자 구성을 따른다. 
ampm 12시간제로 시간을 출력하며 오전일 경우 전역 변수 TimeAmString에 저장된 문자열을 출력하며 오후일 경우 TimePmString에 저장된 문자열을 출력한다. 
/ DataSeparator 지정자가 지정하는 날짜 구분 기호를 출력한다. 
: TimeSeparator 지정자가 지정하는 시간 구분 기호를 출력한다. 
 
  예 제 FormatDateTime('dddd mmmm d yyyy hh:mm AM/PM', Now);
FirDay December 24 1999 12:25 PM

FormatDateTime(' "지금시간은" ddd mmm d yyyy hh:mm AM/PM', Now);
지금시간은 Fri Dec 24 1999 12:26 PM 
   
   



 


--------------------------------------------------------------------------------

 함수 레퍼런스 정리...(G)  
 GetDir 
  문 법 procedure GetDir(D: Byte; Var S: String); 
  지정한 드라이브의 현재 드렉토리를 조사하는 함수이다.

D로 드라이브의 번호를 지정하면 현재 디렉토리가 문자열 S 에 대입되며, 드라이브 번호 D 는 0 일 경우, 디폴트 드라이브 1일 경우 A, 2일 경우 B등과 같이 지정한다. 
이 프로시져는 일체의 에러 체크를 하지 않는다. 
만약 드라이브 번호로 주어진 D 가 존재하지 않을 경우 조사되는 디렉토리는 'X:/' 가 된다. 

다음 예는 현재 드라이브의 디렉토리를 조사하여 레이블에 출력하는 예이다.  
  예 제 Var 
  dir: String; 
begin 
  GetDir(0, dir); 
  Label1.Caption := Dir; 
end;  
 GetMem 
  문 법 procedure GetMem(Var P: Pointer; Size: Word); 
  동적으로 메모리를 할당하며 할당된 번지를 포인터형의 변수 P 에 대입하는 함수이다. Size 는 동적으로 할당할 메모리의 크기를 바이트 수로 나타내며, 할당된 메모리의 변수는 P^ 로 읽거나 쓸 수 있다.  
   

   
 함수 레퍼런스 정리...(H)  
 Halt 
  문 법 procedure Halt[ (ExitCode: Word)]; 
  프로그램을 강제로 종료하고 운영체제로 제어권을 넘기는 함수이다. 
Exitcode 는 프로그램의 탈출코드이다.  
 High 
  문 법 function High(X); 
  인수로 주어진 X 의 값 중 가장 큰값을 찾는다. 
X 가 integer형이라면 결과는 32767이 되며 LongInt형이라면 결과는 2147483647이 된다. 결과값은 인수로 주어진 X와 동일한 형태이다. 
다음 예는 열거형 중 가장 큰 값을 찾아내는 예제이다. 
레이블로 출력되는 값은 6이다.  
  예 제 type 
  Day = (sun, mon, tue, wed, thu, fri, sat); 
Var 
  i : Integer; 
begin 
  i := integer(High(Day)); 
  label1.Caption := IntToStr(i); 
end; 
   

   
 함수 레퍼런스 정리...(I)  
 Inc 
  문 법 procedure Inc(Var X[N: Longint]; 
  변수의 값을 1 증가시키는 함수이다. Inc(X)는 X := X + 1 과 동일한 동작을 한다. 
두 번째 인수를 사용하면 1 이상의 값을 증가시킬 수도 있다. 
Inc(X, 5)는 X := X + 5 와 동일한 동작을 한다. 
첫 번재 인수는 서수형의 변수이며 확장 문법이 적용될 경우 PChar형도 가능하다. 
N 은 정수형의 상수 또는 변수여야 한다. 
Inc 함수는 가장 최적화된 코드를 생성해 내므로 루프 내부에서 사용하기에 적합하다. 
 Include 
  문 법 procedure include(Var S: Set of T; I: T); 
  집합형 S 에 요소 I 를 추가하는 함수이다. 
Include(S, I) 는 S := S + (1) 와 동일한 동작을 하지만 좀 더 효율적인 코드를 생성해 낸다.  
 InputBox 
  문 법 function InputBox(Const ACaption, APrompt, ADefault: String): String; 
  문자열을 입력할 수 있는 대화상자를 보여주고 사용자에게 문자열을 입력받아 리턴한다. 인수의 의미는 인수의 이름을 참조하기 바란다. 
아래의 예제는 사용자가 문자열을 입력후 Cancle 버튼을 누르면 디폴트 문자열이 리턴되며 OK 버튼을 누르면 에디트 박스에 입력된 문자열이 입력된다.  
  예 제 Var 
  Str : String; 
begin 
  Str := InputBox('함수레퍼런스정리[I]','잘되죠?','Oh ! Yes'); 
end;  
  그 림  
 InputQuery 
  문 법 function InputQuery(const ACaption, APrompt: String; Var Value: String): Boolean; 
  문자열을 입력할 수 있는 대화상자를 보여주고 사용자에게 문자열을 입력받아 리턴한다. 대화상자가 열리면 아무것도 입력되어 있지 않은 빈 에디트를 보여주며 이 에디트에 사용자가 문자열을 입력한다. 
입력된 결과는 리턴값으로 전달되며는 것이 아니라 참조호출로 전달된 Value로 전달되며 리턴값은 사용자가 누른 버튼의 종류이다. 
아래의 예제는 사용자가 대화상자에서 어떤 버튼을 눌렀는가를 꼭 알아야 할 경우는 InputQuery 를 사용하며 단순히 문자열만 입력받고자 할 경우는 InputBox 를 사용하면 된다.  
  예 제 Var 
  Str : String; 
  Ans : Boolean; 
begin 
  Ans := InputQuery('함수레퍼런스정리[I]','이것도 잘되죠?',Str); 
end;  
  그 림  
 Insert 
  문 법 procedure Insert(Source: String; Var S: String; Index: Integer); 
  한 문자열의 중간에 다른 문자열을 삽입하는 함수이다. 
삽입되는 위치는 Index 인수가 지정하는 위치이다. 
문자열을 삽입한 후의 문자열 길이가 255 자를 넘을 경우 255 문자 이후의 문자는 잘려진다. 
Dest 문자열이 'Orange' 이고, Src 문자열이 'Apple' 인 경우 Insert(Src, Dest, 3); 는 Dest 문자열의 3번째 문자인 a 위치에 Src 문자열을 삽입하며 Dest 문자열은 'OrAppleange' 가 된다. 
아래 예제는 레이블로 abcdhotdogefghijkl 문자열이 출력된다.  
  예 제 Var 
  S : String; 
begin 
  S := 'abcdefghijkl'; Insert('hotdog', S , 5); 
  label1.Caption := S; 
end; 
 Int 
  문 법 function Int(X: Real): Real; 
  실수 X의 정수부를 구하는 함수이다.
소수부는 반올림되지 않으며 버려진다.
Int(3.14) 는 3 의 값을 반납한다.
주의할 것은 Int 함수의 리턴값은 정수값을 담지만 데이터형은 여전히 실수형이라는 점이다. 
 IntToHex 
  문 법 function IntToHex(Value: Longint; Digits: Integer): String;  
  10 진 정수값을 16진수 형태의 문자열로 바꾸어 문자열을 리턴하는 함수이다.
예를 들어 IntToHex(100, 2) 명령에 의해 십진수 100을 16진수로 바꾼 문자열 '64'가 리턴된다. Digits 인수는 만들어질 16진수의 자리수를 지정한다. 
그러나 이 값은 최소한의 자리수를 지정할 뿐이며 자리수보다 16진수의 크기가 더 많을 경우는 이 인수값은 무시된다.
즉, IntToHex(100, 3)에 의해 최소한 세 자리를 할당하여 '064'가 리턴되지만 IntToHex(100, 1)로 한다고 하면 두 자리의 16진수를 강제로 한 자리 숫자로 만들지는 않는다는 것이다. 
 IntToStr 
  문 법 function IntToStr(Value: LongInt): String; 
  정수를 문자열로 바꾸어 리턴하는 함수이다.
정수값을 레이블이나 에디트박스에 출력하고자 할 경우 직접 그 값을 출력할 수는 없다.
왜냐하면 레이블의 Caption 속성이나 에디트의 Text 속성은 문자열형이므로 정수형 값을 대입받을 수 없기 때문이다.
정수값을 문자열로 바꾸고자 할 경우에는 이 함수를 사용한다.  
 IOResult 
  문 법 function IOResult: Integer; 
  마지막 입출력 동작에서 발생한 상태값을 조사한다.
이 함수를 사용하여 입출력 에러를 검사하려면 {$I-} 옵션을 반드시 꺼 주어야 한다.
IOResult 함수를 호출하면 내부적인 에러값은 리셋된다.
이 함수가 리턴하는 값이 0 이면 에러가 없다는 것이다. 

   
 함수 레퍼런스 정리...(K)  
 KeyPressed 
  문 법 function KeyPressed: Boolean; 
  키보드에서 키가 눌러지면 True 를 리턴하며, 키가 눌러져 있지 않으면 False 를 리턴하는 함수이다.
ReadKey 함수로 키 값을 읽기 전에 키가 눌러져 있는지 점검해 볼 때 사용한다. 
   

   
 함수 레퍼런스 정리...(L)  
 Length 
  문 법 function Length(S: String): Integer; 
  주어진 문자열의 길이를 구하는 함수이다. 
Length('Korea') 는 5의 값을 리턴한다.  
 LowerCase 
  문 법 function LowerCase(Const S: String): String; 
  문자열 내부의 대문자를 모두 소문자로 바꾸어주는 함수이다. 
문자 변환은 7비트의 아스키 코드 내에서 이루어지며 문자 'A' ~ 'Z' 까지가 변환의 영향을 받는다. 
나머지 기호나 숫자, 한글은 변환되지 않는다.  
   
   





--------------------------------------------------------------------------------


 함수 레퍼런스 정리...(M)  
 MessageDlg 
  문 법 function MessageDlg(Const msg: String; AType: TMsgDlgType; 
  AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word; 
  Message를 전달하는 대화상자를 보여주며 사용자로부터 응답을 받아들여 리턴하는 함수이다. 
Msg 문자열이 Message의 내요이며 AType에 의해 Message 상자의 형태와 캡션에 출력된 문자열이 결정된다.  
  값 형 태 
mtWarning 노란색 느낌표 비트맵이 나타난다. [그림참조] 
mtError 빨간색의 엑스 비트맵이 나타난다. [그림참조] 
mtInformation 파란색의 i 자 비트맵이 나타난다. [그림참조] 
mtConfirmation 물음표 비트맵이 나타난다. [그림참조] 
mtCustom 비트맵을 사용하지 않는다. [그림참조] 
 
   
   
  ABotton 인수는 Message 상자에 나타날 버튼의 종류를 지정하며 여러개의 버튼을 집합형으로 전달한다. 
리턴값은 사용자가 대화상자에 나타난 버튼 중 어떤 버튼을 눌렀는가를 나타내는 값이다.  
  버튼 기턴 값 
mbYes mrYes 
mbNo mrNo 
mbOK mrOK 
mbCancel mrCancel 
mbHelp  
mbAbort mrAbort 
mbRetry mrRetry 
mbIgnore mrIgnore 
mbAll mrAll 
 
  버튼 이름을 일일이 지정해 주는 것이 번거로우면 미리 정의 되어 있는 다음과 같은 집합명을 사용해도 무방하다. 
   
  mbYesNoCancel 은 Yes, No, Cancle 버튼을 한꺼번에 보여주고,
mbOkCancel 은 Ok, Cancle 버튼을 한꺼번에 보여준다.
mbAbortRetryIgnore 는 Abort, Retry, Ignore 버튼을 한꺼번에 보여준다.

이 집합명은 그 자체가 집합형이므로 [] 괄호를 쓰지 않아도 된다.  
   
  예 제 If MessageDlg(('Ok 누르면 실행합니다.'), MtInformation, mbOkCancel, 0) = mrOk Then
  label1.caption := 'Ok 를 눌렀군요...' 
else 
  label1.caption := 'Cancel 을 눌렸군요...'; 

위의 예제는 MessageDlg를 사용하는 방법에 대해 간단히 알아볼 수가 있다.
만약, ABotton인수에 현재는 mbOkCancel 을 넣었지만, 여러개의 버튼을 넣는다면,
[mbOk, mbCancel] 을 입력해도 똑같은 결과를 나타낸다.
여러개를 한꺼번에 쓸 때는 '[ ]' 안에 넣어야만 하고 집합형일 경우는 그냥 쓰면 된다는 아주 간단한 예제이다.
아래 그림은 실행한 화면의 MessageDlg 예제였다. 
  그 림  
 MessageDlgPos 
  문 법 function MessageDlgPos(Const Msg: String; AType: TMsgDlgType; AButtons: 
  TMsgDlgButtons; HelpCtx: LongInt; X, Y: Integer): Word; 
  MessageDlg 함수와 동일한 동작을 하는 함수이다. 
단 MessageDlg는 대화상자를 무조건 화면 중앙에 열어주지만 이 함수는 X, Y 인수를 사용하여 대화상자가 출력된 화면 좌표를 지정할 수 있다.  
 MkDir 
  문 법 procedure MkDir(S: String); 
  새로운 서브 디렉토리를 생성한다. 
문자열 S에 생성하고자 하는 서브 디렉토리의 경로를 준다. 
디렉토리를 생성하는 규칙은 도스에서와 동일하다. 
즉, 같은 이름의 디렉토리나 화일이 있어서는 안된다.  
   
  
 함수 레퍼런스 정리...(N)  
 Now 
  문 법 function Now: TDateTime; 
  현재 날짜와 시간을 한꺼번에 구하는 함수이다. 
날짜와 시간은 TDateTime형이므로 곧바로 문자열로 출력할 수 없으며 DateTimeToStr함수를 사용하여 문자열로 바꾸어 주어야 한다. 
Label1.Caption := DateTimeToStr(Now); 명령에 의해 Label1에 오늘 날짜와 시간이 출력된다. StrToDate 문자열을 날짜 형태로 바꾸어 TDateTime형의 변수에 저장해 준다. 
문자열에 저장된 날짜는 반드시 유효한 날짜 정보를 가지고 있어야 하며 만약 날짜가 무효할 경우 EConverError 예외를 발생시킨다. 
문자열은 년, 월, 일을 나타내는 두 개 또는 세 개의 숫자를 담고 있어야 하며 각 요소는 DataSeparator 변수가 지정하는 구분문자(보통 슬래시 기호)에 의해 구분되어 있어야 한다. 년, 월, 일의 순서는 ShortDateTime 변수에 따라 달라지며 mm/dd/yy 또는 dd/mm/yy 또는 yy/mm/dd 중 하나가 된다. 
만약 문자열에 두 개의 숫자만 있으면 이는 각각 월, 일의 정보로 인식되며 년은 올해의 년도가 된다.  
   
   
 함수 레퍼런스 정리...(O)  
 Odd 
  문 법 function Odd(X: LongInt): Boolean; 
  인수로 주어진 정수가 홀수인지를 검사하는 함수이다. 
만약, 홀수이면 True값을 리턴하며, 짝수이면 False값을 리턴한다. 
다음예는 인수로 주어진 정수값 I 가 홀수인지 짝수인지를 검사하여 레이블로 출력하는 예제로서 I에 3을 대입하면 '홀수입니다.'라는 메세지를 레이블로 출력하는 예제이다.  
  예 제 Var 
  I : Integer; 
begin 
  I := 3; 
  If Odd(I) Then 
  Label1.Caption := '홀수입니다.' 
  Else 
  Label1.Caption := '홀수가 아닙니다.'; 
end;  
 Ord 
  문 법 function Ord(X): LongInt; 
  순서형값의 순서값을 조사하는 함수로서, 다음예제는 열거형의 열거요소중 Soo가 몇번째 값인지를 조사하는 예제이다. 여기서의 순서값은 2가 출력된다.  
  예 제 Type 
  Yoil = (Wol,Hwa,Soo,Mok,Gum,TTo,Il); 
begin 
  Label1.Caption := 'Soo Member Is ' + IntToStr(Ord(Soo)); 
end;  
   
  
 함수 레퍼런스 정리...(P)  
 Pi 
  문 법 function Pi: Real; 
  원주율을 구하는 함수이다. 
원주율은 3.1415926535897932385...로 정의되어 있으며 이값은 부동 소수점 연산 보조 프로세서가 있는지 없는지에 따라 정확도가 달라질 수 있다.  
 Pos 
  문 법 function Pos(SubStr: String; S: String): Byte; 
  문자열내의 부분 문자열을 검색하는 함수이다. 
부분 문자열이 검색된 위치를 리턴해 주며, 만약 부분 문자열이 발견되지 않으면 리턴값은 0 이다. 이 함수는 문자열 검색에서 탁월한 성능을 발휘한다. 
자세한 사항은 도움말을 참고하기 바란다.  
   
  
 함수 레퍼런스 정리...(R)  
 ReadKey 
  문 법 function ReadKey(Buffer: PChar; Count: Word): Word; 
  키보드로부터 문자값을 읽는 함수이다. 
단, 이 함수는 표준 ASCII 코드만을 읽을뿐 기능키나 커서 이동키 등의 확장키 코드는 읽지 못한다.  
 Readln 
  문 법 procedure Readln([Var F; Text;] V1[V2,...,Vn]); 
  파일로부터 문장 한 줄을 읽어 변수 V1이하에 대입하며 다음 문장으로 이동하는 함수이다. Readln(F)와 같이 읽어들일 변수를 지정하지 않으면 다음 줄로 이동하기만 한다. 
파일 변수가 생략될 경우는 표준 입력 장치인 키보드로부터 문자열을 입력받아 V1이하의 변수에 대입한다. 
인수없이 Readln만 사용되면 Enter키가 입력될 때까지 대기한다. 
다음 예는 키보드로부터 문장을 입력받아 다시 레이블로 출력하는 예제이다.  
  예 제 Var 
  S : String; 
begin 
  Write('문장을 입력하세요'); 
  Readln(S); 
  Label1.Caption := S; 
end;  
 Rename 
  문 법 procedure Rename(Var F: Newname); 
  파일의 이름을 변경하는 함수이다. 
변경하고자 하는 이름을 문자열로 전달해 주면 된다. 
파일명을 변경하려면 AssignFile 함수로 파일 핸들에 외부 파일명을 할당해 주고 이 함수를 호출하면 되는데, 파일을 오픈할 필요까지는 없다.  
 ReWrite 
  문 법 procedure ReWrite(Var F; File [;Recsize: Word]); 
  파일을 쓰기 전용으로 오픈하는 함수이다. 
F는 AssignFile함수로 외부파일과 연결된 파일 핸들이며 RecSize는 F가 untyped 파일일 경우 한번에 출력할 레코드의 크기를 지정한다. 
RecSize가 생략될 경우 이 값은 128바이트로 간주된다. 
파일이 없을 경우에는 파일을 생성하고 파일이 이미 열려져 있으면 파일을 닫은 후에 다시 생성하며 파일 위치는 파일의 선두에 맞추어 진다. 
이 함수로 파일을 오픈할 후에 Writeln등의 함수로 데이터를 파일로 출력하게 된다. 
다음 예는 Test.txt라는 간단한 파일을 만든후 문자열 하나를 출력하는 예제이다. 
파일 입출력이 끝난 후에 파일 핸들은 반드시 Closefile 프로시져로 닫아 주어야 한다.  
  예 제 Var 
  F : TextFile; 
begin 
  AssignFile(F, 'Test.txt'); 
  ReWrite(F); 
  Writeln(F, '출력할 내용을 쓴다.'); 
  CloseFile(F); 
end;  
 RmDir 
  문 법 procedure RmDir(S : String); 
  서브 디렉토리를 삭제하는 함수이다. 
삭제할 디렉토리명을 문자열로 넘겨주는데, 도스의 RM 명령과 거의 동일한 규칙을 사용하며 디렉토리가 비어 있지않을 경우, 현재 디렉토리인 경우, 루트 디렉토리인 경우는 디렉토리를 삭제할 수 없다.  
 Round 
  문 법 function Round(X : Real): LongInt; 
  실수값 X 를 정수값으로 만들어주는 함수이다. 
즉, 실수의 소수부분을 버리고 정수 부분만 결과로 취한다. 
이때 소수부 첫째 자리에서 반올림이 일어나며 반올림의 결과는 부호와 상관없이 일어난다. 반올림의 결과와 LongInt형의 범위를 벗어날 경우는 실행시 에러가 발생한다. 
다음 예제는 실수 3.1415 를 반올림하여 정수로 만드는 예제로서 레이블의 출력결과는 소수부가 잘려나간 3이되며, 만약 실수의 값이 3.6415일 경우는 반올림에 의해 4가 출력된다.  
  예 제 Var 
  F : Double; 
begin 
  F := 3.1415; 
  Label1.Caption := IntToStr(Round(F)); 
end;  
 RunError 
  문 법 procedure RunError[(ErrorCode: Byte)]; 
  실행시 에러를 발생시키고 프로그램을 종료하는 함수이다. 
치명적인 에러가 발생했을 경우 이 함수를 이용한다.  
   
   





--------------------------------------------------------------------------------


 함수 레퍼런스 정리...(S)  
 Seek 
  문 법 procedure Seek(Var F; N: LongInt); 
  파일의 현재 위치(FP)를 N위치로 옮긴다. 
Untyped 파일일 경우 N의 의미는 파일 선두에서의 바이트 단위 거리이지만 Typed파일일 경우 N은 N번째 요소의 위치를 의미한다. 
예를 들어 레코드형 파일일 경우 N이 5이면 여섯 번재의 레코드의 위치로 이동한다. 첫번째 레코드의 번호가 0번이다. 
Seek(F,FileSize(F))는 파일의 끝으로 현재위치를 이동시킨다.  
 SeekEof 
  문 법 function SeekEof[(Var F: Text)]: Boolean; 
  파일의 현재위치가 끝(EOF)인지 점검한다. 
 SeekEoln 
  문 법 function SeekEoln[(Var F: Text)]: Boolean; 
  파일의 현재위치가 줄의 끝(EOL)인지 점검한다. 
 SelectDirectory 
  문 법 function SelectDirectory(Var Directory: String; Options: TSelectDirOpts; HelpCtx:
LongInt): Boolean; 
  디렉토리 선택 대화상자를 보여주고 사용자로 하여금 디렉토리를 선택하도록 한다. 
드라이브 콤보박스와 디렉토리 리스트 박스를 사용하여 디렉토리를 선택하며 파일 리스트 박스는 어떤 파일이 있는지만 보여준다. 
디렉토리를 선택하는 것뿐만 아니라 에디트박스에 디렉토리명을 입력하여 없는 디렉토리를 직접 생성할 수도 있다. 
인수로 주어지는 Directory문자열은 대화상자가 처음 열릴때 선택될 디렉토리이며 사용자가 대화상자에서 선택한 디렉토리명이 인수로 리턴된다. 
사용자가 OK버튼을 누르면 True를 리턴하고 Cancle버튼을 누르면 False를 리턴한다. 
두번째 인수 Options는 대화상자의 모양과 기능을 정의하는 옵션이며 다음과 같은 값의 집합형이다.  
  옵 션 의 미 
  [] 사용자는 존재하는 디렉토리를 선택할 수 있을 뿐이며 없는 디렉토리를 만들 수 없다. 
  sdAllowCreate 에디트 박스에 사용자가 직접 존재하지 않는 디렉토리를 입력하는 것을 허용한다. 
그러나 이 옵션을 사용한다고 해서 디렉토리를 생성해 주는 것은 아니며 사용자가 직접 Directory 인수를 참조하여 생성해 주어야 한다. 
  sdPerformCreate 이 옵션을 sdAllowCreate 옵션과 함께 사용할 경우 존재하지 않는 디렉토리가 입력되면 직접 디렉토리를 만들어 준다. 
  sdPrompt 디렉토리를 새로 만들기 전에 사용자로부터 디렉토리를 정말로 만들 것인가를 물어본다. 
  예 제 Uses 절에 FileCtrl 를 추가해야만 한다. 

Var 
  Dir: String; 
begin 
  Dir := 'C:/DELPHI'; 
  If SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
  Label1.Caption := Dir; 
end; 

디렉토리 선택 대화상자의 모습은 아래와 같다.  
  그 림  
 SizeOf 
  문 법 function SizeOf(X): Word; 
  X의 크기를 바이트 단위로 리턴하는 함수이다. X는 변수이거나 데이터 타입이다. SizeOf(Integer)는 2이며, SizeOf(Double)은 8 이다. 
주로 레코드나 오브젝트 등 크기가 큰 데이터의 크기를 계산할 때 사용한다. 가상 메소드 테이블을 가진 오브젝트의 인스턴스크기를 조사하면 VMT에 저장된 크기가 리턴된다.  
 Sqr 
  문 법 function Sqr(X: Real): Read; 
  X의 제곱값을 구하는 함수이다. Sqr(X)는 X*X와 동일한 결과를 계산해 낸다.  
 Sqrt 
  문 법 function Sqrt(X: Real): Real; 
  X의 제곱근을 구하는 함수이다. Sqrt(2)는 1.414213이다. 
이때 계산되는 제곱근은 양의 제곱근이다.  
 Str 
  문 법 procedure Str(X[: Width [: Decimals]]; Var S); 
  숫자값 X를 문자열 S로 출력하는 함수이다. 이때 출력되는 값의 폭은 Width 인수가 지정하는 폭을 사용하며 Decimals인수가 지정하는 정밀도를 사용한다. 숫자값 X는 정수형이거나 실수형 모두 가능하다. 다음예는 3.1415를 폭 5, 정밀도 3으로 문자열로 변환하는 예제이다. 이때, 레이블로 출력되는 문자열은 3.142이다.  
  예 제 Var 
  F : Double; 
  S : String; 
begin 
  F := 3.1415; 
  Str(F:5:3, S); 
  Label1.Caption := S; 
end;  
 StrCat 
  문 법 function StrCat(Dest, Source: PChar): PChar; 
  두개의 문자열을 연결하는 함수이다. 
Source문자열을 Dest문자열에 추가하며 연결된 문자열을 리턴한다. 
문자열의 길이 점검은 하지 않으므로 Dest문자열이 Source의 문자열을 충분히 수용할만한 크기를 가지도록 해야한다. 다음 예제는 두개의 문자열을 결합하는 예제로서 레이블로 출력되는 결과는 Made In Korea 이다.  
  예 제 Var 
  S1 : Arrary[0..128] of Char; 
  S2 : Arrary[0..128] of Char; 
begin 
  StrCopy(S1,'Made In '); 
  StrCopy(S2.'Korea'); 
  trCat(S1,S2); 
  Label1.Caption := StrPas(S1); 
end;  
 StrComp 
  문 법 function StrComp(Str1, Str2: PChar): Integer; 
  두개의 문자열을 비교하는 함수이다. 
S1과 S2문자열이 같으면 0을 리턴하며, S1S2이면 양수를 리턴한다. 
문자열끼리의 비교는 문자열을 이루는 각 문자의 문자코드를 비교하여 수행한다.  
 StrCopy 
  문 법 function StrCopy(Dest, Source: PChar): PChar; 
  널 종료 문자열을 복사하는 함수이다. 
Source문자열을 Dest문자열에 복사하며 Dest문자열을 리턴한다. 
이 함수는 문자열의 길이점검을 하지 않으므로 Dest문자열의 길이가 Source문자열의 길이보다 짧지 않도록 주의해야 한다. 만약 Dest문자열의 길이가 Source문자열을 충분히 수용하지 못할 경우 Dest 뒷부분의 다른 변수값이 파괴된다. 
널 종료 문자열끼리는 := 연산자에 의해 직접 대입할 수 없으므로 이 함수를 사용하여 문자열끼리 복사해 주어야 한다. 
예를 들어 Source가 'Korea'이고 이 값을 Dest문자열로 대입하고 싶다고 해서 
Dest := Source와 같은 문장을 쓸수는 없다. 
이때는 StrCopy(Dest, Source)와 같이 StrCopy함수를 사용하여야 한다.  
 ShowMessage 
  문 법 procedure ShowMessage(Const Msg: String); 
  대화상자를 열어 Msg 문자열을 보여주기만 하며 OK버튼을 누르면 대화상자를 닫는다. 
캡션에는 이 대화상자를 호출한 프로그램의 실행파일이름을 출력한다. 간단한 메세지만을 전달하고 사용자의 입력을 받아야 할 필요가 없을 때 이 함수를 자주 사용한다.  
  예 제 ShowMessage('ShowMessage 함수의 실행화면입니다.'); 
  그 림  
 ShowMessagePos 
  문 법 procedure ShowMessagePos(Const Msg: String; X, Y: Integer); 
  ShowMessage프로시져와 동일한 동작을 하는 함수이다. 
하지만 ShowMessage는 대화상자를 무조건 화면 중앙에 열어주지만 이 ShowMessagePos함수는 X, Y인수를 사용하여 대화상자를 출력될 화면좌표를 지정할 수 있다.  
 StrLower 
  문 법 function StrLower(Str: PChar): PChar; 
  주어진 문자열을 소문자로 바꾼다. 
 StrToDate 
  문 법 function StrToDate(Const S: String): TDateTime; 
  문자열을 날짜 형식으로 바꿔어주는 함수이다. 
문자열은 날짜 형식으로 되어 있어야 한다. 즉, 문자열 안에는 날짜를 이루는 세가지 요소가 순서에 맞게 배치되어 있어야 하며 각 요소는 날짜 구분 문자(/)로 분리되어 있어야 한다. 
문자열에 날짜로 변경할 수 없는 문자가 있을 경우 EConvertError 예외가 발생한다.  
 StrToDateTime 
  문 법 function StrToDateTime(Const S: String): TDateTime; 
  문자열은 날짜와 시간을 담는 TDateTime형의 변수로 바꿔어주는 함수이다. 문자열에는 MM/DD/YY HH:MM:SS 형태로 날짜와 시간이 담겨 있어야 하며 시간값은 24시간제로 표현하거나 AM, PM을 추가로 뒤에 붙여주어야 한다.  
 StrToFloat 
  문 법 function StrToFloat(Const S: String): Extended; 
  문자열을 실수값으로 변환하는 함수이다. 문자열에는 부호를 나타내는 +/- 와 숫자, 그리고 소수점만 있어야 하며 지수를 나타내는 E가 올 수 있다. 
그 외의 문자가 있을 경우는 EConvertError예외가 발생한다.  
 StrToInt 
  문 법 function StrToInt(Const S: String): LongInt; 
  문자열을 정수값으로 변환하는 함수이다. 이때 문자열에는 숫자로 바꿀 수 없는 문자가 있어서는 안되며, 만약 무효한 문자가 있을 경우 EConvertError예외를 발생시킨다. 
에디트박스에 사용자가 입력한 값을 정수형 변수에 대입하고자 할 때 에디트 박스의 Text속성과 정수형 변수의 데이터형이 일치하지 않아 대입이 불가능하다. 
문자열에 입력된 정수를 정수형 값으로 바꾸어 주어야 정수형 변수에 대입할 수 있다.  
 StrToTime 
  문 법 function StrToTime(Const S: String): TDateTime; 
  문자열을 시간 형태로 바꾸어 TDateTime형의 변수에 저장해 두는 함수이다. 문자열에는 HH:MM:SS 형태로 시, 분, 초가 담겨 있어야 하며, AM,PM은 있어도 되고 없어도 된다. 
시간은 반드시 24시간 형태로 표시해 주어야 한다. 
예를 들어 오후 8:30 은 20:30으로 표현하는데, 만약 문자열에 무효한 시간값이 들어있을 경우에는 EConvertError예외를 발생한다.  
 StrUpper 
  문 법 function StrUpper(Str: PChar): PChar; 
  주어진 문자열을 대문자로 바꿔주는 함수이다. 
   
  
 함수 레퍼런스 정리...(T)  
 Time 
  문 법 function Time: TDateTime; 
  시스템의 시계를 참조하여 현재 시간을 구하는 함수이다. 
시간은 TDateTime형이므로 곧바로 문자열로 출력할 수 없으며 TimeToStr함수를 사용하여 문자열로 바꾸어 주여야 한다. Label1.Caption := TimeToStr(Time) 명령에 의해 Label1에 현재시간이 출력된다.  
 TimeToStr 
  문 법 function TimeToStr(Time: TDateTime): String; 
  시간을 나타내는 Time을 문자열 형태로 변경하는 함수이다. 
시간값을 곧바로 레이블이나 에디트등으로 출력할 수 없기 때문에 이 함수를 사용하여 문자열로 변경해 주어야 한다.  
 Trunc 
  문 법 function Trunc(X: Real): LongInt; 
  실수의 소수점 이하를 버리고 정수부만 취하는 함수이다. Round함수는 소수점 첫째자리에서 반올림을 하지만 이 Trunc함수는 반올림없이 무조건 소수점을 버린다. 
다음 예는 3.6415를 정수부분만을 취하여 레이블에 3을 출력하는 예제이다.  
  예 제 Var 
  F : Double; 
begin 
  F := 3.6415; 
  Label1.Caption := IntToStr(Trunc(F)); 
end; 
   
  
 함수 레퍼런스 정리...(U)  
 UpCase 
  문 법 function UpCase(Ch: Char): Char; 
  문자 Ch를 대문자로 바꿔주는 함수이다. 
소문자 a 에서 대문자 Z 까지의 문자가 대문자 A ~ Z 로 변경되며 그 외 나머지 문자일 경우는 전혀 영향을 받지 않는다.  
 UpperCase 
  문 법 function UpperCase(const S: string): string; 
  문자열 내부의 소무낮를 모두 대문자로 바꾸어 주는 함수이다. 
문자 변환은 7 비트의 아스키코드내에서 이루어지며 문자 'A' ~ 'Z' 까지가 변환의 영향을 받는다. 나머지 기호나 숫자, 한글은 변환되지 않는다.  
   
  
 함수 레퍼런스 정리...(V)  
 Val 
  문 법 procedure Val(S; var V; var Code: Integer); 
  문자열 변수 S 를 숫자형 변수로 바꾸어 주는 함수이다. 
문자열 변수 S 에는 숫자가 담겨 있어야 한다. 
문자열을 바꾼 결과를 받기위한 인수 V는 정수형이거나 실수형 변수 모두 가능하다. 
S에 숫자로 바꿀 수 없는 무효 문자가 없다면 Code 값은 0 가 된다. 
널 종료 문자열의 경우 Code에 리턴되는 에러 위치는 실제문자의 위치보다 하나가 더 많은 값이 된다.  
   
  
 함수 레퍼런스 정리...(W)  
 Write 
  문 법 procedure Write([Var F: Text;] P1[,P2,...,Pn]); 
  변수값을 파일로 출력하는 함수이다. 
F 는 출력용으로 오픈된 텍스트파일이어야 하며 파일이 생략될 경우 표준 출력 장치인 화면으로 출력된다. 
파일 변수 다음의 이수 P1 이하는 파일로 실제 출력될 값들이며, 이 값에 필드 폭, 정밀도를 지정할 수 있다. 
출력할 수 있는 타입은 문자형, 정수형, 실수형, 문자열, 진위형 등이 있다. 
타입도 파일일 경우 출력되는 변수 V1 이하는 파일의 요소와 같은 형이어야 한다. 
즉, 레코드형 파일이라면 출력되는 값도 같은 형의 레코드이여야 한다. 파일의 현재 위치가 파일의 끝이라면 파일의 크기는 출력된 데이터의 길이만큼 늘어난다.  
 Writeln 
  문 법 procedure Writeln([Var F: Text;] P1[,P2,...,Pn]); 
  write 함수의 기능을 확장한 함수이다. 
Write 를 호출하여 변수를 파일로 출력하되 변수 값 다음에 EOL (End Of Line)을 출력하여 자동으로 개행되도록 한다.