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

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

как программно переключить DBEdit от 1го ист. данных к другому


Andrey_1 ©   (2003-08-01 10:19:00) 

В DataModule1 содержатся:
Table1 -> DataSource1;
Table2 -> DataSource2;
Table3 -> DataSource3;
На Form1:
DBGrid1,DBGrid2, DBGrid3, DBEdit1, DBEdit2, DBNavigator1
Нужно чтобы
при получении фокуса DBGrid1, DBEdit1, DBEdit2 получали данные из DataSource1;
при получении фокуса DBGrid2, DBEdit1, DBEdit2 получали данные из DataSource2;
при получении фокуса DBGrid3, DBEdit1, DBEdit2 получали данные из DataSource3;

Для этого пишу следующий код и вешаю на OnEnter

procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
DBNavigator1.DataSource:=Datamodule1.DataSource1;
with DBEdit1 do
begin
DataSource:=Datamodule1.DataSource1;
DataField:="Color"; //имя поля1 таблицы1
end;
with DBEdit2 do
begin
Datasource:=DataModule1.DataSource1;
DataField:="Description" //имя поля2 таблицы1
end;
end;

procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
DBNavigator1.DataSource:=Datamodule1.DataSource2;
with DBEdit1 do
begin
DataSource:=Datamodule1.DataSource2;
DataField:="Defect"; //имя поля1 таблицы2
end;
with DBEdit2 do
begin
DataSource:=Datamodule1.DataSource2;
DataField:="Description"; //имя поля2 таблицы2
end;
end;

procedure TForm1.DBGrid3Enter(Sender: TObject);
begin
DBNavigator1.DataSource:=Datamodule1.DataSource3;
with DBEdit1 do
begin
DataSource:=Datamodule1.DataSource3;
DataField:="Model"; //имя поля1 таблицы3
end;
with DBEdit2 do
begin
DataSource:=Datamodule1.DataSource3;
DataField:="Description"; //имя поля2 таблицы3
end;
end;

но при переключении между гридами выдает следующее сообщение

---------------------------
Debugger Exception Notification
---------------------------
Project ProjectExample.exe raised exception class EDatabaseError with message "DBEdit1: Field "Color" not found". Process stopped. Use Step or Run to continue.
---------------------------
OK Help


MsGuns   (2003-08-01 15:27:00) [1]

>Zacho © (01.08.03 13:54)
>Так дело в том, что там не DBGrid, а DBEdit, у которого колонок, естественно, нет.

Читаем еще раз внимательно сабж.
но при переключении между гридами выдает следующее сообщение

По-видимому, именно при обращении к свойствам "переключенного", но не перестроенного по колонкам грида и проистекает этот эксепшн

Кстати, подобная же фигня будет, если попробовать "переключить" указатель на поле у DBEdit`а после смены датасорса или изменения запроса. Вообще все эти смены - замены и источников и НД - от лукавого. Попытка "сделать красиво" там, где надо делать просто и надежно. Ну это ИМХО ессно ;))


Andrey_1   (2003-08-01 15:22:00) [2]

спасибо всем!
ЧЕМ МНОГО ЗНАТЬ - ЛУЧШЕ ПРАВИЛЬНО ДУМАТЬ.


KDS   (2003-08-01 14:40:00) [3]

a код
DataSource:=nil;
DataField:="Color"; //имя поля1 таблицы1
DataSource:=Datamodule1.DataSource1;
выдает
Debugger Exception Notification


Просто подумать надо было...
Ошибка возникает потому что DataField:="Color" заполнено
но при этом DataSource:=nil;
т.е. получается поле для неопределенной таблицы вот и пишет
"DBEdit1: Field "Color" not found"
а наоборот можно: источник определить, а поле - нет!
Порядок присвоения тоже играет роль. И всего то ;-)))
у меня работает
DataField:="";
DataSource:=Datamodule1.DataSourceColor;
DataField:="Color";


Zacho   (2003-08-01 13:54:00) [4]


> MsGuns © (01.08.03 13:49)

Так дело в том, что там не DBGrid, а DBEdit, у которого колонок, естественно, нет.
А для DBGrid"a - действительно ценный совет.


MsGuns   (2003-08-01 13:49:00) [5]

>Zacho © (01.08.03 13:38)

Чтобы не зависеть от капризов винды, железа, начальника, любимой мозоли и т.д. рекомендую всегда при переключениях НД в датасорсе перестраивать коллекции колонок НД.

with Form1.DBGrid1 do
begin
DataSource:=nil;
RebuildColumns;
DataSource:=...;
RebuildColumns;
end;






Zacho   (2003-08-01 13:38:00) [6]


> Andrey_1 (01.08.03 13:31)

Странно.. А у меня работает. Я выслал тебе модуль, если любопытно - посмотри. Только что еще раз проверил - работает, зараза :) Правда у меня D6, но не думаю, что в этом дело.


Andrey_1   (2003-08-01 13:31:00) [7]

у меня работает
DataField:="";
DataSource:=Datamodule1.DataSourceColor;
DataField:="Color";

a код
DataSource:=nil;
DataField:="Color"; //имя поля1 таблицы1
DataSource:=Datamodule1.DataSource1;

выдает
Debugger Exception Notification
---------------------------
Project ProjectExample.exe raised exception class EDatabaseError with message "DBEdit1: Field "Color" not found". Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
но все равно спасибо огрррооомное, выручили.


Zacho   (2003-08-01 11:42:00) [8]

Кстати, рабочие оба варианта: и Zacho © (01.08.03 10:22) и KDS © (01.08.03 11:12)
Так что выбирай по вкусу :-)


Andrey_1   (2003-08-01 11:28:00) [9]

спасибо! потому и спрашиваю, что мыло не работает


KDS   (2003-08-01 11:12:00) [10]

Я же написал уже как... читай почту вот повторяю еще раз:

обнуляй название поля перед каждой сменой DataSource
потому что... сам подумай почему

DataField:="";
DataSource:=Datamodule1.DataSourceColor;
DataField:="Color";


Zacho   (2003-08-01 10:22:00) [11]

Я тебе уже ответил мылом :-) Проверь почту.
Но могу и повторить:
with DBEdit1 do
begin
DataSource:=nil;
DataField:="Color"; //имя поля1 таблицы1
DataSource:=Datamodule1.DataSource1;
end;
и т.д. ...


Наверх

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