Выбрать главу

7. Автоматический подсчет сумм при помощи TQuery.

Меня интересует возможность подсчета суммы по таблицам, которые уже находятся на форме.

Есть очень простой способ — предположим, что у вас есть на форме Query1, DataSource1, DBGrid1. Добавьте на эту же форму компоненты Query2, DataSource2, DBText1. Установите property Query2.DataSource=DataSource1. В Query2.SQL напишите

SELECT SUM(FieldName) FROM TableName

где TableName — имя той же таблицы что и у Query1, а FieldName — имя столбца по которому производится подсуммирование. Далее свяжите между собой Query2, DataSource2 и DBText1.

При изменении Query1 (если конечно Query1.RequestLive=True) Query2 будет автоматически перевыполняться. Это решение хоть и простое, но неэкономичное — особенно при большом количестве записей в исходной таблице. Более того, запрос Query2 должен иметь WHERE идентичный Query1.

Для подсчета сумм правильнее использовать событие TQuery.OnCalcFields. Хорошим примером является X:\DELPHI\DEMOS\DB\MASTAPP\MASTAPP.DPR. 

8. Использование кавычек в параметризированном запросе.

Мой запрос получает параметр. Проблема в том, что строка параметра содержит " (двойную кавычку), которая приводит к Runtime Error.

Вам необходимо использовать динамический SQL-запрос, иначе при указании например

WHERE TABLE.FIELD = 'let"ter'

вы получите ошибку.

9. Как создать отдельный компонент TTable?

Легко и просто — точно также как и обычный компонент. При этом в качестве параметра конструктору можно передавать значение nil.  

var 

  MyTable: TTable; 

begin 

  MyTable := TTable.Create(nil); 

  try 

    MyTable.DatabaseName := 'MyDB'

    MyTable.TableName := 'MyTable.db'

    Mytable.IndexName := 'MyIndex'

    MyTable.Open; 

    { делать то, что надо } 

  finally 

    MyTable.Free; 

  end

end;

10. Как узнать, какая ячейка при просмотре TDBGrid текущая?

Здесь процедура для сохранения текущего номера строки и колонки. Следующий код в методе MyDBGridDrawDataCell обновляет переменные Col и Row (которые не должны быть локальными для этого метода) каждый раз, когда таблица перерисовывается. Используя этот код, вы можете считать, что Col и Row указывают на текущую колонку и строку соответственно.  

var 

  Col, Row: Integer; 

procedure TForm1.MyDBGridDrawDataCell(Sender: TObject; const Rect: TRect; 

  Field: TField; State: TGridDrawState); 

var 

  RowHeight: Integer; 

begin 

  if gdFocused in State then 

  begin 

    RowHeight := Rect.Bottom - Rect.Top; 

    Row := (Rect.Top div RowHeight) - 1; 

    Col := Field.Index; 

  end

end

11. Как выделить цветом текущую строку в TDBGrid?

Для TDBGrid в свойстве Options установите dgRowSelect в True.

12. Как изменить цвет ячейки в TDBGrid?

Введите следующий код в обработчике события OnDrawDataCell:  

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; 

  Field: TField; State: TGridDrawState); 

begin 

  if gdFocused in State then 

  with (Sender as TDBGrid).Canvas do 

  begin 

    Brush.Color := clRed; 

    FillRect(Rect); 

    TextOut(Rect.Left, Rect.Top, Field.AsString); 

  end

end;

Установите свойство DefaultDrawing в True. Здесь перерисовывается только выделенная ячейка. Если установить DefaultDrawing в False, то вы должны самостоятельно перерисовать все ячейки аналогично примеру.

13. Как узнать, что пользователь перешел на другую запись, например, в TDBGrid?

Переход на новую запись — это событие, которое относится не к визуальному компоненту, а к источнику данных. Соответствующее событие называется OnDataChange и имеется у компонента TDataSource.

14. Как устанавливать собственный цвет или шрифт для столбца TDBGrid?

Выключите property DefaultDrawing, и обрабатывайте событие OnDrawDataCell:  

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; 

  Field: TField; State: TGridDrawState); 

begin 

  if Field.FieldName = 'Name' then DBGrid1.Canvas.Font.Style := [fsBold]; 

  DBGrid1.DefaultDrawDataCell(Rect, Field, State); 

end;    

Это приведет к тому, что содержимое столбца 'Name' будет показываться жирным шрифтом.

В Delphi 2.0 вы можете использовать редактор столбцов для той же самой цели.

15. Почему указатель ползунка в TDBGrid не показывает текущее положение в таблице?

Дело в том, что TDBGrid предполагает многопользовательский доступ к таблице. В этом случае другие пользователи этой же таблицы могут добавлять или удалять записи, в результате информация о количестве записей на текущий момент становится неопределенной.

Конечно, в однопользовательском варианте количество записей всегда известно, но поскольку TDBGrid работает через промежуточный источник данных DataSource, ему неизвестен конкретный способ доступа к данным — навигационный или SQL. Например, для SQL существует только один способ узнать количество записей — выполнить специальный запрос с их подсчетом, а на это может потребоваться значительное время.