Q&A

  • [질문] DBGrid 에서 클릭한 셀의 필드값 받아오기는 어떻게 하나요?
안녕하세요? 그야말로 델파이 쌩초보입니다.
처음 해보는 델파이 프로그램이라 책보고 인터넷 찾아보고 해도 도저히 모르겠어서 고수님들께 질문을 드립니다.

제가 구현하려는 프로그램의 구조는 다음과 같습니다..

1. 메인폼에서 Edit에 회원번호 일부를 입력하고 엔터를 치면,
2. 유사한 해당 데이타가 있을 경우에만, 해당 문자열이 있는 레코드 목록을 새폼(Frm_A)을 띄워서 DBGrid 에 모두 출력을 합니다.
3. 출력된 DBGrid 목록 중에서 레코드를 클릭을 하면, 클릭한 레코드의 회원번호 값을 가져와서,
4. 그 회원의 세부사항을 또다른 새로운 폼(Frm_B)에 나타내주고, Frm_A 를 닫습니다. (Frm_B 에서는 필드갯수만큼 DBEdit 를 나열하여, 해당 회원번호로 쿼리한 값을 출력합니다)

여기서 1,2번은 궁여지책으로 어떻게 어떻게 해결을 했는데 (요기까지 1주일 꼬박 걸렸습니다. ㅎㅎ;;), 3번에서 dBGrid 의 row 를 클릭했을때, 그 row 가 선택을 해서 값을 가져오는 방법을 전혀 모르겠습니다.

인터넷 글을 찾다보니 똑같은 것은 없지만 대략 눈치로 때려잡은 사항은, Frm_A 의 DBgrid 에서  OnCellClick 이벤트와 OnMouseUP 이벤트를 이용해서 어떻게 하면 될 수 있을 것도 같다는 건데..
문제는 Frm_A.Dbgrid 의 오브젝트인스펙터에서 이벤트 탭을 눌러서 OnCellClick 이벤트에 더블클릭해서
코드 에디터로 가게 되면, 거기서부터는 뭐라고 써야할 코드는 둘째치고라도 어떻게 개념을 잡아야 할 지조차 막막한 상태입니다.  제가 보기에 얼핏 비슷해 보이는 예제를 보아도 도무지 이해 자체가 불가능하군요 ㅠㅠ

고수님들의 고견을 부탁드립니다.
가능하면 코드를 직접 써주시고 주석으로 설명을 해 주실 수 있는 친절한 고수님이 계실까요?
저 같이 까막눈 상태에서는 코드를 보고 직접 돌아가는 걸 보면서 아예 코드를 하나하나 외우는 것이 개념잡는데 더 빠르지 않을까 하는 생각에서입니다. (좀 무식한 방법이겠만 저는 그게 더 이해가 더 잘되는 거 같아서.. ㅠㅠ)
대신 짜달라거나 대신 숙제를 한다거나 뭐 그런 의도가 전혀 아님을 분명히 밝히고 싶습니다. 제가 늦깎이 델파이 입문자로써 제가 필요한 프로그램을 만들어보고자 하는 의도 외에는 없으니 제발 부탁 좀 드리겠습니다.

푸념섞인 질문을 읽어주셔서 감사합니다.

환절기 감기조심하시고 항상 행복하시기를 바랍니다.

P.S 아참.. 제가 사용하는 DB는 access 로 만들어서 ADO 로 연결을 해놓은 상태이고, 델파이7 사용합니다.
      ADOConnection 과 ADOQuery 를 이용해서 연결을 하고 있습니다.
