Q&A

  • 코딩 질문이요~
제가 mssql과 델파이를 연결시켜서 mssql에 있는 db를 조회하고 검색해야 하는데요...

버튼을 클릭시 edit에 mssql db-테이블-필드-내용이 떠야 하는데요...

그럼.. 꼭 조회를 할 필요는 없는건가요??

  Query1.Close;
  Query1.SQL.Text:='select * from @tablename'+
                 'where Attribute = @Attribute';
  Query1.SQL.Text:=StringReplace(Query1.SQL.Text,'@tablename', 'data', []);
  Query1.SQL.Text:=StringReplace(Query1.SQL.Text,'@Attribute', 'CRS', []);
  Query1.Open;

바로 그냥 아래와 같은 코딩을 하면 되는건지.......


if Not(Query1.Eof) then
begin
   Edit1.Text := Query1.FieldByName('Attribute').AsString;
end

이렇게 코딩을 했을 때 engine_name 필드에 해당하는 값이 하나가 아닐경우에는 어떻게 되나요??

예) engine_name
      DL01
      DL02
      DL03
        
또, Database Edit를 쓴다면 Table의 Field를 바로 연결하면 되지만 Edit를 주로 많이 사용하니
대부분 이런식으로 Coding을 만들어 가신다고 하셨는데..
Database Edit가 어떤 것인지??

else
Showmessage('값이 없습니다.');
end;

제가 위와 같이 코딩을 했습니다.. 실행을 해보니... 버튼을 눌렀을때 값이 없습니다는 메세지 창만 뜹니다..

Database 컴포넌트에서 말씀해주신데로 해봤습니다..
제가 전에 BDE 설정에서 MSSQL에 대한 ODBC 설정을 localserver로 성공을 했습니다..
그래서 말씀해주신데로 Database 컴포넌트 더블 클릭후 중간의 Alias 항목에서 localserver를 선택한 후
Dafault 버튼을 눌렀습니다.. databasename은 일단 빼고 유저명 및 Password를 설정했습니다..
그리고 Object Inspepector에서 Database Name을
여기서! 궁금한 게 있습니다~
Database Name을 아무렇게나 제가 정하고 싶은 데로 정하는지... 아니면 정말로 실제 사용할 디비명을
입력해야 하는지 모르겠습니다...
입력 한 후, Query와 연결을 했습니다... Databasename 설정한 것으로 연결을 하는 거지요???

그러면 위와 같은 코딩을 실행하는데 필요한 컴포넌트가 database, query이 두가지만 필요한 건가요?
databasesource 컴포넌트는 필요가 없는건지......

