델파이의 findcomponent를 활용하여보자

안녕하세요 메르세데스입니다. 델파이의 findcomponent를 활용하여 소스코딩하는 것을 알아보도록 하겠습니다.

말 그대로 컴포넌트를 찾는 함수라고 생각하시면되겠습니다. 각종 요소들이 컴포넌트로 되어있고 이런 컴포넌트를 찾는 함수를 활용한다면.. 반복 적인 패턴의 코딩을 획기적으로 줄일 수 있는 효율적인 함수라고 생각이 듭니다.




사실 프로그램을 하면서.. 해당하는 폼이나.. 오브젝트의 이름이 규칙적으로 증가하거나 감소한다 던 가  규칙성을 갖고 있다면..
해당 소스를 복사해서 붙여 넣는 작업을 반복 적으로 하여 프로그램 하는 경우가 많은데요.. ( 대부분은 귀찮아서 그렇죠..)

이름에 대한 규칙을 정의해서 처리할 수 있다면.. 반복문 안에 다가 마치 오브젝트 이름을 변수처럼 처리할 수 있는 방법이 가능해집니다.


procedure TForm1.TestBtn1Click(Sender: TObject);
var
 i: Integer;
const
 NamePrefix = 'MyEdit';   // myedit라는 상수를 할당
begin
 for i := 1 to 20 do begin
   TEdit.Create(Self).Name := NamePrefix + IntToStr(i);     //이름뒤에 1 , 2, 3 ,4 이런식으로 해서 TEdit컴포넌트를 생성하죠..
   with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
   begin
     Left := 10;                 //생성하면서 위치를 조정..
     Top := i * 20;
     Parent := self;   
   end;
 end;
end;


눈으로 보기에 쉽게 안 들어오실 수 있지만.. 이게 가능하지 않다면.. 폼에 에디트를 20개 찍어서 넣거나.. 아니면
create문을 20개를 반복해서 구현해야 하니.. 상당히 소스가 길어지겠죠.. 하지만 위에처럼 한다면.. 루프문안에 집어넣어 처리가 가능해지니.. 규칙만 좀 안다면.. 쉽게 코딩이 가능해지겠습니다.
TEdit(FindComponent('찾으려는이름') ) <--- 이런 식으로 컴포넌트 이름을 찾아가면 됩니다.
아래는 제가 한번 이것을 이용해서 만들어 본 것입니다.




var
 i : integer;
MyCmnt : TComponent;        // 모든 컴포넌트는 TComponent로 부터 만들어집니다.
s_TEST : TStringList;
begin
       ....... (중략)....


        s_TEST := TStringList.Create;
       s_TEST.Text := v_a_DRAIN_CTHTH_TBL[0];


        with s_TEST do
       begin
          for i:= 1 to 200 do
          begin
              MyCmnt := FindComponent('QR00'+inttostr(i));      //QR00 으로 시작하는것들을 찾아서.. 뒤에 1..2..3.. 숫자를 붙이는 패턴을 찾는다
              TQRLabel(MyCmnt ).Caption := Strings[i];            //찾아진 패턴의 컴포넌트의 Caption에 위에서 받은 리스트의 값을 입력한다.
          end;  
       end;


        .....(중략) ....


end;


뭐 10~20개야.. 그냥 복사해서 붙여 넣는 것으로 가능하다고 치겠습니다.  

하지만 200개 1000개 혹은 그 이상이 되는  되는 것을 한다고 하면..   복사해서 붙여 넣는 것이 사실 크게 어려운 일은 아니긴 합니다 만..

소스가 기하급수적으로 늘어나기 때문에 스크롤을 많이 해야 하니 눈에도 잘 안 들어 오고 복잡해 지겠죠.. 전 소스가 긴게 너무 싫습니다..


다들 잘 알고 계시는데 저만 이렇게 모르고 있었던 게 아닌가 하는 생각이 드네요 ㅜㅜ