4  COMMENTS
  • Profile
    백록화 2008.12.01 19:52
    흠...

    DataSet - DataSource - DbGrid

    이렇게 연결되어 있는 상태에서 DbGrid 의 Row가 변경이 되면 DataSet도 같이 변경이 됩니다. 그 반대역시 같고요... DataSource 가 중간에서 연결해주고 있어서 같이 변동이 됩니다.

    따라서 DbGrid 에서 클릭을 했던 어째떤 같에 어떤 셀을 선택했다면은 그것만으로 DataSet 의 어떤 행이 선택되어졌다고 보시면 되겟죠...

    별다른 작업이 없다면 그냥 AdoQuery.FieldByName('필드명').AsString 와 같이 읽으면 되겟습니다.
  • Profile
    델파이쌩초보 2008.12.02 00:55

    백록화님 먼저 관심이 갖고 답변을 해주셔서 너무 감사드립니다.
    진작 들어와봤으면 좋았을껄.. ㅎㅎ 저 혼자 야메로 일단 코딩을 해봤는데.. 맞게 한건지 모르겠네요. 일단 원하는 값은 나오기는 하는데... ;;;
    일단 다시 해봐야겠네요..

    일단 폼이 두개이고, 한개는 dbgrid 가 있는 폼 (Frm_list) 과 dbgrid 를 클릭했을때 보여주는 새로운 폼 (Frm_info) 가 있습니다.

    {Frm_list}

    ...
    procedure TFrm_Mem_List.DBGrid_ListCellClick(Column: TColumn);
    begin
    // showmessage(column.Field.Value);
    // ↑ 일단 클릭했을때 어떤 값이 올라오나 확인하려고 써봤다가 run 할때는 주석 처리함.
    // 그런데 이상하게 dbgrid 에 나타내는 필드가 '전화번호', '성명', '주소', '연관정보1', '연관정보2' 이렇게 5개인데
    // showmessage 에서는 '전화번호' 에 해당하는 필드값만 찍히는지 모르겠네요.;;
    // 어쨋든 다행스럽게도 제가 원하는 값이 '전화번호' 라서.. ㅎ;;;

    edit1.Text := column.field.value; //요건 데이타셋의 개념을 몰라서, 야매로, 찍힌 값을 저장해 봄;; edit.visible = false 로 해서 안보이게 함..역시 야매죠? ;;
    Frm_info.Show;
    end;
    ...
    end.


    {Frm_info}
    ...
    procedure TFrm_Info.FormActivate(Sender: TObject);
    begin
    with Qry_info do
    begin
    close;
    SQL.Clear;
    SQL.Add('select * ');
    SQL.Add('from member a left outer join infos b on a.phone = b.phone ');
    SQL.Add('where a.phone = :no');
    parameters[0].Value := Frm_list.edit1.Text;
    open;
    end;
    Frm_list.close;
    end;
    ...
    end.


    여튼 대충은 되기는 하는데... 만약 dbgrid 를 클릭했을때 '전화번호'가 아니라 '성명' 이나 '주소' 값을 가져다가 새 폼에서 쿼리 조건으로 쓰려는 경우는
    제 코딩이 무용지물이 되는 거 같아요.. ;;;

    그럴때 말씀해주신 fieldbyname().asString 을 사용하면 되는건가요?
    ..
  • Profile
    백록화 2008.12.02 04:14
    네...각 콤포넌트들 (TDataSet, TDataSource, TDbGrid) 는 서로 유기적으로 묶여져 있습니다. 따라서 어느넘을 죠지시던지 접근방법에 따라 차이만 있을뿐 다 똑같습니다.

    TDbGrid 에는 Column 속성에 TDataSet의 Field 랑 연동이 되어 있어서 사용하신 Column.Field 로 데이터에 접근할수 있는것이죠...

    기본적으로 TField 는 Value 는 Variants 타입이고요 AsString, AsInteger, AsFloat 등처럼 각 데이터형으로 값을 취하는 함수가 따로 존재 하니 참고하세요...TParams 역시 그렇습니다.

    또한 Fields[인덱스번호] 나 FieldByName(컬럼명) 도 같은역활을 합니다. 전자가 속도가 좀 빠르겟죠? 인덱스번호로 훌렁 찾아가니...하지만 추후에 컬럼순서가 바뀌면..ㅋㅋ 속도를 최적화 하는곳에선 컬럼순서가 바뀌지 않는 전제하에선 전자를 그렇지 않다면 후자를 많이 사용하는 편입니다. (여담이지만 진짜로 속도를 낼려면 델파이에선 TDataSet 에서 디자인타임시 컬럼(필드)를 생성하는순간 해당 컬럼의 객체가 생성됩니다. 이 객체에 직접 접근하면 왕 빠르겟죠? ^^)

    TParams도 같고요..Params[인덱스번호] 나 ParamByName(파라미터명) 으로 접근해도 됩니다.

    그리고 TDbGrid 의 OnCellClick 에서 넘겨저 오는 Column 은...현재 선택한 컬럼이 넘어옵니다. 전화번호를 찍으면 전화번호가 이름을 찍으면 이름이...

    여튼 OnCellClick 이벤트에서

    edit1.text:= Qry_info.FieldByName(컬럼명).AsString;

    이렇게 하면 되겟죠..

    델파이의 콤포넌트들이 어떻게 동작하냐는 것을 이해하신다면 내공이 올라갑니다. 소스가 전부 있으니 한번 보세요...이해 안가도 걍 디벼 보는겁니다...ㅋㅋ

    그럼..
  • Profile
    델파이쌩초보 2008.12.04 20:34
    백록화님 정말 감사드립니다.
    한번에 정확히 이해를 못하고는 있지만.. 약간 감은 오는 것 같습니다.
    이 은혜를 어떻게.. ㅜㅜ;;

    자주 귀찮게 해도 괜찮으실런지요.. ㅎㅎ;;;
    어쨋든 너무너무 감사드립니다.

    날씨가 하수상하니 감기조심.. 건강조심하세요.. ^^
    • 김길현
    • 2008.12.05 01:45
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.05 01:05
      추측하자면... UDP1.GetMessage(str);에서 타임아웃되어서 종료되고 이 때문에 str에는 아무 값도 설정...
    • absurdite
      2008.12.05 02:22
      앗! 딱 맞습니다ㅡㅜ UDP1.GetMessage(str); if (not (str = '')) then Memo1.Lines.Add(str); ...
    • cell
    • 2008.12.04 23:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.05 00:55
      보내는 부분에서 잘못된 곳이 있네요... 동적 배열 (array of ...)은 포인터형입니다. 실제 데이터는 다...
    • cell
      2008.12.05 01:24
      맞네요... 동적배열이 포인터형인데... 먼짓을 한건지...^^ 감사합니다.
    • 별이^^
    • 2008.12.04 18:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이건희
    • 2008.12.03 20:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.12.03 22:08
      Timer를 이용해보세요 1. OnMouseDown이벤트에서 1.1 레이블의 숫자를 증가시키세요 ...
    • 까마귀
      2008.12.03 23:26
      흠... 아마 메인폼 실행후에 로그인 창이 뜨도록 만들어져 있는 것 같네요. 그리고, 메인폼 실행시 쿼...
    • 이정욱
      2008.12.03 12:57
      클래스를 사용하면 좋겠지만, 만약 네트웍이나 시리얼을 통해 자료를 주고 받는 다면 packed record를 사...
    • 이은주
      2008.12.03 15:45
      아 그럼 동일한 환경이라면 클래스를 쓰는 것이 유리하고 정보를 전송하는 경우는 packed record 가 유리...
    • 김명민
    • 2008.12.03 06:10
    • 0 COMMENTS
    • /
    • 0 LIKES
    • cell
    • 2008.12.03 04:38
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.03 07:21
      쩝~ 왜 꼭 4바이트 형태로 만들어야 된다고 생각하시는지요? Byte든 Char 이든, 16진수이든 10진수이든...
    • cell
      2008.12.04 22:31
      최용일님 말씀처럼 너무 4바이트에 연연했나보네요 ^^ 잘해겼됐습니다.
    • Jackie
    • 2008.12.03 03:09
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.03 03:25
      왜 겹치려고 하는지는 모르겠지만.... TLabel은 절대 TPageControl위로 올라갈 수가 없습니다. TLabel...
    • Jackie
      2008.12.03 03:43
      님의 덕분에 해결을 하였습니다. 정말 감사합니다. 두 콤포넌트가 겹치는것은 대면부구성상 탭오른...
    • 장성호
      2008.12.03 04:02
      TLabel 과 TSpeedButton은 Graphic-Control(윈도우핸들이 없는놈)입니다. 그리고 TPageControl 과 TSt...
    • 꼬꼬마
    • 2008.12.02 21:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 22:39
      아래와 같이해서 함수를 하나 만들어 쓰세요. 1. 년도와 월 가지고 그달의 1일을 구하세요. (EncodeDate...
    • 꼬꼬마
      2008.12.02 23:44
      휴...;;; 무슨 말인지는 알겠는데요;; 아직 델 초보라서;;; 이것저것 계속 해보고 있는데;;;;; ...
    • 장성호
    • 2008.12.02 23:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 꼬꼬마
      2008.12.03 00:53
      장성호님..최용일님.. 두분 감사합니다..;; 몇일째 고생했던게;;;; 시원하게 풀렸네요... 여기서 멈...
    • cell
    • 2008.12.02 06:16
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 18:58
      동적 배열을 사용해보세요. A+B+C+D만큼의 크기를 동적배열로 잡고 거기에 데이터를 넣어서 전송하시면 ...
    • 꼬꼬마
    • 2008.12.01 22:10
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 02:14
      뭐가 잘 안된다는 것인지.... 그냥 for문으로 원하시는 주를 삽입하시면 될것 같은데요...
    • 꼬꼬마
      2008.12.02 04:01
      어떤 식으로... for문을 돌려야 하는건가요? 이거..그냥 계속 제자리 걸음을 하는거 같네여;; ㅠㅜ
    • 장성호
      2008.12.02 05:03
      벌써 여러번 같은 질문 올리셨죠? 이곳 말고 델마당에도... http://www.delphi.co.kr/zboard/view....
    • 조일현
    • 2008.12.01 21:16
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 02:16
      뭘 그렇게 숨기시려고 하시는지... 'zzzzzz'이란 에러메세지에 해답이 있습니다. 잘 분석해보세요.
    • 아르스
      2008.12.02 19:09
      ^^
    • 조일현
      2008.12.07 20:36
      감사합니다~~
    • 백록화
      2008.12.01 19:52
      흠... DataSet - DataSource - DbGrid 이렇게 연결되어 있는 상태에서 DbGrid 의 Row가 변경이 되...
    • 델파이쌩초보
      2008.12.02 00:55
      백록화님 먼저 관심이 갖고 답변을 해주셔서 너무 감사드립니다. 진작 들어와봤으면 좋았을껄.. ㅎㅎ ...
    • 백록화
      2008.12.02 04:14
      네...각 콤포넌트들 (TDataSet, TDataSource, TDbGrid) 는 서로 유기적으로 묶여져 있습니다. 따라서 어...
    • 델파이쌩초보
      2008.12.04 20:34
      백록화님 정말 감사드립니다. 한번에 정확히 이해를 못하고는 있지만.. 약간 감은 오는 것 같습니다. ...
    • 유경민
    • 2008.11.29 22:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • safebear
      2008.12.01 19:07
      자료실에 원하시는게 있네요 ^^ http://www.delphi.co.kr/zboard/view.php?id=component&page=1&sn1=&...