Форматирование Delphi DBGrid с MySQL

У меня вопрос относительно форматирования ячеек данных в DBGrid delphi. Компонент DBGrid подключен к базе данных MySQL, которая заполняется во время выполнения.

У меня есть столбец для DateTime и один для логического значения. Когда временная часть столбца datetime равна 0, она отображает только дату, но мне нужно, чтобы она отображала дату и время, даже если время равно нулю. Логическое поле отображает 1 или 0, но мне нужно, чтобы оно отображало «включено» или «выключено».

Я пробовал использовать поля, а затем устанавливать форматирование, например

(ClientDataSet2.FieldByName('Timestamp') as TDateTimeField).DisplayFormat := 'yyyy/mm/dd hh:mm:ss';

и

(ClientDataSet2.FieldByName('Value') as TBooleanField).DisplayValues := 'On;Off'; 

но я получаю сообщение об ошибке: «Класс исключения EInvalidCast с сообщением« Недопустимый тип класса »».

Любая помощь в этом будет принята с благодарностью.


person Erik    schedule 08.11.2011    source источник
comment
Вы динамически создаете компонент набора данных, который используете для доступа к базе данных, или этот компонент помещается в форму? Если он есть в форме, создайте в нем постоянные поля (щелкните правой кнопкой мыши компонент набора данных, выберите Добавить все поля). Затем вы можете настроить все постоянные поля, включая формат отображения и/или редактирования.   -  person LightBulb    schedule 08.11.2011
comment
компонент набора данных — это компонент, помещенный в форму, но данные извлекаются только во время выполнения через ctQuery, поэтому поля недоступны во время разработки.   -  person Erik    schedule 08.11.2011
comment
Попробуйте этот аналогичный пост: stackoverflow.com/questions/3619835/   -  person Simon    schedule 08.11.2011


Ответы (2)


Итак, я сделал это правильно, выполнив следующие действия (спасибо Simon за то, что указал мне правильное направление):

Сразу после заполнения ClientDataSet я устанавливаю обработчики событий OnGetText:

ClientDataSet2.FieldByName('TimeStamp').OnGetText := TimeStampGetText;
ClientDataSet2.FieldByName('Value').OnGetText := ValueGetText;

И внедрите обработчики событий как новые процедуры:

procedure TTimelineForm.ValueGetText( Sender : TField; var Text : string; DisplayText : Boolean );
begin
    if Sender.AsInteger = 0 then
        Text := 'OFF'
    else
        Text := 'ON';
end;

procedure TTimelineForm.TimeStampGetText( Sender : TField; var Text : string; DisplayText : Boolean );
    var
        DateTime : TDateTime;
    begin
        Text := FormatDateTime( 'yyyy/mm/dd hh:mm:ss', Sender.AsDateTime );
    end;
person Erik    schedule 09.11.2011

Добавьте точку останова и оцените (Ctrl+F7) правильное имя класса с помощью: ClientDataSet2.FieldByName('Value').ClassName

И замените недопустимые имена классов соответствующими именами классов.

person Arjen van der Spek    schedule 08.11.2011