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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 07:52   #1
brick08
Пользователь
 
Аватар для brick08
 
Регистрация: 29.11.2011
Сообщений: 12
По умолчанию не пишем втоорое подряд - редактируем первое

Доброго времени суток!
На форме есть много TabSheet, и для каждого есть DBGrid. Нужно сделать процедуру, чтобы при переходе с одной вкладки на другую в ДБГриде отображалась соответствующая ему таблица. а на предыдущей вкладке дбгрид очищался. это нужно сделать с помощью одного компонента Table и DataSource. Т.е. при каждом переходе на другую вкладку очищались компоненты Тэйбл и ДатаСоурс. и присваивались новые данные. Попробовал написать вот так
Код:
 procedure TabSheetChange(const DataBaseName1, TableName1:String);
 var table:TTable;
 datasource:TDataSource;
 dbgrid:tDBGrid;
 begin
 if table.State=dsbrowse then table.Close;
Table.DatabaseName:=DataBaseName1;
Table.TableName:=TableName1;
datasource.DataSet:=table;
dbgrid.DataSource:=datasource;
table.Active:=true;
end;
, но выдает ошибку что датасет уже открыт.

BDE Paradox 7

Последний раз редактировалось Speeker; 29.11.2011 в 10:05. Причина: не надо писать в разніх сообщениях!!!
brick08 вне форума Ответить с цитированием
Старый 29.11.2011, 10:06   #2
Speeker
Форумчанин
 
Аватар для Speeker
 
Регистрация: 01.12.2006
Сообщений: 241
По умолчанию

Возможно ты уже открыл базу какой то другой программой
Програмисты - единственные люди, которым платят за исправления их же ошибок
Speeker вне форума Ответить с цитированием
Старый 29.11.2011, 10:27   #3
brick08
Пользователь
 
Аватар для brick08
 
Регистрация: 29.11.2011
Сообщений: 12
По умолчанию

Цитата:
Возможно ты уже открыл базу какой то другой программой
Добавлял строку
Код:
if datasource.DataSet.state=dsbrowse then datasource.DataSet.Close;
выдает ошибку.
Мне кажется что переменные неправильно объявил, может быть из-за этого?
нужно чтобы эта процедура работала в других, например:
Код:
procedure TForm1.TabSheet3Show(Sender: TObject);
begin
 TabSheetChange('C:\bazes','base1.db');

end;
brick08 вне форума Ответить с цитированием
Старый 29.11.2011, 10:38   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Проверяй
Код:
if table.Active then table.Active:=False;
add

и есть в процедуре
Код:
 var table:TTable;
 datasource:TDataSource;
 dbgrid:tDBGrid;
а где они инициализируются?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.11.2011 в 11:19.
Аватар вне форума Ответить с цитированием
Старый 29.11.2011, 11:48   #5
brick08
Пользователь
 
Аватар для brick08
 
Регистрация: 29.11.2011
Сообщений: 12
По умолчанию

Цитата:
а где они инициализируются?
возможно я неправильно их объявил. На Делфи стал писать недавно. И как их правильно объявить не знаю, чтобы при вызове процедуры TabSheetChange действия выполнялись над компонентами Table1, DataSource1 (которые объявлены в типах) и над DBGridом, который находится на текущей вкладке. Поэтому внутри процедуры и создал эти переменные.
brick08 вне форума Ответить с цитированием
Старый 29.11.2011, 12:56   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
а на предыдущей вкладке дбгрид очищался
примерно так
Код:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  case PageControl.TabIndex of
  0: DBGrid1.DataSource:=nil;
  1: DBGrid2.DataSource:=nil;
//и т.д.
  end;
end;
И примерно следующий код для активизации таблицы и отображения данных в указанном гриде
Код:
procedure TForm1.TabSheet3Show(Sender: TObject);
begin
  TabSheetChange('C:\bazes','base1.db',DBGrid3);
end;

procedure TForm1.TabSheetChange(const DataBaseName1, TableName1:String; DBGrid: TDBGrid);
begin
  if Table1.Active then Table1.Active:=False; //или Table1.Close
  Table1.DatabaseName:=DataBaseName1;
  Table1.TableName:=TableName1;
  Table1.Active:=true; //здесь может быть ошибка при открытии таблицы!
  DBGrid.DataSource:=DataSource1;
//предпологается что в DataSource1.DataSet уже в design_time внесено Table1
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.11.2011, 14:38   #7
brick08
Пользователь
 
Аватар для brick08
 
Регистрация: 29.11.2011
Сообщений: 12
По умолчанию

Спасибо, работает. Я уже сам почти добился результата. Только вот про удаление таким способом не догадался. У меня причем не один PageControl, а в одном еще четыре, получается для них нужно удаление писать.
И еще небольшой вопрос, в плане быстродействия, правильно ли я сделал, что каждый раз присваиваю table новую БД, или быстрее бы было когда отдельной БД присвоен свой компонент Table и они бы одновременно отображались? Впоследствии предполагаются БД с несколькими тысячами строк.
brick08 вне форума Ответить с цитированием
Старый 29.11.2011, 15:00   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Чем больше открытых Table, тем больше памяти съест и дольше программа будет инициализироваться при открытии всех таблиц. Но потом будет быстрей работать (если памяти хватит, вдруг у вас их тысяча и в каждой по несколько тысяч строк). Выбирайте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт из дбгрида в эксель Ake Общие вопросы Delphi 4 24.12.2010 22:51
Заголовки столбцов ДБГрида из чисел календаря qwertytol БД в Delphi 2 28.10.2010 10:07
из дбэдита в конкретный столбец Дбгрида? Милана666 БД в Delphi 4 25.05.2010 08:10
Как сделать,так что бы запись в из одного ДБГрида добавлялась в другой ДБгрид Hito БД в Delphi 10 19.04.2009 21:14
Отображение скрытых файлов и папок и отображение розширения всех файлов beegl Общие вопросы Delphi 10 14.12.2008 22:02