Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

работа с DBGrid ом   Найти похожие ветки 

 
Kinda ©   (2006-07-04 09:31) [0]

Необходимо в реал-тайме задать формат полей
в отображаемых в DBGride.
Например для даты установить формат dd/mm/yyyy hh:mm,
а для чисел 0,00.
Проблема заключается в том, что свойство DisplayFormat есть не у каждого типа поля, например у string его нету, с связи с этим задать формат поля таким образом не удается:
Datam.IbQ1.FieldByName["DATE"].DisplayFormat:="dd/mm/yyyy hh:mm".
Буду благодарен за помощь.


 
Ega23 ©   (2006-07-04 09:36) [1]

На уровне запроса?


 
ЮЮ ©   (2006-07-04 09:39) [2]

например у string его нету, с связи с этим задать формат поля таким образом не удается:

А что  FieldByName["DATE"] строкового типа?


 
Kinda ©   (2006-07-04 09:42) [3]

>> Ega23 ©   (04.07.06 09:36) [1]
>> На уровне запроса?

Короче говоря в гриде отображено то что
выбрано из базы обычным select * from table where ....

Так вот среди выбранных полей есть даты, числа и т.д.
Необходимо чтобы даты отображались так, как захочет юзерь,
например dd/mm/yyyy hh:ss вместо стандартного dd/mm/yyyy hh:mm:ss
для типа поля TimeStamp.

Тоже касается и полей типа DoublePrecision.


 
Ega23 ©   (2006-07-04 09:43) [4]


> Короче говоря в гриде отображено то что
> выбрано из базы обычным select * from table where ....


Я обычно не "обычный Select * " делаю. Рекомендую подумать в этом направлении.


 
Kinda ©   (2006-07-04 09:48) [5]

>> Я обычно не "обычный Select * " делаю. Рекомендую подумать в этом
>> направлении.

Например? Просто у меня SQL для запроса пишется руками
в реал-тайме, и какой он будет заранее не известно.


 
Vlad ©   (2006-07-04 09:56) [6]


> Kinda ©   (04.07.06 09:31)  


> свойство DisplayFormat есть не у каждого типа поля


зато у всех полей есть событие OnGetText, а также существуют функции FormatFloat, FormatDateTime и т.п.


 
Kinda ©   (2006-07-04 10:01) [7]

>> Vlad ©   (04.07.06 09:56) [6]

Спасибо, щас попробую так.


 
ЮЮ ©   (2006-07-04 10:27) [8]

Даты, по-моему выводятся использую ShortDateFormat. Попробуй измени её в приложении


 
Kinda ©   (2006-07-04 10:38) [9]

>> Vlad ©   (04.07.06 09:56) [6]
Запутался чуток, если не трудно
кусок кода напиши.


 
Desdechado ©   (2006-07-04 10:49) [10]

> свойство DisplayFormat есть не у каждого типа поля, например у string его нету
> для типа поля TimeStamp
> Тоже касается и полей типа DoublePrecision.
И где тебе для стринга понадобилось форматирование, если у тебя даты и числа?
И ЮЮ ©   (04.07.06 09:39) [2] осталось безответным.


 
Ega23 ©   (2006-07-04 10:55) [11]

Ещё раз рекомендую взглянуть в сторону SQL:

Select Now=Convert(varchar(10),getdate(), 104)


 
Kinda ©   (2006-07-04 10:55) [12]

>> Desdechado ©   (04.07.06 10:49) [10]

мне для стринга ненужно форматирование,
нужно для дат и чисел.

Так сделать не выходит:
Datam.IbQ1.FieldByName["DATE"].DisplayFormat:="dd/mm/yyyy hh:mm".

Ошибка, я так понимаю, возникает из-за того, что заранее компилятору неизвестно является ли DATE датой, а это свойство есть только у дат и чисел.


 
Desdechado ©   (2006-07-04 11:06) [13]

> заранее компилятору неизвестно является ли DATE датой
Компилятор тут ни при чем. У поля есть свойство DataType, в котором всегда можно определить, какой тип данных. И в зависимости от этого присваивать или нет строку формата.


 
Vlad ©   (2006-07-04 11:09) [14]


> Kinda ©   (04.07.06 10:38) [9]
> >> Vlad ©   (04.07.06 09:56) [6]
> Запутался чуток, если не трудно
> кусок кода напиши.


на OnGetText пишешь что-то вроде этого:

case Sender.DataType of
 ftDateTime: Text := FormatDateTime("dd-mm-yy hh:mm:ss", Sender.AsDateTime);
 ftCurrency: Text := FormatFloat("###,##0.00 ðóá", Sender.AsFloat);
 ftFloat: Text := FormatFloat("###,##0.00", Sender.AsFloat);
