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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2016, 12:56   #1
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию procedure c N параметрами

хочу написать процедуру для фильтрации по N полям
вопрос собственно в том можно ли в TStringList как нибудь поля передать параметрами
или это массивом только сделать можно?
Код:
Procedure FilterRecords(var Qry:TADOQuery; const StrArray: array of string );
...........
Procedure FilterRecords(var Qry:TADOQuery; StrLis:TStringList );
...................
.................
FilterRecords(ADOQuery1, Edit1.TExt,Edit2.TExt,Edit3.TExt );
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 12.05.2016, 13:26   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не очень понял вопрос...
Цитата:
Код:
Procedure FilterRecords(var Qry:TADOQuery; const StrArray: array of string );
так можно.

Цитата:
Код:
Procedure FilterRecords(var Qry:TADOQuery; StrLis:TStringList );
и так можно.


последний случай ( ( Edit1.TExt,Edit2.TExt,Edit3.TExt ) ) - так не универсально и не масштабируемо.

В чём вопрос? Как содержимое ваших Edit'ов в TStringList засунуть?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2016, 14:19   #3
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

последний случай это то как я представляю вызов процедуры.
при таком объявлении
Код:
Procedure FilterRecords(var Qry:TADOQuery; const StrArray: array of string );
как будет выглядеть при таком если мне нужно передавать N строк
или как правильно объявить лист
Код:
Procedure FilterRecords(var Qry:TADOQuery; StrLis:TStringList );
ИМХО с StringList работать удобней чем с массивом.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

В чём вопрос? Как содержимое ваших Edit'ов в TStringList засунуть?
именно в этом
только не в таком варианте
Код:
StringList.ADD(Edit1);
StringList.ADD(Edit2);
.........................
FilterRecords(ADOQuery1, StringList );
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 12.05.2016 в 14:22.
Dvoishnik вне форума Ответить с цитированием
Старый 12.05.2016, 14:27   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
как будет выглядеть при таком если мне нужно передавать N строк
объявление
Код:
procedure FilterRecords(ADO: TADOQuery; const filters: array of string);
и использование
Код:
FilterRecords(ADOQuery1, [ Edit1.TExt, Edit2.TExt, Edit3.TExt ] );

FilterRecords(ADOQuery1, [ Edit1.TExt] );

FilterRecords(ADOQuery1, [ Edit1.TExt, Edit2.TExt, Edit3.TExt, Edit5.Text ] );
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.05.2016, 14:32   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
StringList.ADD(Edit1);
Это что? Засунуть в стринглист данные из кучи эдитов можно и в цикле, перебирая эдиты, напрbмер, в Controls. На всякий случай - массив можно и так параметром передавать
Код:
[Edit1.Text,Edit2.Text,Edit3.Text,Edit4.Text]
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.05.2016, 14:41   #6
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

я видно совсем не ясно выражаюсь.

1) как передать в массив я понял, спасибо.
2) хочу понять как объявить и передать передать в стринглист.

сделал так с массивом
Код:
Procedure FilterRecords(var Qry:TADOQuery; const StrArray1: array of string; const StrArray2: array of string );
var I : byte;
Begin
 With Qry do
 Begin
  Filtered:= false;
  Filter:='';
  for I := Low(StrArray2) to High(StrArray2) do
  begin
  if  StrArray2[i]<>'' then
    if Filter = '' then
      Filter:=StrArray1[i]+' LIKE '+#39+StrArray2[i]+'%' + #39
      else
        Filter:=Filter+' AND '+StrArray1[i]+' LIKE '+#39 + StrArray2[i]+'%' + #39;
  end;
  if Filter='' then Filtered:= false
    else Filtered:=True;
 end;
end;


.............
procedure TForm1.Edit1Change(Sender: TObject);
Begin
 FilterRecords(DataModule2.QryProdTov, ['articul.art','razmer'], [Edit1.Text,Edit3.Text] );
end;
procedure TForm3.Edit1Change(Sender: TObject);
Begin
 FilterRecords(DataModule2.QryProdTov, ['articul.art','razmer'], [Edit1.Text,Edit3.Text] );
end;
хотелось тоже самое с TStringList
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 12.05.2016 в 15:18.
Dvoishnik вне форума Ответить с цитированием
Старый 12.05.2016, 15:22   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

массив будет в данном случае удобнее.

насчёт TStringList.
а чем Вас не устроил вариант с StringList.Add(); ?

ну, попробуйте так:
Код:
StringList.Text := Edit1.Text+#13#10+Edit2.Text+#13#10+Edit3.Text ....+#13#10 + EditXX.Text;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2016, 15:27   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
r:=TStringList.Create;
try
r.Delimiter:=';';
r.CommaText:=QuotedStr(Edit3.Text)+';' +QuotedStr(Edit7.Text);

if Edit2.Text<>'' then r.Add(Edit2.Text);

r.Add(Edit1.Text);
r.Add(Edit5.Text);

FilterRecords(ADOQuery1, r);
finally
r.Free;
end;

Код:
procedure FilterRecords(ADO: TADOQuery; const comfilter: string; delimiter: char =';' );
var
  r: TStringList;
begin
  r:=TstringList.Create;
  try
  r.Delimiter:=delimiter;
  r.DelimiterText:=comfilter;

  ....
  finally
  r.Free;
  end;  
end;
Код:
var
  s: string;
const
  dlm: char ='|';

s:=QuotedStr(Edit1.Text) +dlm 
 + QuotedStr(Edit3.Text) +dlm 
 + QuotedStr(Edit7.Text);
FilterRecords(ADOQuery1, s, dlm );
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.05.2016, 15:28   #9
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

дополнительных переменных не хочется
я так понимаю передать в TStringList данные также как в массив не получиться?
значит остановимся на массиве и не будем страдать ерундой.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
массив будет в данном случае удобнее.
понял не буду как говориться "мучить попу")
Всем спасибо за помощь.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 16.05.2016, 12:22   #10
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Захотелось расширить выше указанную процедуру и понял что я маловато знаю в самом начале пути
Код:
//объявление процедуры
Procedure FilterRecords(var Qry:TDataSet; const ArrayNameFild: array of string; const ArrayValueFild: array of string);
................
//вызов 
dd:TDAtaSet;
begin
dd:=ADOTable1;
FilterRecords(dd, ['fio'],['Пупкин Иван петрович']);
вопрос собственно такой можно ли избежать промежуточной переменной??

и сразу в нагрузку вообще как работает свойство Filter?
а именно:
оно создает запрос и делает выборку из базы?
или работает с текущем набором данных?
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Procedure gandi-04 SQL, базы данных 2 06.11.2013 01:57
программа с типизированными параметрами-значениями и параметрами-переменными Kira09 Паскаль, Turbo Pascal, PascalABC.NET 1 20.12.2010 22:23
Procedure ALABAMA Паскаль, Turbo Pascal, PascalABC.NET 3 20.05.2010 21:06
procedure! please! help! NeAlSe Помощь студентам 2 15.06.2008 15:38