Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Требуется в гриде отобразить строку,а не зн-е поля, Свое отображение в Grid'e 
:(
    Опции темы
AlexV1
Дата 12.2.2003, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.1.2003

Репутация: нет
Всего: нет



В одной из колонок грида отображается целочисленное поле, зн-е которого 1,2 или 3
Требуется в гриде отобразить:
'один', если зн-е поля = 1
'два', если зн-е поля = 2
'три', если зн-е поля = 3

Если создавать объекты-поля, то у них есть событие OnGetText, где все это можно сделать без проблем.
Хочу это сделать без использования объектов-полей компонента TTable.
Я так думаю, нужно покрутить TDBGrid, но ничего не получается.
PM MAIL   Вверх
Medved
Дата 12.2.2003, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Обрабатывай событие OnDrawColumnCell


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Medved
Дата 13.2.2003, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Вот линк, если не разберетесь, то спрашивайте, Вам всегда ответят.

http://forum.vingrad.ru/index.php?act=ST&f...ndrawcolumncell


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Medved
Дата 13.2.2003, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Код

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
   if Field.FieldName = MyField'
       then begin
           Case  (Field as TStringField).Value of
                 1: begin
                           Field.Text := 'Один';
                     end;
                 2: begin
                           Field.Text := 'Два';
                     end;
                 3: begin
                           Field.Text := 'Три';
                     end;
            end;
       (Sender as TDBGrid).Canvas.TextOut(Rect.Left, Rect.Top, Field.AsString);
   end;
end;



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
AlexV1
Дата 14.2.2003, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.1.2003

Репутация: нет
Всего: нет



Спасибо
PM MAIL   Вверх
AlexV1
Дата 18.2.2003, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.1.2003

Репутация: нет
Всего: нет



Хотя вот здесь

Case (Field as TStringField).value of

выдает ошибку: Ordinal type required

Поле Field числовое целого типа
PM MAIL   Вверх
SmaLL
Дата 18.2.2003, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 557
Регистрация: 17.12.2002
Где: Voronezh

Репутация: 1
Всего: 2



Цитата(AlexV1 @ 18.2.2003, 12:14)
Хотя вот здесь

Case (Field as TStringField).value of

выдает ошибку: Ordinal type required

Поле Field числовое целого типа


Правильно пишет - свойство Value у TStringField типа String, а в CASE надо использовать числительное, Например не Value, а AsInteger.

А также, мне кажется, что приведение к типу TStringField не требуется, т.к. у TField есть нужные свойства. Например можно написать так:
Код

Case Field.AsInteger of
...



--------------------
Что ни делается - всЁ к лучшему! SmallWeb
Мой адрес не дом и не улица, мой адрес родной пивзавод!
PM MAIL WWW ICQ   Вверх
AlexV1
Дата 18.2.2003, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.1.2003

Репутация: нет
Всего: нет



Заменил на

Case Field.AsInteger of

Компилируется, запускается
Но видимо в строке Field.Text := 'Два';
выдало ошибку
'Два' is not a valid integer value for field 'col_gr'
PM MAIL   Вверх
SmaLL
Дата 18.2.2003, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 557
Регистрация: 17.12.2002
Где: Voronezh

Репутация: 1
Всего: 2



Цитата(AlexV1 @ 12.2.2003, 13:47)

Если создавать объекты-поля, то у них есть событие OnGetText, где все это можно сделать без проблем.
Хочу это сделать без использования объектов-полей компонента TTable.

Как я уже писал про DBComboBox попробуй ручками, вот так:
в обработчике события OnAfterOpen компонента TTable

Код
Table1.FieldByName('<имя поля>').OnGetText:= GetTextHandler;

А в свой класс добавляешь метод:
procedure GetTextHandler(Sender: TField; var Text: String; DisplayText: Boolean);


--------------------
Что ни делается - всЁ к лучшему! SmallWeb
Мой адрес не дом и не улица, мой адрес родной пивзавод!
PM MAIL WWW ICQ   Вверх
Medved
Дата 18.2.2003, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Да SmaLL, так можно сделать, но это не желательно в некоторых случаях, когда такие "преобразования" требуются осуществить только для отображения данных (т.е. только в TDBGrid), а сам набор данных, оставить без изменений. Для этого как раз то и существует "обработка" в TDBGrid. Причем именно этот способ, и является более близким к хорошему стилю программирования, чем тот, который предложен тобой. Хотя конечно все зависит от поставленной задачи.

Хочу извиниться перед AlexV1, так как я ему с самого начала дал не рабочий код. У меня не дошли руки его проверить.

Я чуть попозже (сегодня) выложу нормальный рабочий код, просто сейчас со всеми версиями Delphi, что у меня установлены, происходит что-то странное, как разберусь, сразу же отвечу на этот вопрос.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Medved
Дата 18.2.2003, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Все, вот готовый код. Он рабочий, я проверял.

Код

 With DBGrid1.Canvas do begin
     if (Column.Field.FieldName = 'Name') and not (gdFocused in State) then begin
             FillRect(Rect);

             CASE Column.Field.Value of
                  1: begin
                           TextOut(Rect.Left+2, Rect.Top+2, 'Один');
                       end;

                  2: begin
                           TextOut(Rect.Left+2, Rect.Top+2, 'Два');
                       end;

                  3: begin
                           TextOut(Rect.Left+2, Rect.Top+2, 'Три');
                       end;
                 else begin
                           TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text);
                 end;
              end;
      end;
 end;



P.S. Да, еще, чуть не забыл, этот обработчик "вешается" на событие OnDrawColumnCell


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
AlexV1
Дата 19.2.2003, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.1.2003

Репутация: нет
Всего: нет



Большое спасибо, Pegas!
Единственный нюанс:
При перемещении курсора по сетке, если встать на поле, где изображено "Два", то вместо "Два", появится зн-е поля, т.е. 2
PM MAIL   Вверх
Medved
Дата 19.2.2003, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Этот ньюанс называется
Код
and not (gdFocused in State)
Просто убери эту подстроку, и все будет ОК!


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
AlexV1
Дата 20.2.2003, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.1.2003

Репутация: нет
Всего: нет



Спасибо, Pegas, все получилось :-)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.