이상으로 델파이의  findcomponent를 활용하는 방법에 대해서 알아봤습니다. 감사합니다.















Parallels를 설치후 윈도우의 각종 드라이버는 어떻게 설치하나요?

이번시간에 알아 볼 것은 Mac에  Parallels를 설치하여 WIN7을 설치하였는데 각종 드라이버들은 어떻게 설치하는지 알아보는 것 입니다.

일단 부트캠프는 예전부터 사용을 해봐서.. 그럭저럭 잘 알겠는데.. 개발자다보니 크로스플랫폼으로 작업하는 일이 종종있는데 그런문제에는 전혀 도움이 안되어서 매킨토시에 설치할 수 있는 가상머신프로그램을 알아보는 도중 알게 되었습니다

처음설치하는 것이라서 설정하는 부분이라던가 잘 알지 못하고 넘어가는 부분을 해결하는데 시간이 많이 소요되었습니다.

저와 비슷한 상황을 혹시 겪으시는 분들이 계실지 몰라 정리를 한번 해보겠습니다.

일단 부트캠프와 페러럴즈에 대해 간략하게 설명하고 넘어가야겠네요..

부트캠프는.. 파티션을 분할하여 OS를 설치하는 방법입니다. 부팅할때 부팅초기화면에서 운영체제를 선택하여 구동되는 방식이어서..
속도는 빠릅니다. 그냥 노트북에 윈도우를 깔았으니말이죠.. 

하지만 불편한점이 있습니다. 동시에 운영체제를 같이 사용할 수 없다는거죠..  그럴경우 다시 껏다켜야합니다. 불편하겠죠.. 

맥을 사용하시는분들중 많은분들은 OS를 겸용으로 사용하시는 분들이 계시기 때문이죠.. 우리나라에선.. 순수OSX용으로 사용하시는 분들은 많지 않으실 것이라 생각합니다.

페러럴즈를 이야기해보겠습니다. 이것은 일종의 가상머신프로그램입니다. WINDOW에서는 잘 알려진 VMWARE나  오라클버츄얼박스와 같은 것입니다.  운영체제 위에서 다시 다른 OS를 띄우는방식으로.. 장점은 동시에 다른운영체제를 사용할 수 있다는것입니다. 
윈도우에서 작업한 C#파일을 OSX에서 가져다가 바로 확인할 수 있죠.. 크로스플랫폼을 넘나드는 작업을 하는데 적합합니다.
하지만 속도가 많이 느린것이 단점입니다.   키보드 키 순서도 좀 햇갈리실수 있고.. 맥과 윈도의 마우스 스롤도 다르고.. 설정에서 변경하시면되긴하는데..   아무튼 이렇습니다.

설치하였더니 문제가 몇 가지 보이네요..

드라이버가 설치가 되지 않습니다!

mac_parallels_desktop


왜 그런문제가생기는지 이것저것 찾아보는도중.. 알아본 결과 결론은.. Parallels Tools라는 것을 설치해야한다는것입니다.

그래서 열심히 찾아봤지만 그게 어디에있는지 나오지않습니다. 그래서 좀 더 확인을해보니.. 설치된 경로 아래에 있다는군요;;
등잔밑이 어둡다고하죠.. 

맥에서는 경로이동이 익숙치가 않아서.. 설치되어있는경로 아래에 어디에 있는지 찾는데도 시간이많이 걸렸습니다;;

[응용프로그램]->[Parallels Desktop]-> 마우스 오른쪽클릭->[패키지 내용 보기] 를 눌러서 들어가보세요..


mac_parallels_desktop

그러면.. prl-tools-win.iso 파일이 보입니다..

이것을 마운트시키고..  

Parallels Desktop 프로그램을 열고..   Tools 설치를 눌러서 진행하시면 됩니다.
아래에 재설치라고 뜬것은.. 제가 한번 설치를 해서 그렇습니다.

