![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с DBGrid'ом
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 * " делаю. Рекомендую подумать в этом направлении.