2012-05-29 2 views
0

В нашем приложении Delphi используются привязанные к базе данных TcxGridDBC столбцы, чтобы позволить пользователю манипулировать датой в формате ISO 8601 (YYYY-MM-DD) в виде строки. Я хотел бы предложить конечному пользователю календарный выбор даты.Набор выбора даты ISO 8601 (Delphi, DevExpress)

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

  1. Создать дополнительный столбец даты (TDateTime поля БД) во всех таблицах и преобразовать дату в строку столбца ISO 8601 на событие BeforePost из TDataSet

  2. Создайте собственный класс свойств Tcx ***. Вероятно, это связано с унаследованием от TcxPopupEditProperties.

Поскольку существует множество затронутых таблиц, я бы предпочел использовать # 2. Можете ли вы указать, чтобы помочь мне помочь в этом? Или есть №3?

+1

просил вас [поддержка DevEx] (http://www.devexpress.com/Support/Center/Question/Список/1)? Они очень полезны. –

+0

Спасибо за ваш вклад, и да, они всегда были очень полезными. – gogowitsch

ответ

0

Если вы имеете в виду документы, это о написании пользовательского компонента, вы можете увидеть здесь Creating Custom Delphi Components, а также документ «Руководство для авторов компонентов», который поставляется вместе с Delphi (в нем есть пример о настройке DBGrid и навигации по месяцам, году и дни тоже). Это можно использовать для начальной точки для опции № 2

+0

Я предпочел бы использовать решение DevExpress'ish, поскольку я предполагаю, что это приведет к минимальному количеству строк кода для поддержки. – gogowitsch

0

Существует № 3: нет необходимости в дополнительном столбце, DateEdit понимает строки как в текущем системном формате (в котором смена пользователя записано), так и в формате ISO. В BeforePost я конвертирую системный формат обратно в ISO, который мне нужен в базе данных. В качестве дополнительной роскоши, следующее событие изменяет существующие даты ISO в какой формат даты по умолчанию пользователя:

procedure T_RVVorbereitung.cxGridAnalysisDateGetDataText(
    Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string); 
var 
    ADate         : TDateTime; 
begin 
    try 
    try 
     ADate := TIso8601.DateTimeFromIso8601(AText);   // YYYY-MM-DD 
    except 
     ADate := StrToDate(AText); 
    end; 
    AText := DateToStr(ADate); 
    except 
    // neither system nor ISO date: show as it is 
    end; 
end; 
Смежные вопросы