Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

работа с DBGrid'ом


Страницы:   1 2

Kinda ©   (2006-07-04 09:31:00) 

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


Kinda   (2006-07-04 14:12:00) [1]


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

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


Vlad   (2006-07-04 14:04:00) [2]


> 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 13:39:00) [3]


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



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


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

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

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


Vlad   (2006-07-04 13:16:00) [4]


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


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

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

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


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


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


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


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


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


хитро :))


sniknik   (2006-07-04 12:40:00) [7]

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


sniknik   (2006-07-04 12:34:00) [8]

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

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

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


Kinda   (2006-07-04 11:47:00) [9]

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

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

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

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

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


Vlad   (2006-07-04 11:09:00) [10]


> 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;


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


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

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


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

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

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

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

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


Ega23   (2006-07-04 10:55:00) [13]

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

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


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

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


Kinda   (2006-07-04 10:38:00) [15]

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


ЮЮ   (2006-07-04 10:27:00) [16]

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


Kinda   (2006-07-04 10:01:00) [17]

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

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


Vlad   (2006-07-04 09:56:00) [18]


> Kinda ©   (04.07.06 09:31)  


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


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


Kinda   (2006-07-04 09:48:00) [19]

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

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


Ega23   (2006-07-04 09:43:00) [20]


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


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо