Q&A

  • cxGrid를 UnboundMode에서 사용할 때 CheckBox Column 제어
Hi!

Delphi6 + cxGrid(version4) + IBX + Firebird로 작업 중입니다.

Table에서 조회된 데이터를 cxGrid( Unbound Mode)에 뿌려주는데요...

//특정 칼럼의 레코드에 해당하는 값 얻기
function TForm1.GetValue(ARecordIndex, AItemIndex: Integer): Variant;
begin
  Result:= tvGrid1.DataController.GetValue(ARecordIndex, AItemIndex);
end;

//데이터 조회하는 procedure
procedure TForm1.SelectData;

//데이터 뿌려주는 procedure
procedure TForm1.DisplayData;
var
  i: integer;
begin
   if co_SelectionMessage(data_delete_question)=ID_NO then Exit;

  dm.StartTransaction;
  try
    with Grid1 do
    begin
      for i:=0 to tvGrid1.DataController.RecordCount-1 do
      begin
        if GetValue(i, 0)= 'False' then Continue;

          S:= ' DELETE FROM tb_down'
             + ' WHERE filename=' + QuotedStr(GetValue(i, 1));
         dm.ExecSQL(S);
      end;
    end;
    dm.Commit;
  except
    dm.RollBack;
    co_ErrorMessage('파일 송수신내역을 ' + data_delete_error);
    Exit;
  end;

  SelectData;
end;

그리드의 첫번째 항목이 CheckBox입니다. 체크박스에 체크를 한 후 삭제버튼을 누를 때의 동작인데요.
GetValue(i, 0)에서 한두개 처리하다가 IndexOutOfRange 에러가 납니다. 별도의 예제가 없어서 cxGrid의 데모를 참조한건데 에러가 나는군요.  아시는 분 해결방법 좀 부탁드립니다.
cxGrid 좀 쓰기에 짜증이 나네요.
2  COMMENTS
  • Profile
    박성훈 2006.05.02 18:57
    Loop를 돌면서 데이터를 뿌리는 코드에 문제가 있었습니다.

    특이하게도 Loop 도중에 Application.ProcessMessage 를 호출하게 되면 에러가 떨어지면

    요넘을 주석 처리하면 이상이 없습니다.

    while not Query1.Eof do
    begin
    //Application.ProcessMessage;  //요 코드땜에 Error 발생

    {Displaying code}

      Query1.Next;
    end;
  • Profile
    깔쌈보이 2006.04.15 00:11
    GetValue의 행에 관련된 인자 i 가 Viewing Data의 Row인지 전체 Record의 Row인지 확인해보셨나요?

    cxGrid는 현재 보여지는 Row와 전체 Row 두가지 모드에서 관리하거든요...
    DataController.Values[i, 0]를 한번 사용해보심이...

    그리고 Variant를 사용하시는 리턴함수이던데...
    그 보다는 실제 데이타를 만들어서 리턴하는게 에러가 난 경우 더 쉽게 잡힙니다...
    그리고 체크박스의 True/False를 문자열  True/False 로 하시는 것 보다는 1/0 으로 하시는게 더 좋구요...
    아니면 Y/N으로 하시던가요...

    Variant형으로 모든걸 처리하시는데, 저 함수를 빼시고...
    VarToStrDef(cxGrid1.DataController.Values[i, 1], "")와 같은 형태로 직접 해당 데이타 컬럼의 데이타 양식을 맞추어서 작업하셔서 차근차근 인덱스 오류를 잡으시는게 좋습니다.

    -ps-
    순전히 저의 경우,
    cxGrid는 처음에 익숙해지지 않으면 세상에서 제일 짜증나는 그리드가 되는데...
    익숙해지면, 이거 없이는 작업이 불편해서 짜증날 정도로 좋은 그리드가 되더군요 ^^