Недавно добавленные исходники

•  TDictionary Custom Sort  537

•  Fast Watermark Sources  902

•  3D Designer  1 830

•  Sik Screen Capture  1 477

•  Patch Maker  1 485

•  Айболит (remote control)  1 409

•  ListBox Drag & Drop  1 176

•  Доска для игры Реверси  21 917

•  Графические эффекты  1 357

•  Рисование по маске  1 296

•  Перетаскивание изображений  1 096

•  Canvas Drawing  971

•  Рисование Луны  814

•  Поворот изображения  771

•  Рисование стержней  815

•  Paint on Shape  493

•  Генератор кроссвордов  762

•  Головоломка Paletto  667

•  Теорема Монжа об окружностях  855

•  Пазл Numbrix  619

•  Заборы и коммивояжеры  849

•  Игра HIP  557

•  Игра Go (Го)  527

•  Симулятор лифта  549

•  Программа укладки плитки  509

•  Генератор лабиринта  565

•  Проверка числового ввода  524

•  HEX View  600

•  Физический маятник  528

•  Задача коммивояжера  560

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Форматирование ячеек TStringGrid



Hажмите ! Ещё! Format complete...

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

Вам нужно сделать пару вещей:

  • Обработчик OnDrawCell, отображающий отформатированные данные, выровненные по правому краю.
  • В ячейки вашей сетки загружать неформатированные строки, представляющие собой ваши данные.

В вашем обработчике OnDrawCell создайте код типа того, что приведен ниже. Этот код отображает разделенную запятой величину, выровненную по правому краю:


begin
  if (Row > 0) and (Col > 0) and (grdDivBudget.Cells[Col, Row] <> '') then
  begin
    {Формат строки с числом с плавающей точкой}
    strText := FloatToStrF(StrToFloat(grdDivBudget.Cells[Col, Row]),
      ffNumber, 13, 2);

    {Устанавливаем шрифт}
    grdDivBudget.Canvas.Font.Name := 'Courier';
    if StrToFloat(grdDivBudget.Cells[Col, Row]) < 0 then
      grdDivBudget.Canvas.Font.Color := clRed;
    grdDivBudget.Canvas.Font.Style := grdDivBudget.Canvas.Font.Style -
      [fsBold];

    {Центрируем текст в ячейке по вертикали, по правому полю,
    и отодвигаем его от правого поля на два пикселя.}
    X := Rect.Right - grdDivBudget.Canvas.TextWidth(strText);
    Y := Rect.Top + ((Rect.Bottom - Rect.Top -
      grdDivBudget.Canvas.TextHeight(strText)) div 2);
    Dec(Rect.Right, 2);

    grdDivBudget.Canvas.TextRect(Rect, X, Y, strText);
  end;
end;

Убедитесь в том, что вы имеете DefaultDrawing := True, так, чтобы вы могли в ячейках выводить только текст, остальную отрисовку за вас сделает VCL.

Теперь все должно работать. При попытке пользователя отредактировать число в ячейке, оно будет отображаться в неформатированном виде (если у вас нет необходимости в обработчике события OnGetEditText).

Но при этом вы можете обнаружить, что проверка данных для данного способа может быть проблематична (например, что будет, если пользователь введет 'TX' в числовой колонке). Эта ситуация усугубляется тем фактом, что сетка (во всяком случае DrawGrid) не позволяет реализовать "последовательное поведение" для различных путей навигации по сетке (например, инициализировать различные события, если вы пользуетесь курсорными стрелками, мышью, или просто нажимаете Enter). Но и это все решается простой посылкой другого сообщения (позже я расскажу вам как это можно сделать).





Похожие по теме исходники

TStringGridCheker




Copyright © 2004-2022 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте   Facebook   Ссылка на Twitter   Ссылка на Telegram