Формирование строки фильтра

Sashaua
Дата: 12.06.2019 17:44:30
Для формирования строки фильтра использую такой велосипед.
const
  Condition = '%s = ''%s''';
begin
 Filter := '';
 for i := 0 to ComponentCount - 1 do begin
 if Components[i] is TCombobox then
   begin
    EditControl := TCombobox(Components[i]);
    if EditControl.Text = '' then Continue;
    if Filter = ''
    then Filter := Format(Condition, [EditControl.Name, IntToStr(integer(EditControl.Items.Objects[EditControl.ItemIndex]))])
    else Filter := Filter + ' and ' + Format(Condition, [EditControl.Name, IntToStr(integer(EditControl.Items.Objects[EditControl.ItemIndex]))]);
   end;
 end;

Нюанс в том что компоненты необходимо называть аналогично полям в выборке, не очень утобно для читаемоски в коде.
Можно придумать ненапряжное в реализации что-то типа словаря название компонента= поле в выборке.?
ёёёёё
Дата: 12.06.2019 18:14:35
Sashaua,

да, конечно можно. Делай.
asviridenkov
Дата: 12.06.2019 18:57:58
ёёёёё,

За всех то не отвечай
DimaBr
Дата: 12.06.2019 22:22:14
Sashaua
Нюанс в том что компоненты необходимо называть аналогично полям в выборке, не очень утобно для читаемоски в коде.

Называй компоненты с префиксом, так гораздо удобнее.
Если поле называется Comment я называю компонент cxComment
А если такой уже вдруг есть на форме (например в другом датасете), то просто меняю приставку на axComment, bxCommet, dxComment
_Vasilisk_
Дата: 13.06.2019 14:48:41
Sashaua,

По идее, у всех компонентов есть привязанный к ним Label. Тогда все просто. В дизайнтайме заносишь в Label название поля. При старте программы пробегаешься по всем Label
 for i := 0 to ComponentCount - 1 do begin
 if Components[i] is TLabel then
   begin
    LabelControl := TCombobox(Components[i]);
    if (LabelControl.Tag = 1) and (LabelControl.FocusControl is TComboBox) then begin
      FilterList.Add(TPair.Create(TCombobox(LabelControl.FocusControl), LabelControl.Caption));
      LabelControl.Caption := LoadCaption(LabelControl.Caption);
    end;
   end;

И сама фильтрация
const
  Condition = '%s = %d';
begin
 Filter := '';
 for i := 0 to FilterList.Count - 1 do begin
    EditControl := FilterList[i].Key;
    if EditControl.Text = '' then Continue;
    if Filter <> '' then
      Filter := Filter + ' and ';
    Filter := Filter + Format(Condition, [FilterList[i].Value, Integer(EditControl.Items.Objects[EditControl.ItemIndex])]);
   end;
 end;