mac_parallels_desktop

그리고 시간이 좀 지나고 나서 기다리면 가상머신속의 OS에 CD/DVD드라이브가 자동실행되면서 인스톨파일을 설치하라고하면서 진행이됩니다.   이 이후로는 윈도우 설치프로그램설치하듯이 진행하시면 되겠습니다,

그렇게되니.. 장치관리자에서 보이듯이 모든 드라이버가 다 설치가되었네요.. 정말 속시원하네요.. 하나 둘 빠져있으면 찜찜하잖아요..

mac_parallels_desktop

역시 그런 것 같습니다. 뭔가 해볼려고 이것저것 찾고 시간을 들여서 노력을 하니 결과가.. 나오는것 같습니다.

설치야 그렇다 치지만 페러럴즈프로그램을 열어서 설정에대한 부분을 좀 더 살펴보겠습니다.

가상머신은.. 현재 사용중인 컴퓨터에서의  CPU나 메모리 하드디스크등의 리소스를 할당하는 메뉴가 있거든요..


mac_parallels_desktop


[가상컴퓨터]->[구성] 으로 해서 들어오시면.. 메모리 CPU 하드디스크의 할당이 가능하며..  기타 네트워크나 사운드 USB등의 설정도 가능하니 가상머신안에서의 윈도우가 너무느리거나..   아니면.. OSX가 너무 느리다면 이곳의 설정을 변경해주시면되겠습니다.

하지만..그래도 많이 느리네요.. 역시나.. 하드디스크가 느려서 그런거같습니다.  제가 구형맥북이라..   일반하드디스크 이거든요..

이상으로 Parallels를 설치후 각종 드라이버설치하는 방법에 대해 알아봤습니다. 감사합니다.










C# LINQ를 알아보겠습니다.. sql쿼리네요..

안녕하세요 메르세데스입니다. C#의 진도가 팍팍 나가고있네요 .. 이번에 알아볼 것은  LINQ입니다. (Language INtegrated Query)라고해서.. 컬렉션을 편리하게 다루기위해서 만든 Query언어네요..

그동안엔 새로운 문법에 너무 익숙치 않아서 좀 힘들었는데.. 물론 지금 하려고하는것도 마찬가지지만요..  그동안 오라클(oracle)를 수년 사용해온 터라 조금 반갑기는 합니다.

델파이 이야기를 안 할 수가 없는데요.. DATA를 처리하는데 있어서 델파이나 다른 언어도 쉽지는 않을겁니다. sql를 이용해서 원하는 결과를 가져오는거 만한게 없는 것 같습니다.  2중 3중 루프를 돌려서 조건을 헤아려 이것저것 해보려고 해도 잘 안되죠.. ㅜㅜ  그런류의 요청들이 즐비하여서 제가 개발자로 일하고서 부쩍 늙었습니다 ㅜㅜ

더욱이 익숙하지 않은 C#에서.. db를 이용하지 않고 그에 준하는 요청사항을 처리해야할 때 어떻게 해야하나.. 좀 난감하긴 했는데 마침 살펴보니.. LINQ라는 게 있었네요.. 

지난시간에 공부했었던 것들중 컬렉션부분을 했었는데요.. 리스트들이죠.. 스택.. 큐...배열..  이런곳에서.. 원하는 조건의 결과값을 빼 내야할경우 DB에서 sql문으로 질의하는 수준의 문법을 제공해주네요..^^

저도 뭐 그닥 쿼리를 잘 짜지는 못하는데.. 아무튼 반갑습니다.

근데 차이가 있다면.. 문법의 순서인데요.. 특이하게도 select절이 맨 아래에 가있네요..

sql를 잘 모르는 상태에서 입문하려고 할때 조금 어려우실 수 도 있을거라 생각이들지만 배워둔다면 큰 도움이 될거라 생각합니다.


C#LINQ_ex

