Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2008, 14:35   #1
Jenya
Грызун Гранита
Пользователь
 
Аватар для Jenya
 
Регистрация: 25.01.2008
Сообщений: 33
По умолчанию DBGridEh - поле с картинками. (как задать правильное значение)

Доброго времени суток, уважаемые господа Программисты!

Есть у меня таблица, и соответственно DBGridEh. В нём есть возможность отображения картинок. Подставляю в свойство ImageList, поля State нужный TImageList. В нём всего 2 картинки с индексами 0 и 1. Само поле State сделал вычисляемым. И написал такой вот обработчик события:
Код:
procedure TMainForm.MainGridColumns8GetCellParams(Sender: TObject;
  EditMode: Boolean; Params: TColCellParamsEh);
begin
Try
  EditMode := True;
  MainDM.Clients.Edit;
  If MainDM.Clients.FieldByName('Client_ID_New').AsInteger <> 0 then
    MainDM.Clients.FieldByName('State').AsInteger := 0
  else
    MainDM.Clients.FieldByName('State').AsInteger := 1;
  MainDM.Clients.Post;
Except
  MainDM.Clients.Edit;
  MainDM.Clients.FieldByName('State').AsInteger := 1;
  MainDM.Clients.Post;
end;
  EditMode := False;
end;
По сути работает, и даже правильно, НО! Постояно происходит переход из режима редактирования в применение и наоборот, в связи с чем постоянно мерцает экран и т.д.

Когда пробую присвоить к вычисляемому полю значение без Edit(), Post() происходит соответствующая ошибка, мол "таблица не может редактироваться, если не находится в режиме редактирования".

Помогите найти правильное решение, надо-то мало. Просто в той строке, где поле "Client_Id_new" равно null или 0, должна отображаться картинка с индексом 0, если поле заполнено соответствующим индексом, то должна отобразиться картинка с индексом 1. Пожалуйста, если не трудно, опишите процесс поподробнее, ибо с подобными задачами раньше не сталкивался.
Зарание спасибо!
Jenya вне форума Ответить с цитированием
Старый 21.03.2008, 14:46   #2
Jenya
Грызун Гранита
Пользователь
 
Аватар для Jenya
 
Регистрация: 25.01.2008
Сообщений: 33
По умолчанию

Есть у меня информация такого содержания:

Цитата:
Картинка в поле DBGrid
Чтобы показать вместо значения поля картинку, зависящую от значения поля, необходимо сделать следующее: Column[i].ImageList – ImageList с картинками, Column[i].KeyList свойство типа Strings - каждая строка – значение поля, вместо которого будет подставляться картинка из ImageList с соотвествующим индексом; свойствоColumn[i].NotInKeyListIndex должно содержать индекс картинки сопоставляемый значениям поля, которых нет в KeyList (например, это удобно для значения NULL). Список из свойства PickList используется для сопоставления картинкам всплывающих подсказок (для этого необходимо также выставить в TRUE свойства Column.Tooltips и DBGridEh.ShowHint).

Код:
  With column[xxx] do begin
    ImageList := Self.ImageList;
    //табличка преобразований значения поля в картинку
    KeyList.Add('Петров');
    KeyList.Add('Иванов');
    KeyList.Add('Семенов');
    NotInKeyListIndex := 3; //для других значений поля
    DblClickNextval := TRUE; //циклическая смена значения в поле по двойному клику мышки
    //хинты к картинкам
    PickList.Add('Это фото Петрова');
    PickList.Add('Это фото Иванова');
    PickList.Add('Это фото Семенова');
    Tooltips := TRUE;
  End;
Но чесно говоря, не могу полноценно полнять её смысл, и применить к своей задачи
Jenya вне форума Ответить с цитированием
Старый 21.03.2008, 16:01   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Почитайте о вычисляемых полях, в особенности - где рекомендуется делать собственно вычисление (непонятно, зачем делать эдит/пост, если поле у вас действительно вычисляемое???).
Соответственно, ваш код избавится, наконец, от циклических вызовов самого себя и. как следствие - исчезнет мерцание...
(Вы уж, бога ради, хотя бы в события перерисовки не вводите эдит/пост)
mihali4 вне форума Ответить с цитированием
Старый 23.03.2008, 06:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

mihali4 +1 Полностью согласен!!
в принципе, уже можно было бы и промолчать, но хочу кое-что разжевать и кое-что добавить...
1) для вычисляемых полей - в датасете есть событие OnCalcFields
в него пишете код без всяких пост/едит!
Код:
procedure TFORM1.ClientsCalcFields(DataSet: TDataSet);
begin
  If DataSet.FieldByName('Client_ID_New').AsInteger <> 0 then
    DataSet.FieldByName('State').AsInteger := 0
  else
    DataSet.FieldByName('State').AsInteger := 1;
всё. имхо даже try...except не нужен!

2) вычисляемые поля подобного рода иногда очень удобно сделать невычисляемыми - точнее получать их прямо в SQL запросе. Например, можно добавить в SELECT:
select
<тут ваши поля>,
case Client_ID_New when 0 then 1
else 0 end as Calc_STATE
FROM ....
поле CALC_STATE и будет Ваше STATE (в запросе я другое имя дал просто для примера - может быть и STATE)

Последний раз редактировалось Serge_Bliznykov; 23.03.2008 в 07:12. Причина: забыл, что процедуру onCalcFields передаётся датасет, исправил код...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2008, 06:26   #5
Jenya
Грызун Гранита
Пользователь
 
Аватар для Jenya
 
Регистрация: 25.01.2008
Сообщений: 33
По умолчанию

Читая Ваши посты, в очередной раз убедился что я пытался сделать глупость=) Сам над собой посмеялся.

2 Serge_Bliznykov: Большое Вам спасибо за объяснение, все действительно очень просто. В следующий раз попытаюсь в два раза больше подумать и в два раза больше книг прочесть, прежде чем постить на форуме
Jenya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присвоить значение поле в DBGrid'e компоненту DBLookupComboBox2 фЁдОр БД в Delphi 14 07.09.2012 14:26
проблема с картинками sava28 HTML и CSS 3 05.08.2008 16:23
бд с картинками TaTT DoGG БД в Delphi 3 28.04.2008 08:21
Вопрос про правильное написание функции AndreichSB Microsoft Office Excel 6 25.12.2006 19:27
Работа с картинками в Delphi Alar Общие вопросы Delphi 0 29.10.2006 21:21