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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2013, 01:01   #1
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию Универсальная процедура

Уважаемые специалисты, вопрос простой, но не знаю как это сделать.
Я сам только начал программировать для упрощения задач на работе.

Есть DataModule на нем расположены AdoConnection и несколько Adoquery и DataSource. На разных формах расположены разные DBgrid.

Есть процедура вынесенная в отдельный unit:

Код:
procedure adoq_2;
var
  adocon: string;
begin

  DM1.ADOQuery2.Connection := DM1.ADOConnection1;
  DM1.ADOQuery2.DisableControls;
  DM1.ADOQuery2.Close;
  DM1.ADOQuery2.SQL.Clear;
  try
    DM1.ADOQuery2.SQL.Text := ' select * from ' + form1.ComboBox1.Text + '';
    DM1.ADOQuery2.Open;
    // Showmessage('Подключается query2 ');
  except
    Showmessage('не Подключается query2 ');
  end;
   DM1.ADOQuery2.EnableControls;
  DM1.ADOQuery2.Active := true;
  Form4.DBGrid1.DataSource := DM1.DataSource2;
  DM1.DataSource2.DataSet := DM1.ADOQuery2;

  Form4.DBGrid1.Columns[0].Title.Caption := 'дата';
  Form4.DBGrid1.Columns[0].Title.Alignment := taCenter;
  Form4.DBGrid1.Options := Form4.DBGrid1.Options - [dgColumnResize];
  Form4.DBGrid1.Columns.Items[0].Width := 65;
  DM1.ADOQuery2.Fields[0].Alignment := taCenter;

 end;
Как это преобразовать в универсальную процедуру, чтобы не переписывать для каждого Query, Combobox и DBgrid, а сделать одну процедуру и писать в переменных, например:
procedure adoq_2 (Adoquery1,Combobox1,Datasource1, DBGrid1)

Спасибо тем, кто поможет
gigar вне форума Ответить с цитированием
Старый 13.02.2013, 04:00   #2
EXTREEM
 
Регистрация: 11.10.2010
Сообщений: 8
По умолчанию

Код:
procedure adoq_2(var Query: TADOQuery; CbBox: TComboBox;
      DSource: TDataSource; Grid: TDBGrid);
А там достаточно просто подставлять нужные компоненты...
Код:
  adoq_2(ADOQuery1, ComboBox1, DataSource1, DBGrid1);
  adoq_2(ADOQuery2, ComboBox2, DataSource2, DBGrid2);
EXTREEM вне форума Ответить с цитированием
Старый 13.02.2013, 07:06   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да. Только var не нужен. Объекты и так по ссылкам передаются.
Код:
procedure adoq_2 (Query: TADOQuery; CbBox: TComboBox; DSource: TDataSource; Grid: TDBGrid);
var
  adocon: string;
begin
  Query.Connection := DM1.ADOConnection1;
  Query.DisableControls;
  Query.Close;
  Query.SQL.Clear;
  try
    Query.SQL.Text := ' select * from ' + CbBox.Text + '';
    Query.Open;
    // Showmessage('Подключается query2 ');
  except
    Showmessage('не Подключается query2 ');
  end;
   Query.EnableControls;
  Query.Active := true;
  Grid.DataSource := DSource;
  DSource.DataSet := Query;

  Grid.Columns[0].Title.Caption := 'дата';
  Grid.Columns[0].Title.Alignment := taCenter;
  Grid.Options := Grid.Options - [dgColumnResize];
  Grid.Columns.Items[0].Width := 65;
  Query.Fields[0].Alignment := taCenter;

 end;
Вызывать так
adoq_2 (DM1.ADOQuery2, form1.ComboBox1, DM1.DataSource2, Form4.DBGrid1);
Sibedir вне форума Ответить с цитированием
Старый 13.02.2013, 10:06   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
//первое что надо сделать это отключить прорисовку во время всех операций
// и включать ее только после ВСЕХ изменений (включая настройку вида Coulumns)
// хотя может потребоваться и ранее у нас же динамическое формирование колонок по открытию НД ?
  DM1.ADOQuery2.DisableControls;
  try 
//изменение коннекта все равно приведет закрытию
  DM1.ADOQuery2.Close;
  DM1.ADOQuery2.Connection := DM1.ADOConnection1;
// SQL.Text:= и так очистит //  DM1.ADOQuery2.SQL.Clear;
//нам от comboBox нужен только текст так и передавать только его const SQLText: string
//  DM1.ADOQuery2.SQL.Text := ' select * from ' + form1.ComboBox1.Text + '';
  DM1.ADOQuery2.SQL.Text := ' select * from ' + SQLText + '';
  DM1.ADOQuery2.Open;

//зачем настраивать что-то чего нет   (except в конец) // Showmessage('Подключается query2 ');
// Active:=true; ==Open :=false ==Close;//   DM1.ADOQuery2.Active := true;