var result 로.. 변수를 선언했는데.. 모든 타입을 받아내려고 이렇게 한거죠.. 
from(어디있는 데이터를?) ... where(어떻게? 조건..) ...orderby(정렬순서) select(추출하는 항목) 순으로 합니다.  

예제를 한번 돌려보겠습니다.


C#LINQ_ex2


배열을 선언해서.. 값들을 집어넣었고요..   
number라는 배열안에서..  짝수인것들을 조회하는데.. 큰수부터 내림차순으로 정렬해서 결과를 가져오라는 조건입니다. 어떤가요? 
뭐.. 이정도 수준의 프로그램이면 구지 LINQ를 사용하지 않더라도 구하는데 어려움이 없을것입니다 근데 조건이 좀 더 복잡해지면 머리가 아플지도 모르겠습니다.  가령.. 평균값을 구하라던가.. 다른 배열과 조인해서 중복되는 값을 가져오라던가.. ㅜㅜ 

우선 이정도로 마치고.. 좀 더 자세히 알아보도록 하겠습니다. 감사합니다.









C# Lambda Action델리게이트를 알아보자!

안녕하세요? 메르세데스입니다. 이번시간은 지난시간에 이어 C#의 람다식을 이어가도록 하겠습니다. Func 델리게이트까지 알아봤는데요

간단히 정리하자면.. 무명메소드를 만들기 위해서 번거롭게 delegate선언을 해야하는 부분까지 생략할 수 있다는 것을 알아봤습니다.

또한.. Lambda식으로 표현을 하면 그동안 배워왔었던 모든 델리게이트를 적용할 수 있다라는것도 알아봤죠? 기억나시죠??

거기다 보너스로 소스가 더욱 더 간결해진다라는것도요..    

선언부분을 생략할 수 있는 이유는 .NET프레임워크에서 Func, Action이라는 delegate를 미리 선언해 놨기때문입니다. 다만 여기에 형식만 맞춰서 사용만 하면되는거죠.. 밥상은 세팅되어있으니 떠먹기만 하면되는거죠? 

그것도.. 여러가지 케이스가 있을 수 있으니.. 친절하게도 매개변수가 없는것부터 16개까지 넣을수 있도록 다양하게 준비가되어있으며.. 일반화가 가능하여서 형식에 구애받지 않고 다양한 형태로 적용이 가능하다는것도...말이죠..

Action 델리게이트는  반환이 없는 형태입니다 Func와는 반대죠?

알아보겠습니다.

Action act1 = ( ) => Consol.WrileLine("Test Action");    <-- 여기서 유의할 점은.. 바로 살행이 되지 않고.. 아래문장을 해야 실행이됨.
Act1();

매개변수가 1개인 것을 예로 들어보겠습니다.

int rsl = 0;
Action<int> act1 = (x) => rsl = x * 2;   <--반환형식이 없기때문에 rsl(변수)를 선언해서 값을 받는 식으로 처리를 했죠..
act1();                                             <-- 위에 구문으로는 값이 할당되는게 아닙니다. act1();이렇게 해야 실행이됩니다.
Consol.WriteLine(rsl);


정말 간결합니다.  값이 리턴되는게 아니기때문에 값을 받는 부분처리때문에  소스가 좀 길어지긴 했는데요..  이런형태의 무명메소드도 분명 쓸모가 있을것같네요...

예제를 한번 돌려보겠습니다.



꼭.. action1 action2 ..등의 이름이 아니어도 됩니다 형식만 맞춰주시면됩니다.

개발자에게..정말 편리하고 강력한 기술이 아닐 수 없습니다. ^^

이상으로 C#의 람다식을 이용한 Action델리게이트를 사용하는 방법에 대해 알아봤습니다. 감사합니다.





C# 람다식 ( Lambda Expression)을 알아보겠습니다.