else Text := Sender.AsString;
end;


и цепляешь эту процедуру ко всем полям


 
Kinda ©   (2006-07-04 11:47) [15]

>>Desdechado ©  
>> Компилятор тут ни при чем.

Ошибка возникает во время компиляции...
Но идея понятна попробую как ты сказал.

>>Vlad ©   (04.07.06 11:09) [14]

Спасибо, практически тоже что и
>>Desdechado ©   (04.07.06 11:06) [13] предложил, только вид сбоку.

Сейчас поэкспериментирую, думаю что вопрос решен будет.


 
sniknik ©   (2006-07-04 12:34) [16]

> Так сделать не выходит:
> Datam.IbQ1.FieldByName["DATE"].DisplayFormat:="dd/mm/yyyy hh:mm".

> Ошибка, я так понимаю, возникает из-за того, что заранее компилятору неизвестно является ли DATE датой, а это
> свойство есть только у дат и чисел.

а тебе это известно? наверняка? ну так поясни это компилятору...
(Datam.IbQ1.FieldByName["DATE"] as TDateTimeField):="dd/mm/yyyy hh:mm";


 
sniknik ©   (2006-07-04 12:40) [17]

;) самле главное (DisplayFormat)  то и пропустил... ну неважно, понятно в общем.


 
Kinda ©   (2006-07-04 13:00) [18]


> а тебе это известно? наверняка? ну так поясни это компилятору.
> ..
> (Datam.IbQ1.FieldByName["DATE"] as TDateTimeField):="dd/mm/yyyy
> hh:mm";


хитро :))


 
Kinda ©   (2006-07-04 13:04) [19]


> sniknik ©   (04.07.06 12:34) [16]


Короче понятно что нужно устраивать проверки типа поля,
и последующий DisplayFormat
в противном случае теряется смысл делать
поля динамическими, можно с таким успехом все в design-time установить


 
Vlad ©   (2006-07-04 13:16) [20]


> Короче понятно что нужно устраивать проверки типа поля,
> и последующий DisplayFormat


ты ж вроде говорил что тебя string поле интересует?

> свойство DisplayFormat есть не у каждого типа поля, например
> у string его нету

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


 
Kinda ©   (2006-07-04 13:39) [21]


> Vlad ©   (04.07.06 13:16) [20]



> ты ж вроде говорил что тебя string поле интересует?


Нет у меня задача такова:
Есть Грид, отображающий данные произвольного SQL запроса,
есть окно настроек, в котором можно указать как будут отображаться
ЛЮБЫЕ поля содержащие даты, числа и т.д.

После выполнение запроса нужно ВСЕ настройки применить к полям
отображаемым в гриде.

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


 
Vlad ©   (2006-07-04 14:04) [22]


> Kinda ©   (04.07.06 13:39) [21]


> только неясно как полям OnGetText динамически назначать.


Все просто.

TForm1 = class(TForm)
....
 private
....
   procedure DisplayMyText(Sender: TField; var Text: String; DisplayText: Boolean);
 ....  
 public
   { Public declarations }
 end;

........

{пишем процедуру, которая будет являться обработчиком OnGetText всех полей}
procedure TForm1.DisplayMyText(Sender: TField; var Text: String;
 DisplayText: Boolean);
begin
 case Sender.DataType of
   ftDateTime: Text := FormatDateTime(...);
   ftCurrency: Text := FormatFloat(...);
   ftFloat: Text := FormatFloat(...);
   ftString: Text := ....;
 else
   Text := Sender.AsString;
 end;
end;

{на событие AfterOpen твоего Query вешаем такой обработчик}
procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
var
 i: integer;
begin
 for i := 0 to Query1.FieldCount - 1 do
 begin
   Query1.Fields[i].OnGetText := DisplayMyText;
 end;
end;


 
Kinda ©   (2006-07-04 14:12) [23]


> Vlad ©   (04.07.06 14:04) [22]

Огромнейшее спасибо, дай Бог тебе здоровья. :)



Страницы: 1 вся ветка

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.027 c
3-1147931584
KinnOk
2006-05-18 09:53
2006.07.23
Сохранение или отмена изменений


2-1151117256
learner
2006-06-24 06:47
2006.07.23
Сообщение в нить, созданной CreateThread


15-1148887793
GM
2006-05-29 11:29
2006.07.23
Геннетичеси модифицированные продукты


2-1151850216
Yaro
2006-07-02 18:23
2006.07.23
вызвать property класса-родителя


2-1152013136
Urvin
2006-07-04 15:38
2006.07.23
Как ограничить количество записей