Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы использования TAdvStringGrid 
:(
    Опции темы
yahont7
Дата 25.4.2011, 03:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 25.4.2011

Репутация: нет
Всего: нет



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

При этом важно чтобы визуальная стилистика таблицы была в тонах Office 2003.

Всем этим требованиям отвечает компонент от TMS - TAdvStringGrid.

Вроде бы разобрался как и чего делать, да компонет удобный в работе, и хелп не плохой.
Но возникла проблема. Суть ее такова, для того чтобы работать с числами с плавающей точкой надо написать два обратботчика для этого компонента:
1. OnGetEditorType - в котором можно определить редактор типа данных для любой ячейки или столбца. В моем случае он выглядет так:
Код

procedure TForm1.AdvStringGrid1GetEditorType(Sender: TObject; ACol,
  ARow: Integer; var AEditor: TEditorType);
begin // Установка редактора значений в ячейках для второго и третьего столбцов
  if (ACol = 2) then
  begin
    AEditor := edFloatSpinEdit; // тип редактора
 //   AdvStringGrid1.SpinEdit.Precision := 4; - его вариация не решает проблему
    AdvStringGrid1.SpinEdit.MinFloatValue := 0;
    AdvStringGrid1.SpinEdit.MaxFloatValue := 2.5;
    AdvStringGrid1.SpinEdit.IncrementFloat := 0.001;
  end;
  if (ACol = 3) then
  begin
    AEditor := edFloatSpinEdit;
    AdvStringGrid1.SpinEdit.MinFloatValue := 0;
    AdvStringGrid1.SpinEdit.MaxFloatValue := 100000;
    AdvStringGrid1.SpinEdit.IncrementFloat := 10;
  end;
end;

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

Второй обработчик OnGetFloatFormat определяет лишь формат самого числа в отображаемого в ячейке.
реализован он для второго и третьего столбцов, следующим образом:
Код

procedure TForm1.AdvStringGrid1GetFloatFormat(Sender: TObject; ACol,
  ARow: Integer; var IsFloat: Boolean; var FloatFormat: string);
begin // Установка формата во втором и третьем столбцах
  IsFloat := ACol in [2,3];
  case ACol of
    2: FloatFormat := '%.3f'; // Три знака после запятой
    3: FloatFormat := '%.1f'; // Один знак
  end;
end;



Так вот суть проблемы такова, что редактор edFloatSpinEdit, упорно округляет во втором столбце число до ДВУХ знаков, а нужно для ТРЕХ. Т.е. даже внутрипрограммно во второй столбец введены числа с тремя знаками после запятой, они отображаются корректно, но стоит только войти в редактирование этой ячейки как автоматом резульат округляется до ДВУХ знаков (что искажает результат).  Что я только не делал но, но так и не смог найти способ заставить этот edFloatSpinEdit для второго столбца обеспечить точность в ТРИ знака после запятой. (а это критично) 
Если проблему неудастся решить то придется отказыватся от редактора edFloatSpinEdit в пользу более неудобного edFloat.


Исходники примера прикладываю к тексту используются только обычные компоненты и компонент TAdvStringGrid от TMS.


Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  ________TAdvStringGrid.rar 127,92 Kb
PM MAIL   Вверх
yahont7
Дата 25.4.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 25.4.2011

Репутация: нет
Всего: нет



Все вопрос снят.

Причиной было свойство самого компонента FloatFormat, в котором по умолчанию - "%.2f".
Оказывается округление к двум знакам делал не редактор edFloatSpinEdit а сам компонент, пришлось много потрудится чтобы, это вычислить. Причем округление происходило после того как осуществлялся переход на следующую ячейцу или нажатие клавиши Enter.

И так если требуется работать с числами с плавающей точкой но разной точности по столбцам (или строкам). 
То надо сделать следующее
1. Для самого компонента TAdvStringGrid установить свойство FloatFormat соответсвующую наибольшей точности из тех, столбцов, что будут определены. Например AdvStringGrid.FloatFormat := '%.4f';

2. В обработчике OnGetEditorType - определить спинэдитовский редактор (ибо очень удобен для работы) вещественных чисел:
Код

procedure TForm1.AdvStringGrid1GetEditorType(Sender: TObject; ACol,
  ARow: Integer; var AEditor: TEditorType);
begin // Установка редактора значений edFloatSpinEdit в ячейках для нужных столбцов
  if (ACol in [1,2,3]) then
  begin
    AEditor := edFloatSpinEdit; // тип редактора - СпинЭдит для вещественных чисел
    AdvStringGrid1.SpinEdit.MinFloatValue := 0.000;
    AdvStringGrid1.SpinEdit.MaxFloatValue := 1.000;
    AdvStringGrid1.SpinEdit.IncrementFloat := 0.001; // Шаг изменения спина
  end;
  if (ACol = 8) then
  begin
    AEditor := edFloatSpinEdit;
    AdvStringGrid1.SpinEdit.MinFloatValue := 0;
    AdvStringGrid1.SpinEdit.MaxFloatValue := 1;
    AdvStringGrid1.SpinEdit.IncrementFloat := 0.0002;
  end;
end;


3. В обработчике OnGetFloatFormat определить формат вещественных чисел в столбцах.
Например:
Код

procedure TForm1.AdvStringGrid1GetFloatFormat(Sender: TObject; ACol,
  ARow: Integer; var IsFloat: Boolean; var FloatFormat: string);
begin // Установка формата во втором и третьем столбцах
  IsFloat := ACol in [1,2,3, 8]; // Здесь выставляем флаг вещественного числа для каждого столбца
  // Формат чисел по столбцам
  case ACol of
    1,2,3: FloatFormat := '%.3f'; 
    8: FloatFormat := '%.4f'; 
  end;
end;


Кстати обращаться к ячейкам с вещественными числами можно так:
Код

    AdvStringGrid1.Floats[8, i] :=  x*exp(-0.12*x); // На запись в восьмом столбце


И это удобнее чем, например так 
Код

    AdvStringGrid1.Cells[8, i] :=  FloatToStrF(x*exp(-0.12*x), ffFixed, 4, 4);


Все! После этого все работает.
Компонент действительно очень удачный, и обладающий огромным функционалом.
Исправленный пример приложен к посту

Это сообщение отредактировал(а) yahont7 - 25.4.2011, 22:02

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  TAdvStringGrid.rar 127,21 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1005 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.