Как манипулировать содержимым сетки БД перед отображением?

У меня есть столбец в таблице БД, в котором хранится давление. Давление всегда сохраняется как PSI и может быть преобразовано в BAR при погружении на 14,5.

Пользователь может переключать отображение PSI/BAR с помощью Radio Group.

Я использовал TStringGrid и перешел на TDbGrid, что для меня совершенно ново.

Когда пользователь переключает PSI/BAR, как мне обновить отображение в моей сетке БД? (Я представляю, что я просто снова выполняю его запрос? Или вызываю query.Refresh()?) Но как мне сделать преобразование?

  1. Возможно, хранимая процедура, хотя это кажется излишним, и хранимые процедуры также новы для меня...
  2. Изменив оператор SELECT моего запроса? Но как мне это сделать? SELECT pressure / 14.5 FROM measurements? Или как?
  3. Или есть OnBeforeXXX(), который я могу закодировать? Или OnGetDisplayText() или что-то в этом роде?

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

Я также хочу изменить текст заголовка столбца, переключаясь между «Давление (PSI)» и «Давление (BAR)». Заранее благодарю за любую помощь.


person Mawg says reinstate Monica    schedule 20.11.2012    source источник
comment
если вы используете постоянные поля, вы можете сделать это с помощью TField.OnGetText.   -  person Cesar Romero    schedule 20.11.2012
comment
+1 Спасибо. Теперь, чтобы узнать, что такое постоянное поле ;-) (не волнуйтесь, я погуглю или посмотрю в справке, теперь, когда я знаю, что искать)   -  person Mawg says reinstate Monica    schedule 20.11.2012


Ответы (2)


Напишите обработчик события OnGetText для поля давления следующим образом:

type
  TPressureMU = (pmuPSI, pmuBAR);

const
  PSIToBarFactor = 1/14.5;


procedure TdmData.qMeasurementsPressureGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  case PressureMU of
    pmuPSI: Text := FloatToStr(Sender.AsFloat); //Already PSI
    pmuBAR: Text := FloatToStr(Sender.AsFloat * PSIToBarFactor); //ConvertingToBAR
  end
end;

Я использую свойство PressureMU объявленного перечисления, чтобы контролировать, отображается ли давление в единицах измерения PSI или BAR.

Таким образом, когда пользователь изменяет выбор, вы просто корректируете значение этого свойства.

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

begin
  qMeasurements.FieldByName('Pressure').OnGetText := qMeasurementsPressureGetText;
end;

где qMeasurementsPressureGetText — имя метода.

person jachguate    schedule 20.11.2012

Создайте постоянные поля (щелкните запрос правой кнопкой мыши и выберите Add Fields, чтобы создать поля во время разработки, которые хранятся в .dfm). Щелкните запрос правой кнопкой мыши и добавьте новое поле. Сделайте его вычисляемым полем и в событии OnCalcFields запроса выполните преобразование из PSI в BAR.

Теперь, когда пользователь переключает отображение, вы просто отображаете столбец PSI или BAR, устанавливая Column.FieldName, устанавливая его в фактический столбец PSI или вновь вычисленный столбец BAR.

Конечно, если вы не используете постоянные поля, вы можете сделать все это в запросе. Просто добавьте новый столбец в оператор SQL, содержащий результат преобразования, и вы все равно можете просто изменить Column.FieldName во время выполнения, чтобы переключить отображаемое значение.

person Ken White    schedule 20.11.2012