// а что DataSource у грида меняется ??  Form4.DBGrid1.DataSource := DM1.DataSource2;
//                                       DM1.DataSource2.DataSet := DM1.ADOQuery2;
  form4.DbGrid1.Datasource.DataSet:=ADOQuery2; 
// теперь у нас лишний(не востребованый парамер Datasource)

// а если это так (постоянная связь Grid DataSource DataSet ) 
// то и ADOQuery легко вычисляется по form4.DataSource.DataSet
  workQuery:=Form4.Datasource.DataSet as TADOQuery;
//итого два параметра varM(const SQLtext: string; Grid: TDBGrid);

  Form4.DBGrid1.Columns[0].Title.Caption := 'дата';
  Form4.DBGrid1.Columns[0].Title.Alignment := taCenter;
  Form4.DBGrid1.Options := Form4.DBGrid1.Options - [dgColumnResize];
  Form4.DBGrid1.Columns.Items[0].Width := 65;
//  DM1.ADOQuery2.Fields[0].Alignment := taCenter;
  Form4.DBGrid1.Columns[0].field.Alignment:=TaCenter;

вывод лучше ставить там где есть формы (при вызове процедур
//  except
//    Showmessage('не Подключается query2 ');
//  end;
а здесь только гарантию доступности ресурсов отключенных раннее(disabeControls)
  finally
   DM1.ADOQuery2.EnableControls;
  end;
что осталось после исправлений
и соблюдения условия (постоянная связь Grid DataSource DataSet ) заданная изначально вручную

Код:
//итого два параметра 
procedure varM(const SQLtext: string; Grid: TDBGrid);
var
  workq: TADOQuery;
begin
  workQ:=Grid.DataSource.DataSet as TADOQuery;
  workQ.DisableControls;
  try 
  workQ.Close;
  workQ.Connection := DM1.ADOConnection1; //а что один раз при создании DM нельзя подключиться ? (перенести в FormCreate/) 
  workQ.SQL.Text := ' select * from ' + SQLText + '';
  workQ.Open;

  grid.Columns.Columns[0].Title.Caption := 'дата';
  grid.columns.Columns[0].Title.Alignment := taCenter;
  grid.Options := grid.Options - [dgColumnResize]; //тоже зачем делать одно и тоже много раз (при создании форм)
  grid.Columns.Items[0].Width := 65;
  grid.Columns[0].field.Alignment:=TaCenter;

  finally
   DM1.ADOQuery2.EnableControls;
  end;
end;
и даже тут опять лишнее?


Цитата:
вывод лучше ставить там где есть формы (при вызове процедур
Код:
try
  varM(form4.comboBox4.Text, Form4.DBgrid1);
except
  on e: Exception do showmessage(e.message);
end;
А лучший универсализм это одна форма родитель для всех похожих.
Один раз в родителе настраиваем общий вид и общию реакцию на изменения.
В наследниках подстраиваем данные! и реакции!
А может и вовсе нужна только одна форма но во многих экземплярах и с разными экземплярами данных.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.02.2013, 11:03   #5
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию

Спасибо за помощь. Мне подходит вариант Sibedir'а , но delphi ругается на
точку в переменных:
procedure adoq_2 (DM1.ADOQuery2, form1.ComboBox1, DM1.DataSource2, Form4.DBGrid1);
[DCC Error] process.pas(108): E2067 Missing parameter type


После uses я прописал
procedure adoq_2 (Query: TADOQuery; CbBox: TComboBox; DSource: TDataSource; Grid: TDBGrid);

Последний раз редактировалось gigar; 13.02.2013 в 12:11.
gigar вне форума Ответить с цитированием
Старый 13.02.2013, 14:44   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А где вы в моем варианте увидели
Код:
procedure adoq_2 (DM1.ADOQuery2, form1.ComboBox1, DM1.DataSource2, Form4.DBGrid1);
------------------------------------------------------------------------------------------------------------
Цитата:
Мне подходит вариант Sibedir'а
Ну эт, если честно, чести ни вам ни мне не делает. Может прислушаетесь к evg_m.

Последний раз редактировалось Sibedir; 13.02.2013 в 14:55.
Sibedir вне форума Ответить с цитированием
Старый 13.02.2013, 14:48   #7
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию

Огромное спасибо за помощь. Это я ступил с кодом, теперь все работает.
Тему можно закрыть.
gigar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
универсальная загрузка dll Biohazard Общие вопросы Delphi 19 24.10.2012 17:29
универсальная функция jec Общие вопросы C/C++ 5 06.09.2010 02:38
универсальная программа для форумов !!! designer999 Фриланс 1 10.03.2010 21:47
универсальная программа на C++ Xeon332 Помощь студентам 4 27.01.2009 04:07
Универсальная защита Simply-Art Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 04.10.2007 10:02