Q&A

  • DBGrid 표시할 때 깜빡임 처리
초당 데이터를 하나씩 저장하게 되고 최고 120,9600개의 데이터를 저장합니다.

따라서, 매초당 한 번씩 데이터를 저장하는 작업을 수행하고, DBGrid 상에는 마지막 저장시간부터 1시간 전의 3600개 데이터를 표시하려고 합니다.

시뮬레이션을 위해 임의로 데이터를 저장하는 프로시저를 작성 하였습니다.


procedure TfrmMain.DataSave;                                        
var
  st, et: Longword;
  cur: TDateTime;
begin
  st := GetTickCount;

  Randomize;
  cur := Now;
  
  while (bRun) do
  begin
    Application.ProcessMessages;

    et := GetTickCount;
    if ((et-st) > 990) then
    begin
      grdData.DataSource.DataSet.Active := False;

      adoQuery.SQL.Add( 'INSERT INTO Dose VALUES(' +
                        Format('%u', [dwCounts+1]) + ', ''' +
                        DateTimeToStr(IncSecond(cur, dwCounts)) + ''', ' +
                        Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
                        Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
                        Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
                        Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
                        Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
                        Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
                        '''Norm/Norm'', ''' +
                        'No/' + Format('%.1f', [23 + (Random(5) / 10)]) + '/' + Format('%.1f', [2 + (Random(10) / 10)]) + '/NW' +
                        ''');'
                        );

      adoQuery.ExecSQL;
      adoQuery.SQL.Clear;

      adoQuery.SQL.Add('SELECT * FROM Dose WHERE Ion BETWEEN 10.0 AND 10.3');
      adoQuery.Open;
      adoQuery.SQL.Clear;

      grdData.DataSource.DataSet.Active := True;
      grdData.DataSource.DataSet.Last;

      Inc(dwCounts);
      memProcTime.Lines.Add(Format('%d - %d', [dwCounts, (et-st)]));

      st := et;
    end;
  end;
end;


코드처럼 (et-st)가 990이 넘는 순간 하나의 데이터를 저장합니다. (990으로 설정한 이유는 제 PC의 처리 속도상...)

여기에서 grdData.DataSource.DataSet.Active 속성을 False/True로 설정하는데 이 과정에서 아래쪽의 True에 의해 저장되어 있는 전체데이터를 refresh하는 것 같습니다.  이로 인해 DBGrid가 깜빡거리는 것이고, 데이터가 많아 질수록 느려지게 되는거 같습니다.

하지만, 이 속성을 처리해주지 않으면 작업 과정이 DBGrid상에 전혀 표시되지 않는데에 또 다른 문제가 있습니다. 데이터가 전혀 표시가 되지 않습니다.

위의 제 코드에서 매초당 한 번씩 데이터를 저장하는 작업을 수행하고, DBGrid 상에는 마지막 저장시간부터 1시간 전의 3600개 데이터를 표시하려고 할 때에 어떻게 수정해야 할지 알고 싶습니다.

DB는 MS Access 2003, DB 연결관리는 ODBC 설정 완료 후, Design상에서 TADOConnection, TDataSource, TADOQuery, TADOTable, TDBGrid를 사용하고 있습니다.
0  COMMENTS