부탁드리겠습니다...
8  COMMENTS
  • Profile
    꼬미사랑 2005.09.01 20:56
    안녕하세요. 꼬미사랑입니다..
    edit박스로 구현하기에는 여러개의 데이터가 있는 경우에는 힘들져..크크 구현하기가...
    그리드를 사용해보세요..기본적인 스트링그리드로서 구현해보세요..
    다른분들은 어떻게 코딩하실지는 모르겠지만. 저는 Database, Query 콤포만 사용합니다.
    만약에 프로젝트를 진행하고 계시는 중이라면 DB 그리드를 쓰는것은 비추이고요.
    걍 그리드를 많이 사용하져..

    마지막으로 코딩에는 이상이 없는것 같은데 실제로 쿼리로 구현시에는 있다고 나오는지.. 프로그램상이 아니라
    쿼리를 날렸을때 데이타가 있는지부터 확인을 하시는게 나을듯 합니다.

    BDE상에서 ODBC설정이라는것은 이해가 안되는부분이 있네요.
    MS-SQL을 사용하고 계신다고 했는데, Ms-sql 클라이언트를 인스톨하시고 BDE에서 바로 MS_SQL로 접속이 가능한데 ODBC를 사용하신 이유는..흐흐..
    저의 짧은 생각이었습니다..
    그럼 즐프 하시고... 존 하루 되세요..

  • Profile
    모영철 2005.09.01 20:29
    휴..

    맨 아래 디비연결 하는 내용은 잘모르겠어요...ㅠ.ㅠ

    윗부분만 설명을 드리면

    구조가 이렇습니다.

    Database - Query -DataSource - DBControls

    저런식으로 연결이 되는데요.

    저기서 실제로 데이타는 Query에 들어있습니다.

    클래스를 보면 TDataSet 일겁니다.아마도...

    TQuery는 쿼리를 이용해서 값을 가지고 오구요 이 값은 실제 테이블처럼 표의 형태를 가집니다.

    그게 DataSet이죠.. 데이타 묶음? 그럼 값은 어떻게 접근하는가

    데이타셋에는 커서가 있습니다. 그래서 그커서가 어느 행에 위치해 있는지 에 따라 당연히

    FieldByName을 하면 값이 달라지겠죠..

    그래서 커서를 Query.Next Query.Prior??
    Query.First, Query.Last??

    이렇게 코딩으로 커서를 옮길수가 있습니다.

    그런데 이렇게 다 코딩으로 작업을 하자면 여간 불편한게 아니겠죠.. 그래서

    DB Control들이 있는겁니다. 중간에 DataSource로 (Query와) 연결이 되구요..

    그래서 디비그리드(이것도 DBControl)를 하나 연결해놓으면 무지 편하죠 마우스로 클릭만 하면

    원하는 곳으로 커서가 움직이니깐요..그리고 설정에 따라 곧바로 추가, 수정, 삭제도 가능하구요..

    한마디로 말하자면 DBControl은 DataSet을 보기도하고 데이타를 조작하기위한 도구이구요..

    <!--CodeS-->

    if Not(Query1.Eof) then
    begin
       Edit1.Text := Query1.FieldByName('Attribute').AsString;
    end

    //이렇게 코딩을 했을 때 engine_name 필드에 해당하는 값이 하나가 아닐경우에는 어떻게 되나요??

    <!--CodeE-->

    이경우에 커서를 모르셔서 헷갈리셨던거 같습니다.

    Edit1.Text := Query1.FieldByName('Attribute').AsString;

    이렇게 하면 많은 레코드중에 커서가 있는 위치의 레코드에 Attribute의 필드의 값을 가지고 옵니다.

    else
    Showmessage('값이 없습니다.');
    end;

    이부분은 왜 그런지 모르겠지만. 정말로 레코드가 하나도 없을수도 있습니다.

    DBGrid를 연결하거나 Query1.Empty 이프로퍼티를 디버깅해보시기 바랍니다.

    그리고 디비 프로그래밍에 도움이 될만 한 자료가 델파이 자료실에 있습니다.

    제목이 잘 기억이 안나는데 아마 DB나 초보자 이런걸로 검색해보시면 있을겁니다.

    그 소스를 한번 보시면 이해 하시는데 도움이 되시리라 생각됩니다.

    지금 다시 봤더니 아래의 이름으로 있네요.

    DELPHI 진짜초보에게 필요한 데이타베이스 코딩 예제(델6 용)


  • Profile
    윤경미 2005.09.01 22:13
    답변 감사드립니다...

    제가 너무 초보라 많이 답답하실듯..ㅠㅠ

    <!--CodeS-->

    if Not(Query1.Eof) then
    begin
       Edit1.Text := Query1.FieldByName('Attribute').AsString;
    end

    //이렇게 코딩을 했을 때 engine_name 필드에 해당하는 값이 하나가 아닐경우에는 어떻게 되나요??

    <!--CodeE-->

    이게 정말 궁금합니다..

    이경우에 커서를 모르셔서 헷갈리셨던거 같습니다.
    Edit1.Text := Query1.FieldByName('Attribute').AsString;
    이렇게 하면 많은 레코드중에 커서가 있는 위치의 레코드에 Attribute의 필드의 값을 가지고 옵니다.

    라고 하셨는데 질문 문장과 똑같은데요?^^:

    꼬미사랑님 말씀처럼 edit박스로 구현하기에는 여러개의 데이터가 있는 경우는 되지 않는건가요??
    훔...

    그리고 또하나 제가 궁금한게 있습니다...

    버튼을 클릭시
    db에서 가져온 값이  빈값이 아닐 때(문자열)
    edit박스에 db에서 가져온 값을 나타내는 코딩과.....(당연히 빈값이 아닐 듯;;)

    가져 온 값이 0이 아닐때(숫자)
    edit박스에 구현하는 코딩 방법을 알고 싶습니다.....

    if db에서 가져온값 <> '' then
        Edit1.Text := '바보'
        else Edit1.Text := '천재'

    이렇게 하면 되나요??
    db에서 가져온값 을 어떻게 표현해야 할지........

  • Profile
    모영철 2005.09.01 23:48
    예제를 만들었습니다..

    저도 님보다 더할
  • Profile
    윤경미 2005.09.02 00:48
    말씀해 주신 데로 마우스 커서를 그리드에 클릭하면

    edit가 바뀌네요~~ 신기하여라~~

    예제까지 보여주시고 정말 정말 감사합니다.....

    많은 도움이 됐어요^^

    근데 제가 해야 하는 것이..... 그리드 없이 해야합니다..

    필드 안에 여러 데이터가 있을 때 edit 박스로 구현해야 하는데....

    예)  이름
    -----------
    홍길동
    홍순이
    삼순이

    이렇게 잇을 때

       --------------------
      ㅣEdit1             ㅣ            여기에 홍순이를 들어가게 하고 싶습니다....  
       --------------------

    query1의 sql문을
    select *
    from 테이블  
    where 이름 = 홍순이   이렇게 설정 해놓고....

    버튼 클릭시 코딩을 어떻게 해야하는지......

    Edit1.Text :=Query1.FieldByName('이름').AsString;   이렇게 했떠니 반응이 없던데..ㅠㅠ

    언급해주신 Locate 함수는 어떻게 사용해야 하는지.......

    if Table1.Locate(Table1.indexFieldNames,Edit1.text,[loPartialKey]) then
      Showmessage('레코드를 찾았습니다.')
    else showmessage('찾는 레코드가 없습니다.');

    이런 예제를 찾았는데요... 도통 무슨 뜻인지;;;;ㅋㅋ



    그리고 또하나!!

    버튼을 클릭시
    db에서 가져온 값이  빈값이 아닐 때(문자열)
    edit박스에 db에서 가져온 값을 나타내는 코딩과.....(당연히 빈값이 아닐 듯;;)

    가져 온 값이 0이 아닐때(숫자)
    edit박스에 구현하는 코딩 방법을 알고 싶습니다.....

    if db에서 가져온값 <> '' then
        Edit1.Text := '바보'
        else Edit1.Text := '천재'

    이렇게 하면 되나요??
    db에서 가져온값 을 어떻게 표현해야 할지........


    부탁 드리겠습니다.....

    이 두가지 때문에 속상해죽겠어요~ㅠ 초보라...에휴...
  • Profile
    박홍재 2005.09.02 11:28
    모영철 님께서 잘 설명을 해 주셨는데 아직 초보시라 이해하기 힘드신듯....
    여러게의 값이 있는 Table의 값중 특정한 값을 넣고 싶다...음..

    일단 DBGrid를 화면에 배치하시고 사용하시는 것이 좋을 듯 싶네요.
    여러 값중 사용자가 보면서 선택을 할 수 있도록 한다면  더욱 연결이 쉽겠지요.

    DB Grid에 대해서 한번 찾아서 예제를 보세요.

    자 위의 코딩에서 버튼을 클릭시 홍순이에 해당하는 값을 Edit1에 넣고 싶으면 일단 Buttonclcik 이벤트에
    다음과 같은 쿼리를 써서 코딩을 해 주시면 되겠지요.
      
    QUERY1.SQL.ADD('select *from 테이블');  
    QUERY1.SQL.ADD('where 이름 = 홍순이');

    QUERY1.Open;

    if Not(Query1.EOF) then
      Edit1.Text := Query1.FieldByName('이름').AsString
    else Edit1.Text := '바보';

    이와 같이 하면 일단 쿼리를 해서 테이블에 홍순이라는 이름이 있으면
    쿼리의 값이 나오겠지요.

    그런데 여기서 쿼리에 대해 이해 하셔야 할 것이 Query를 Open 하게 되면 일단 돌파리는 쿼리를 SQL 서버쪽에 던져서 값이 나오는 것을 가져오는데요. 이때 값들이 있다면 현재 값들중 초기 값을 가리키구 있을 거구요. 만약 값이 없다면 EOF=True를 보내 줄 겁니다. 그래서 쿼리를 열고 EOF를 조사하는 거구요.
    만약 여러행의 값이 나온다면 당연히  Edit1.Text := Query1.FieldByName('이름').AsString 은 처음 값만을 보여 줄 거고 다음 행을 보구 싶을 때는 Query1.Next를 써서 다음 행으로 넘어가야 겠지요.

    그래서 여러개의 행의 값을 가져올 때는 다음과 같이 하기도 합니다.
    이럴때는 Edit 보다는 Combo 나 Memo를 쓰는 것이 좋겠지요.
    일단 Memo로 가정을 하구요.

    값은 님이 보여주신대로


    이런 값이 있는 Table이 있다면 그 값을 차례로 보여주기 위한 코딩은 다음과 같이 됩니다.

      ButtonClick

      Memo.Line.Clear;

      QUERY1.SQL.ADD('select *from 테이블');  
      
       QUERY1.Open;

      While Not(Query1.Eof) do
      begin
        Memo.Line.Add(Query1.FieldByName('이름').AsString);

       Query1.NExt;
      end;

    여기서 While은 조건절이 참이면 루프를 반복하구 거짓이면 빠져나가는 거니까 일단 Table을 쿼리한 값이
    있다면 루프를 계속 돌다가 없으면 빠져나가는 것이 되겠지요.

    아무튼 여러게의 행을 보여준다는건 여러 방법(DBGRID 나 Combo 등등) 있구요 . 이는 님께서 프로그램 하실때 편하신 것으로 속도 생각하셔서 하시면 됩니다.

    가져온 값이 Null 이 아닌 어떤 값이 있다면 위와 같이 하시면 되구요. 0이 아닌 값
    즉 실수이냐 정수이냐 인데요. 만약 값이 - 가 될수 있다면 다음과 같이 하시면 되겠지요
    if db에서 가져온 값 <> 0 then
       Edit2.Text := IntToStr(가져온 값)
    else Edit2.Text := '제로입니다.';

    조건절을 잘 이용하시면 되겠지요. 이해가 되셨나 모르겠네요.
    아무튼 공부 열심히 하시길..^^
  • Profile
    모영철 2005.09.02 01:30
    먼저 홍순이를 찾기 위해서

    두가지 방법이 있습니다. 잘 집으셨어요..

    쿼리를 바꿔주고 다시 오픈하는 방법

    그리고 locate를 쓰는방법

    제가 다 해드리면 공부가 안될테니 locate는 헬프를 찾아보시구요..

    헬프가 중요해요 이거 보고 함수 어떻게 쓰는지 알아내야 되요 아마 간단한 예제도 있을지 모릅니다.

    그리고 쿼리를 바꾸는건 이렇게 할수 있습니다.

    Query의 sql에

    select * from 테이블명
    where 이름 = :name

    이렇게 쿼리를 넣어주시면

    Query의 프로퍼티 중에 Params라는 프로퍼티의 ... 버튼을 클릭하면

    name 이라는 파라미터가 보일겁니다.

    그 파라미터를 클릭하고 프로퍼티 창을 보면 맨위에 DataType이라고 있는데..

    그걸 ftString이라고 바꿔 주세요.. 여기서는 문자열을 찾는거니깐요..

    그리고 코딩에

    Query1.Close;
    Query1.ParamByName('name').AsString := '홍순이';
    Query.Open;

    이라고 해주면 조건이 들어가게 됩니다.
    무지하게 편하죠..

    그리고 EDit 에다가 다시 값을 넣어줄 필요는 없습니다.

    거기 이벤트 보면 DataSource1DataChange() 이거 있죠?

    그 안에서 찾기만 하면 넣어주니깐요..

    if db에서 가져온값 <> '' then
      Edit1.Text := '바보'
    else Edit1.Text := '천재'

    이건 그렇게 하시면 됩니다. DataSource1DataChange() 이부분에다가 추가 해주면 되겠네요..


    아 그리고 제가 말씀드린 커서는 마우스 커서가 아니라 DataSet에 있는 커서입니다.

    그리드를 클릭해 보시면 그리드 가장 왼쪽에 조금만 검은 삼각형이 있습니다.

    그게 클릭한 레코드 마다 따라 움직일거구요..항상 커서가 그렇게 가있는 값만 참조 할수 있습니다.

    다른 값을 참조하기 위해서는 커서를 움직여야 하는데 그때 필요한것이 Locate 함수 입니다.

  • Profile
    모영철 2005.09.01 22:41
    아 그러니깐 이런겁니다.

    여러개의 레코드가 있을때는 DataSource컴포넌트의 이벤트에다가 넣어줘야 합니다.

    아가 OnChange인가 가 있을겁니다.

    그 이벤트에다가

    Edit1.Text := Query1.FieldByName('Attribute').AsString;

    이렇게 하면 커서가 움직일때 마다

    값을 가지고 오게 됩니다.

    레코드가 여러개가 들어있다면

    사용자에게 레코드를 찾을수 있도록해야 합니다.(당연히 여러개가 있겠지요..)

    그 방법중 하나가 Query1.Locate() 함수를 쓰는거고 아니면

    DBGrid를 이용해서 사용자가 커서를 직접 움직일수 있습니다.

    아니면 Query1의 SQL을 바꿔서 레코드가 하나만 나오도록 where절에 추가할수도 있겠구요..

    근데 가장 편한건 DBGrid입니다.

    디비그리드도 쓰고 DBEdit도 같이 쓰면 상당히 편해집니다.

    먼저 그냥 Edit쓰지 마시구요.. DBGrid부터 써보세요..

    이게 눈으로 먼저 확인하시는게 빠를거 같네요..

    DBGrid써보시고 되면 DBEdit도 올려 보시고..

    그담에 Edit로 이렇게 할려면 어떻게 해야 할까를 생각하는게 좋을거 같습니다.


    • 김상욱
    • 2005.09.05 19:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2005.09.06 03:02
      김영대분께서 잘 정리해 두셨거든요 그분 홈페이지에서 팁란을 참고해 보세요 http://www.howto.pe.kr ...
    • 토픽
    • 2005.09.04 03:13
    • 2 COMMENTS
    • /
    • 0 LIKES
    • Diablo
      2005.09.05 08:27
      sendmessage로 해결하세용~! sendmessage(받을놈 핸들, 메세지상수, 0, Longint(@값)); 사용법은 도움말 ...
    • 토픽
      2005.09.07 08:07
      답변감사합니다. 다 찾아봤는데 팁에 찾아보니 잘 나와있더군요.. 문제는 이해가 잘 안간다는것입니다....
    • 프로글래머
      2005.09.04 18:12
      해당 폼이 Create 되기 전에 데이타모듈을 Create, 해당 폼이 Close   되기 전에 데이타모듈을 ...
    • 이은주
      2005.09.06 23:47
    • 조영미
    • 2005.09.03 20:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 프로글래머
      2005.09.03 23:30
      단순하게, 스크롤박스 안의 내용을 움직여 스크롤 하려고 애쓰지 말고 스크롤박스의 스크롤바를 움직여서 ...
    • 허버벅
    • 2005.09.03 19:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이재필
    • 2005.09.03 19:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 천희택
      2005.09.03 07:01
      고수는 결코 아닙니다만.... TList 의 경우 Add Parameter로 포인터를 넘기는 걸로 알고 있습니다. Ad...
    • 프로글래머
      2005.09.03 18:55
      기본적으로 RB 메뉴에서 우선 툴바를 셋팅하세요. 'View-Toolbars' 메뉴를 클릭하면 됩니다. 제가 해본...
    • 조혜진
      2005.09.05 23:28
      Report Builder 사용하시는 분이 많지가 않은지 조언을 구하기 힘드네요. 님의 도움에 깊은 감사를 드립니...
    • 윤경미
    • 2005.09.02 23:19
    • 11 COMMENTS
    • /
    • 0 LIKES
    • 박홍재
      2005.09.03 15:20
    • 윤경미
      2005.09.03 20:21
    • 박홍재
      2005.09.04 09:02
    • 윤경미
      2005.09.06 03:12
    • 꼬미사랑
      2005.09.03 00:14
    • 윤경미
      2005.09.03 01:00
    • 꼬미사랑
      2005.09.03 01:18
    • • • •
    • 천희택
      2005.09.02 21:16
      흐음.... mysql이 4.1대로 넘어오면서 내부적으로 utf8으로 처리 한다고 들었습니다. my.cnf에서 [my...
    • 최선호
      2005.09.02 22:04
      우선 답변에 감사를 드립니다. 그런데 천희택님께서 말씀해주신 방법대로 했는데도 그대로 한글이 깨...
    • 최선호
      2005.09.02 22:11
      아 이제 됩니다. 쿼리문 날리기전에 set name euckr 쿼리문 날리고 하니까 한글이 제대로 들어가네요 천...
    • 조영미
    • 2005.09.02 19:52
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 꼬미사랑
      2005.09.03 03:17
      안녕하세요. 스크롤이라함은 마우스 휠 움직임을 말씀하시는듯하네요.. 그냥 간단하게 만들어봤습니다...
    • 조영미
      2005.09.03 20:17
      휠 마우스로 움직이는거 맞는데요. 이거 해보니 안 되더라고요..
    • srookie
      2005.09.02 20:01
      안녕하세요. WriteBuffer Method 같은 경우에는 함수 argument 상에 직접 보낼 수 있는 flag가 존재합니다...
    • 김경효
    • 2005.09.02 01:52
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 윤수아
      2005.09.15 20:38
      APD 4.05 버전을 사용하고 있습니다.. 기존 버전을 써보셨다면 특별한 차이는 없습니다. 우선은 통신이...
    • 이중철
      2005.09.02 19:09
      참고로 이런 프로젝트하실때는 Y-Cable을 제작해서 쓰는 것이 좋습니다.. 터미널에서 엔터값이 정확히 ...
    • 김경효
      2005.09.02 22:21
      우선, 답변달아주셔서 감사합니다. 그런데 한가지 여전히 문제는.... 제가보기엔 putstring() 자체가 ...
    • 이승훈
    • 2005.09.02 00:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이태형
      2005.09.02 04:26
      출처1 : http://www.jobkorea.co.kr/List_Edu/Edu_GIB_Read.asp?Ed_No=70605 출처2: http://www...
    • 윤경미
    • 2005.09.01 19:25
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 꼬미사랑
      2005.09.01 20:56
      안녕하세요. 꼬미사랑입니다.. edit박스로 구현하기에는 여러개의 데이터가 있는 경우에는 힘들져..크크 ...
    • 모영철
      2005.09.01 20:29
      휴.. 맨 아래 디비연결 하는 내용은 잘모르겠어요...ㅠ.ㅠ 윗부분만 설명을 드리면 구조가 이렇습...
    • 윤경미
      2005.09.01 22:13
      답변 감사드립니다... 제가 너무 초보라 많이 답답하실듯..ㅠㅠ <!--CodeS--> if Not(Query...
    • 모영철
      2005.09.01 23:48
      예제를 만들었습니다.. 저도 님보다 더할
    • 윤경미
      2005.09.02 00:48
      말씀해 주신 데로 마우스 커서를 그리드에 클릭하면 edit가 바뀌네요~~ 신기하여라~~ 예제까지 보...
    • 박홍재
      2005.09.02 11:28
      모영철 님께서 잘 설명을 해 주셨는데 아직 초보시라 이해하기 힘드신듯.... 여러게의 값이 있는 Table의 ...
    • 모영철
      2005.09.02 01:30
      먼저 홍순이를 찾기 위해서 두가지 방법이 있습니다. 잘 집으셨어요.. 쿼리를 바꿔주고 다시 오픈하...
    • • • •
    • 꼬미사랑
      2005.09.01 20:47
      안녕하세요... 꼬미사랑입니다.. 그냥 제가 간단히 하나 만들었는뎅.. 원하는시는 답이 맞는지 몰겠네요.....
    • 꼬미사랑
      2005.09.01 21:00
      정확한 타이머는 타이머 콤포보다 CPU를 이용한 ticker 계열을 이용하는게 낫다고 하던데 아직 이용해보지...
    • 김지훈
    • 2005.09.01 18:18
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정희돈
      2005.09.02 01:14
      말씀으로 보면 Form의 Canvas를 이용하신것 같은데요 Form은 모든것의 부모개체라 당연히 다른 컴포넌...