Суть вопроса: Есть структура данных record. К примеру: Code: type Students = record f:string; i:string; o:string; mark:integer; yeat:string; .... end; var studlist:array[1..100] of Students; .... Также на форме есть Edit контролы, для того, чтобы вводить эти данные, а так же осуществлять по ним поиск, например, по фамилии. Проблема: Но! Не первый день уже бьюсь не могу понять как сделать так, чтобы поиск был по нескольким полям! Вроде бы простая проблема и должна легко решаться. Но к примеру, возникает ошибка, когда я хочу лишь искать по фамилии (поле f) и оценке (поле mark). То есть, слелующий тривиальный код не корректный: Code: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=1 to High(studlist) do if (Edit1.Text=studlist[i].f) and (Edit2.Text=studlist[i].i) and (Edit3.Text=studlist[i].o) and (Edit4.Text=inttostr(studlist[i].mark)) and (Edit5.Text=studlist[i].year) then begin Memo1.Lines.Add('Запись номер : '+inttostr(i)); end; end; Ошибка потому что, Edit2, Edit3,Edit5 остались пустые... Помогите пожалуйста освежить мозги ...
Тупое решение: Code: ((Edit1.Text=studlist[i].f) OR (Edit1.Text='')) and ((Edit2.Text=studlist[i].i) OR (Edit2.Text='')) and ((Edit3.Text=studlist[i].o) OR (Edit3.Text='')) and ((Edit4.Text=inttostr(studlist[i].mark)) OR (Edit4.Text='')) and ((Edit5.Text=studlist[i].year) OR (Edit5.Text='')) Умное решение: Анализировать состояние эдитов до поиска и сравнивать только нужные поля
Представляете сколько может быть различных комбинаций, особенно если полей много в структуре! Ладно, если было бы 2 поля... А мне тогда придется рассматривать варианты, когда Edit1 пустой, к примеру, а все остальные заполнены и т.д. Как раз таки это решение не целесообразное, лобовое. Возможно как-то это реалиовать через логические запросы. Как, SQL ведь и работает.
Ну так никто и не говорит про перебор всех комбинаций вариантов. А если еще не только равенство проверять надо, то вообще сказка)))) И если любите SQL - используйте SQL. Есть куча in-memory баз данных.