![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBGrid [D5, MSSQL]
kirillrepin © (2008-07-07 15:05:00)Подскажите пожалуйста ответ на наверное глупый вопрос.
есть DBGrid и несколько Label, надо чтобы при клике на ячейке дбгрида выделялась строка и лэйбелах отображались содержимое ячеек из этой строки.
заранее благодарен!
Ega23 (2008-07-08 14:08:00) [1]
> не совсем понял. Хотелось бы узнать как Вы без него обходитесь?
> Спасибо.
А я без него никак не обхожусь. Так уж вся эта связка устроена TDataSet -> TDataSource -> TDataLink
Просто его "нужность" в этой связке вызывает некоторые сомнения.
Впрочем это уже тема для совсем другого холивара, не имеющего отношения к сабжу.
BUM (2008-07-08 13:45:00) [2]
> Вообще-то я писал Правильному Васе
Прошу прощения. И спасибо за объяснение. Хотя например
> Есть такая штука, как TDataSource. Нужность данного компонента
> лично у меня вызывает массу вопросов (считаю его лишним)
не совсем понял. Хотелось бы узнать как Вы без него обходитесь? Спасибо.
Василий Жогарев (2008-07-08 13:37:00) [3]
> есть DBGrid и несколько Label, надо чтобы при клике на ячейке
> дбгрида выделялась строка и лэйбелах отображались содержимое
> ячеек из этой строки.
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
Label1.Caption := ADOQuery1IdStreet.AsString;
Label2.Caption := ADOQuery1Street.Value;
end;
Ega23 (2008-07-08 13:30:00) [4]
> Интересно, это я нить обсуждения потерял или Вы?
А Вы не понимаете, о чём идёт речь?
Вообще-то я писал Правильному Васе, но раз Вы не понимаете, то объясняю:
1. Как известно, в DBGrid (DBEdit, DBLabel, DBLookupCombo и т.п.) нет никаких данных. Данные есть в "наборе данных" - в каком-то потомке TDataSet.
2. Есть такая штука, как TDataSource. Нужность данного компонента лично у меня вызывает массу вопросов (считаю его лишним), но - тут уж подеваться некуда. У каждого TDataSource есть один TDataSet. С другой стороны, у одного TDataSet может быть много разных TDataSource.
3. Есть такая штука, как TDataLink. Любой DBAware компонент где-то внутри себя (или в private или в protected) имеет DataLink. И именно в DataLink приходят все события от набора данных, такие как:
3.1. ActiveChanged. Генерируется при изменении свойства Active. Т.е. при открытии или закрытии НД.
3.2. DataChanged. Весьма любопытное событие. Генерируется много и часто. В основном при изменении положения курсора НД. Но, например, также генерируется при вызове TDataSet.EnableControls
3.3. Всего их там порядка 7-10. При желании Вы сможете ознакомится с остальными в документации и в исходниках DB.TDataLink
4. Так вот. При вызове метода TDataSet.DisableControls происходит следующее: TDataSet начинает плевать на содержимое списка FListSource (вроде так называется. Лень смотреть. Короче, список всех TDataSource, "смотрящих" на этот НД) и не рассылает им сообщения о том, что с ним (TDataSet) что-то произошло. Т.е. данные в визуальных контролах как-бы "замирают" и перестают обновляться.
5. И они не обновляются, пока не будет вызван метод TDataSet.EnableControls (точнее, каждый раз, когда вызывается метод DisableControls, инкриментируется некий счётчик. При вызове EnableControls - он декриментируется. Если 0 - не изменяется. События пойдут тогда, когда равен 0).
Резюме: если мы хотим, чтобы событие происходило ВСЕГДА - действительно нужно закладываться на TDataSet.AfterScroll.
А вот если тогда, когда надо - тогда на TDataSource.OnDataChange
BUM (2008-07-08 13:10:00) [5]
> А не задумывался, зачем DisableControls придумано? Как раз
> для того, чтобы отключить все визуальные компоненты и не
> тратить время на перерисовку данных.
Интересно, это я нить обсуждения потерял или Вы?
Ega23 (2008-07-08 12:54:00) [6]
> Ну дык AfterScroll в данном случае (DisableControls) и будет
> работать а не OndataChange..
Правильно.
А не задумывался, зачем DisableControls придумано? Как раз для того, чтобы отключить все визуальные компоненты и не тратить время на перерисовку данных.
BUM (2008-07-08 12:48:00) [7]
> Ну как же. А DataSet.Disable|EnableControls ?
Ну дык AfterScroll в данном случае (DisableControls) и будет работать а не OndataChange..
Ega23 (2008-07-08 12:36:00) [8]
> Почему это?
Ну как же. А DataSet.Disable|EnableControls ?
BUM (2008-07-08 12:30:00) [9]
> В данной ситуации я бы на TDataSource.OndataChange закладывался
> бы.
Почему это?
Anatoly Podgoretsky (2008-07-07 16:10:00) [10]> Поросенок Винни-Пух (07.07.2008 16:05:10) [10]
Он же сказал - нельзя, зачет не примут.
Anatoly Podgoretsky (2008-07-07 16:09:00) [11]> Ega23 (07.07.2008 16:03:09) [9]
Не у меня, а у компилятора.
Поросенок Винни-Пух (2008-07-07 16:05:00) [12]Чувак, замени лэйблы на tdbtext
Ega23 (2008-07-07 16:03:00) [13]
> Так не законченые же, я вставлял - компилятор ругается.
Просто у вас проблемы с пониманием основ объектно-ориентированного программирования.. :)
Anatoly Podgoretsky (2008-07-07 15:53:00) [14]
> А ты вообще программировал ранее? Тебе уже 2 варианта предложили.
Так не законченые же, я вставлял - компилятор ругается.
Правильный^Вася (2008-07-07 15:53:00) [15]
> Dataset.AfterScroll
> kirillrepin © (07.07.08 15:20) [2]
> извините не совсем понял ответ?
в обработчике события присваиваешь своим наклейкам содержимое ячеек
Ega23 (2008-07-07 15:47:00) [16]
> Dataset.AfterScroll
В данной ситуации я бы на TDataSource.OndataChange закладывался бы.
Sergey13 (2008-07-07 15:45:00) [17]> [4] kirillrepin © (07.07.08 15:38)
А ты вообще программировал ранее? Тебе уже 2 варианта предложили.
kirillrepin (2008-07-07 15:38:00) [18]а как возможно реализовать так как поставлена задача?
Поросенок Винни-Пух (2008-07-07 15:22:00) [19]TDBText вместо TLabel
kirillrepin (2008-07-07 15:20:00) [20]извините не совсем понял ответ?