안녕하세요 메르세데스입니다. 지겨운 델리게이트에서 벗어났습니다 이번에 알아볼 것은 람다식 입니다. 저에겐 처음 들어보는 단어인데요.. 기원은  수학식에서.. 나온 말이네요.. 분명하고 간결한 방법으로 함수를 표현하고 싶은 것에서 기원이 되었다고 합니다.

좀 더.. 인간 언어에 가까운 프로그래밍표현이라고 해야겠네요..   

이것은 익명메소드를 대체하기 위해서 만들어진 또 다른 기능입니다. delegate에서도 이런 이름 없는 method를 처리하는 방법이 있었는데요 이것을 좀 더 간결하게 표현할 수 있는 방법을 제공합니다.

이것에 익숙해지면 기존의 방법을 안 쓰고 람다식으로 모두 표현할 수 있다고 합니다... 그렇다면 왜 지겹고 힘들게 델리게이트를 배웠던 것일까요? ㅜㅠ  

이유가 있었네요..Lambda식의 경우 C#의 3.0부터 도입이 되었는데요 그 이전에 만들어진 것과 호환이 안되면 안되니.. 있는 거라고 합니다. 헐!

그쵸.. 개발툴 버전이 올라가면.. 이전 소스에서 컨버전 안되는 것이 많이 발생한다면 정말 큰 문제가 되거든요..  이런 문제는 비단 C#만의 문제는 아닐 것 입니다. 

그렇다면 델리게이트의 익명메소드를 전부다 해결할 수 있다는 람다식의 표현 방법이 대체 어떤 것인지 알아보도록 하겠습니다.



C#익명메소드델리게이트

이러한.. 구문이 있다고 하죠..   제 나름대로.. 이것도 정말 간결한 방법이라고 생각하는데요.. 익명 메소드를 선언 한거죠?

이걸 람다식 표현으로 나타낸다면 이렇게 됩니다!

Calc cl = (a, b) => a + b;

또한 if , else if 등의 조건식도 표현이 가능합니다.

(매개변수) => {   문장1;
                        문장2;
                        ...       };

저는 C#을 줄곧 사용해본 적이 없기 때문에 정확히는 잘 모르겠지만..  소스가 간결해져서 보기 좋습니다.
 => 이런 연산자가 중간에 있어 이상하긴 하지만.. 나름대로 괜찮아 보입니다.   이것 역시 마찬가지로.. 사용하기 위해서는
delegate를 선언해 줘야 하긴 합니다 만..    정말 간결 그 자체네요..  


한발 더 나가서.. 선언해주는  람다식을 이용하기 위해서 선언한 델리게이트 조차도 생략할 수 있습니다.  일반화를 이용해서 프레임워크 단에서... 이런 귀찮음을 해결해줬네요.. 

예제를 볼까요??

C# Lambda Example


위의 예제를 보면.. 특별히 delegate를 선언하지 않았지만.. Func<int> ... 이런 식으로 사용할 수 있습니다. 미리 만들어 놨다는 거죠.. 익명이기 때문에..  그냥 형식만 갖춰서 사용하면 된다 이겁니다. 정말 간편하겠네요..


매개변수가 없는 것부터.. 16개까지 있는 것을 사용할 수 있습니다.  

또한.. Func, Action (delegate) 두 가지 종류가 있는데요..  차례대로.. 결과를 반환하는 것과 반환하지 않는 것! 으로 분류됩니다. 

정말 필요한 것을 편하게.. 그리고 귀찮음을 덜하게.. 머리를 잘 썼네요 칭찬하고 싶습니다 진심으로요..! 일반화하여서 사용하면 형 식에 얽메이지 않고 사용이 가능하겠습니다. 맞춰주기만 하면 됩니다.  기존에 배웠던 것을 잊어도 되겠네요 ..

이상으로 C#의 람다식에 대해 알아봤습니다. 감사합니다.








C# event (이벤트) 를 알아보겠습니다.

