При работе с компонентом TDBGrid в среде разработки Delphi 10.2 при подключении к базе данных SQL Server 2008, пользователи могут столкнуться с проблемой перекрытия текста при изменении данных в ячейках. Это может быть связано с особенностями отрисовки компонента в новых версиях Delphi, в отличие от Delphi 7, где такая проблема отсутствует.
Проблема
При использовании события OnDrawColumnCell для изменения данных в TDBGrid, текст в ячейках может перекрываться. Это происходит в Delphi 10.2, в то время как в Delphi 7 подобной проблемы не наблюдается.
Пример кода
В примере кода создается таблица Persons и вставляется в нее некоторая данных в SQL Server 2008. В Delphi создается новое VCL Forms приложение, где для отображения данных используется TADOConnection, TADOQuery, TDataSource и TDBGrid. Строка запроса TADOQuery.SQL устанавливается как "select LastName from Persons".
В обработчике события OnDrawColumnCell изменяется отображаемый текст для столбца LastName. Однако, из-за отсутствия очистки области перед отрисовкой, текст может перекрываться.
Решение
Для корректного отображения текста необходимо очистить область перед отрисовкой. TDBGrid предоставляет удобный метод DrawCellBackground, который можно использовать для этой цели. Ниже приведен пример реализации:
type
TDBGridHelper = class helper for TDBGrid
public
procedure writeText(
const inRect: TRect;
const text: String;
const State: TGridDrawState;
const columnIndex: Integer
);
end;
procedure TDBGridHelper.writeText(
const inRect: TRect;
const text: String;
const State: TGridDrawState;
const columnIndex: Integer
);
var
backgroungRect: TRect;
begin
backgroungRect := inRect;
backgroungRect.Inflate(-1, -1);
if (gdSelected in State) then
DrawCellHighlight(inRect, State, columnIndex, 0)
else
DrawCellBackground(backgroungRect, Color, State, columnIndex, 0);
Canvas.TextRect(
inRect,
inRect.Left + 2,
inRect.Top + 2,
text
);
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
columnText: String;
begin
columnText := '---';
if Assigned(Column.Field) then begin
if (Column.FieldName = 'LastName') then
columnText := 'change';
else
columnText := Column.Field.DisplayText;
end;
DBGrid1.writeText(Rect, columnText, State, Column.Index);
end;
Альтернативное решение
В качестве альтернативного решения предлагается отключить "Runtime themes" в проекте, что позволит вернуться к старому виду интерфейса и алгоритмам отрисовки, использовавшимся в более ранних версиях Delphi.
Выберите Project > Options > Application.
Снимите галочку с опции Enable Runtime Themes.
Однако, следует помнить, что это решение может повлечь за собой другие изменения в интерфейсе и поведении приложения.
Заключение
Приведенные решения позволяют исправить проблему с перекрытием текста в компоненте TDBGrid при работе с Delphi 10.2 и SQL Server 2008. Рекомендуется тщательно протестировать изменения в приложении, чтобы убедиться в их корректности и отсутствии побочных эффектов.
При работе с компонентом `TDBGrid` в Delphi 10.2 при использовании события `OnDrawColumnCell` для изменения текста в ячейках может возникнуть проблема перекрытия текста, которая отсутствовала в Delphi 7 и связана с изменениями в отрисовке компонента.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.