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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2013, 22:05   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Я это предлагал, множество для того, что бы не сравнивать символьные строки
Код:
  for i:=0 to Count-1 do begin
    Data:=Items[i];
    if (not (myParm1 in xMyParams) or (Pos(TLStr(aFindData.Genealogy), TLStr(Data.Genealogy)) > 0)) and
       (not (myParm2 in xMyParams) or (Pos(TLStr(aFindData.OwnerAddress), TLStr(Data.OwnerAddress)) > 0)) and
...
Просто, лаконично, понятно, работоспособно, производительно
Это-ли не то, что надо?
Sibedir вне форума Ответить с цитированием
Старый 03.02.2013, 23:05   #12
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Осуществляется поиск не конкретной записи, а записей в полях которых есть искомый текст.
Чтобы найти конкретную запись, достаточно полностью заполнить уникальное поле(там таких минимум 2).

Если нужно 100% совпадение то я узнаю сколько параметров ищет пользователь(тут уже от перечисляемых типов необойтись), а в конце просто проверю условие "Сколько должны найти == сколько нашли".

Но я все же не понимаю конструкции и логики этого кода:
Код:
If (not (myParm1 in xMyParams) or (Pos(TLStr(aFindData.Genealogy), TLStr(Data.Genealogy)) > 0)) ..
Осторожно, возможен взрыв мозга:
Если ((ИскатьМеня1 нету в ПараметрыПоиска) ИЛИ (СловоX есть в строкеY))

Где логика? Если юзер указал не искать ИскатьМеня1, зачем лишний раз делать поиск в строке?
Человек_Борща вне форума Ответить с цитированием
Старый 03.02.2013, 23:14   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Взрыва мозга не произошло
Если not (myParm1 in xMyParams) вернет True, то (Pos(TLStr(aFindData.Genealogy), TLStr(Data.Genealogy)) > 0) выполнятся не будет
Хотя, наверное, лучше так
Код:
If ((myParm1 in xMyParams) and (Pos(TLStr(aFindData.Genealogy), TLStr(Data.Genealogy)) > 0)) ..
Но и тут можно ошибиться. Нужно смотреть ASM код этой строки, чтобы лучше понять
Sibedir вне форума Ответить с цитированием
Старый 03.02.2013, 23:20   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Разбираем по полочкам:
В любой строке сначала проверется not (myParmX in xMyParams). Если True - то этот параметр не задан и не надо проверять, то что после or. Оно и не будет проверяться в этом случае. Если же False - этот параметр задан и проверится то, что после or. В результате True всей строки - или параметр не задан или задан и значение то, что ищется. Иначе False и дальнейшие строки уже не будут проверяться.

На будущее

Выражение1 and Выражение2 - вычисление выражений слева направо, если Выражение1=False, то дальше вычисления не производятся и весь резулт False
Выражение1 or Выражение2 - вычисление выражений слева направо, если Выражение1=True, то дальше вычисления не производятся и весь резулт True

АДД

Если поиск не по всем заданным, а хотя бы по одному из заданных, то условия можно переделать так

Код:
    if ((myParm1 in xMyParams) and (Pos(TLStr(aFindData.Genealogy), TLStr(Data.Genealogy)) > 0)) or
       ((myParm2 in xMyParams) and (Pos(TLStr(aFindData.OwnerAddress), TLStr(Data.OwnerAddress)) > 0)) or
...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.02.2013 в 00:15.
Аватар вне форума Ответить с цитированием
Старый 04.02.2013, 22:48   #15
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Аватар,
Цитата:
Выражение1 and Выражение2 - вычисление выражений слева направо, если Выражение1=False, то дальше вычисления не производятся и весь резулт False
Выражение1 or Выражение2 - вычисление выражений слева направо, если Выражение1=True, то дальше вычисления не производятся и весь резулт True
Об этом не знал. Благодарю.

Цитата:
Просто, лаконично, понятно, работоспособно, производительно
Это-ли не то, что надо?
Ну вроде красиво, но форматтер знает своё дело.

Все хорошо. Но читабельность получает оценку: -1000 по 10 бальной шкале.

1. Кто знает, как отключить форматирование код в заданном блоке текста(регионе)?
2. У меня есть Перечисляемый тип TMyTypeSet = (myP1, myP2,...); и TMyType = set of TMyTypeSet;
как ещё можно вставлять параметры кроме как вот так?:
Код:
  if OwnerEditChk.Checked then
  begin
    fData.FindData := fData.FindData + [fdOwnerName];
    fData.OwnerName := OwnerEdit.Text;
  end;
Человек_Борща вне форума Ответить с цитированием
Старый 04.02.2013, 23:03   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Обработчик один на все чекбоксы, в TAG-и заранее раставить Integer-эквивалент TMyTypeSet. fData.OwnerName можно всем огульно присвоить независимо от состоянии чекбокса
Код:
procedure TForm1.CheckBoxClick(Sender: TObject);
begin
  if TCheckBox(Sender).Checked
    then fData.FindData:=fData.FindData+[TMyTypeSet(TCheckBox(Sender).Tag)]
    else fData.FindData:=fData.FindData-[TMyTypeSet(TCheckBox(Sender).Tag)];
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.02.2013, 05:00   #17
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Все хорошо. Но читабельность получает оценку: -1000 по 10 бальной шкале.
Каму как. По мне так оценка 8.
А если
Код:
  if (not (myParmSGT   in xMyParams) or
             (Pos(TLStr(aFindData.DataSGT  ), TLStr(Data.DataSGT  )) > 0)) and
     (not (myParmFDERM in xMyParams) or
             (Pos(TLStr(aFindData.DataFDERM), TLStr(Data.DataFDERM)) > 0)) and
     (not (myParmSD    in xMyParams) or
             (Pos(TLStr(aFindData.DataSD   ), TLStr(Data.DataSD   )) > 0)) and
...
, то будет твердая 9.


--------------------------------------------------------------------------------------------------------
Цитата:
TMyTypeSet = (myP1, myP2,...); и TMyType = set of TMyTypeSet;
Обычно делают наоборот
Код:
TMyType = (myP1, myP2,...);
TMyTypeSet = set of TMyType;

--------------------------------------------------------------------------------------------------------
Цитата:
как ещё можно вставлять параметры кроме как вот так?:
Код:
Код:
  if OwnerEditChk.Checked then
  begin
    fData.FindData := fData.FindData + [fdOwnerName];
    fData.OwnerName := OwnerEdit.Text;
  end;
Да можно и так оставить. Чем не нравится-то?
Если вариант с тегами, то можно вообще TFindData оформить в виде массива array [TMyType] of String. Но есть проблема с датой. Но и здесь можно что-нибудь придумать.

Последний раз редактировалось Sibedir; 05.02.2013 в 05:12.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по 3 параметрам Айдар БД в Delphi 8 03.12.2012 22:01
Поиск по параметрам amosik Microsoft Office Access 1 20.05.2012 01:01
поиск в списке sergo2705 Microsoft Office Access 1 16.08.2011 16:20
Поиск файлов формата bmp по заданным параметрам LinaSh Помощь студентам 17 18.04.2011 21:08
Автоматический поиск ячейки по заданным параметрам Renzo Microsoft Office Excel 5 07.03.2009 17:48