안녕하세요 메르세데스입니다. 이번 시간에는 C#의 이벤트를 사용하는 방법을 알아보겠습니다.

제가 델파이 프로그램을 수년 간 사용해와서 이벤트라는 것이 익숙합니다. 비슷할 거라고 생각이 드는데요..

비쥬얼 프로그램에서는 필수적인 요소가 아닐 수 없거든요..  프로그램이 실행이 되었는데 어떤 버튼을 눌렀을 때.. 어떤 기능이 실행이 된다던가.. 함수가 돌아가서 결과를 해당 폼에 출력을 한다 던가.. 이런 프로그램에 익숙해져있었습니다.

버튼을 눌렀을 때 클릭 안에 특정 기능/함수를 만들어 넣으면 그만 이거든요.. 자동으로 그것과 관련된  procedure등이 만들어지기 때문에 개발자들은 크게 신경을 안 써도 됐습니다.

하지만 C#에서는 비슷한 일을 해야 하는 것을 만들 때 개발자가 필요한 것들을 일일이 생각해서 추가 시켜야 하는 것이 번거롭습니다.

그런 것 때문에 제가 느끼기에는 C#서 이 기능을 사용하기는 결코 만만한 게 아닌 것 같습니다.

전 시간부터 해왔었던 델리게이트를 조금 변형해서 이벤트로 만들어 사용하는 것이지요.. 그렇다 보니.. 이것과 델리게이트를 구분 지어 표시 해야 하는 방법이 추가되어 제가 봤을 땐 조금 번거로워 보입니다.

이것을 만드는 절차를 정리했습니다.


c#이벤트핸들러

델리게이트를 이용해서 event한정자로 선언 하는 것과.. 이벤트 핸들러 라는 것을 델리게이트 형식으로 선언해야 하는 게 들어가서 복잡하게 느껴집니다.  ㅜㅜㅜㅜ

예제를 돌려서 살펴봐야겠습니다.


C# event example


사용하는 순서에 의거해서..     public event EventHandeler So....  <-- 이벤트 라는 한정자로 델리게이트의 인스턴스를 선언했죠..

main class/메소드 부분에서  stati public void MyHandler(string message )   <-- 여기를 살펴보면 delegate형식과 일치하는 Method를 event핸들러로 만들었습니다..

뒤에 숫자가 3..6..9 로 끝나는 값이 있을 때마다 실행이 되네요....     

그런데 왜 이런 이벤트를 번거로운 절차에 의해서 사용해야 할까요?  델리게이트와 비슷하잖아요..?!

이 둘은 차이점이 있습니다. 외부에서 접근할 수 있다? 없다! 의 차이가 이 둘의 가장 큰 차이라고 합니다.


C#델리게이트이벤트차이

한정자가 public으로 되어있다 하더라도 외부에서 호출이 불가능합니다.   보안성이 중요시 되는 부분에 이것을 사용해야 한다고 할 때..  필요하다는 것이지요.. (그냥 delegate를 private으로 하면 안 될까요? )

아래는 연습문제입니다. 모범정답은 안나와있죠^^ 

결과가 "축하합니다! 30번째 고객 이벤트에 당첨되셨습니다." 가 찍히게 하면 됩니다.



C# event example2

그런데 살펴보면.. 

market.CustomerEvent += new Mydelegate(/*이벤트 처리기를 구현하세요.*/);

이렇게 나와있는데요..  문제에 오류가 있네요..   여기에만 구현을 하면 안됩니다.  왜냐하면 이벤트 핸들러를 만들어야 하잖아요? 4번째 항목이 빠져있습니다.   그래서.. 

메인메소드 밖에  static public void MyHandler(int a) { ... } 이것을 추가해서 구현했습니다. ^^; 잘됩니다.. 역시 예제를 좀 풀어봐야 이해가 되네요.머리가 녹슬어서  ㅜㅜ

이상으로 C#의 event사용하는 방법을 알아봤습니다. 감사합니다.