Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

Filter   Найти похожие ветки 

 
ronyn   (2006-08-20 17:43) [0]

Можно ли  прописать фильтр сначала в одном событии, потом дугой фильтр в другом событии , что бы они друг на друга наложились? У меня так почему-то не выходит.


 
Dok   (2006-08-20 18:28) [1]

санчала с мыслями собирись


 
ronyn   (2006-08-20 22:30) [2]

Пояснение не понявшим: пример -
два бегунка - первый устанавливает фильтр - ученики имеющие оценки Х
второй - ученики из групп УУУ (значения Х и УУУ например равны значениям бегунка).
Таким образом получим учеников определенной группы с определенными оценками. Надеюсь, теперь ясно донес.


 
Virgo_Style ©   (2006-08-20 22:58) [3]

AND


 
ronyn   (2006-08-20 23:24) [4]

Happy end


 
ronyn   (2006-08-20 23:27) [5]

С and это уже не в разных событиях. Кстати, как синтаксис выглядит с этим оператором? И как в значение фильтра занести значение например поля ввода или значения трак бара?


 
Джо ©   (2006-08-21 00:55) [6]

Вот простой пример, инкапсулирующий описанную функциональность.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Contnrs, ComCtrls, StdCtrls;

type
 // Класс с данными
 TStudent = class
 private
   FName: string;
   FGroupName: string;
   FAge: Integer;
 public
   property Name: string read FName write FName;
   property GroupName: string read FGroupName write FGroupName;
   property Age: Integer read FAge write FAge;
   constructor Create (AName, AGroupName: string; AAge: Integer);
 end;

 // Абстрактный фильтр
 TFilter = class
 protected
   // Собственно, эта функция, реализовання в потомках,
   // и определяет, удовлетворяют ли передаваемые данные фильтру
   function Satisfies (AData: TStudent): Boolean; virtual; abstract;
 end;

 // Класс-список данных
 TStudentList = class
 private
   FContainers: TObjectList;
   FFilters: TObjectList;
   function GetCount: Integer;
   function GetItems(Index: Integer): TStudent;
   function Add (AContainer: TStudent): Integer;
 public
   constructor Create (AOwnsObjects: Boolean = True);
   destructor Destroy; override;
   procedure AddFilter (AFilter: TFilter);
   procedure RemoveFilters;
   function CreateFilteredList: TStudentList;
   property Count: Integer read GetCount;
   property Items[Index: Integer]: TStudent read GetItems; default;
 end;

 // Примеры фильтров

 TMaxAgeFilter = class (TFilter)
 private
   FMaxAge: Integer;
 protected
   function Satisfies (AData: TStudent): Boolean; override;
 public
   property MaxAge: Integer read FMaxAge write FMaxAge;
 end;

 TGroupNameFilter = class (TFilter)
 private
   FGroupName: string;
 protected
   function Satisfies (AData: TStudent): Boolean; override;
 public
   property GroupName: string read FGroupName write FGroupName;
 end;

 // Форма, демонстрирующая пример работы

 TForm1 = class(TForm)
   TrackBar1: TTrackBar;  // для ввода максимального возраста
   Edit1: TEdit;  // для ввода имени группы
   Memo1: TMemo;  // для вывода отфильтрованных данных
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure TrackBar1Change(Sender: TObject);
   procedure Edit1Change(Sender: TObject);
 private
   FMaxAgeFilter: TMaxAgeFilter;  // фильтр по макс. возрасту
   FGroupNameFilter: TGroupNameFilter;  // фильтр по имени группы
   FStudentList: TStudentList;
   procedure RefreshVisualData;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TStudentList }

function TStudentList.Add(AContainer: TStudent): Integer;
begin
 Result := FContainers.Add(AContainer)
end;

procedure TStudentList.AddFilter(AFilter: TFilter);
begin
 FFilters.Add(AFilter)
end;

constructor TStudentList.Create;
begin
 inherited Create();
 FContainers := TObjectList.Create (AOwnsObjects);
 FFilters := TObjectList.Create (True);
end;

destructor TStudentList.Destroy;
begin
 FFilters.Free;
 FContainers.Free;
 inherited;
end;

function TStudentList.GetCount: Integer;
begin
 Result := FContainers.Count
end;

function TStudentList.GetItems(Index: Integer): TStudent;
begin
 Result := TStudent(FContainers[Index])
end;

function TStudentList.CreateFilteredList: TStudentList;
var
 I,J: Integer;
 Satisfies: Boolean;
begin
 Result := TStudentList.Create (False);

 for I := 0 to FContainers.Count-1 do
 begin
   Satisfies := True;
   for J := 0 to FFilters.Count-1 do
     Satisfies := Satisfies and TFilter(FFilters[J]).Satisfies(GetItems(I));
   if Satisfies then
     Result.Add(GetItems(I))
 end;
end;

procedure TStudentList.RemoveFilters;
begin
 FFilters.Clear
end;

{ TStudent }

constructor TStudent.Create(AName, AGroupName: string; AAge: Integer);
begin
 inherited Create();
 FName := AName;
 FGroupName := AGroupName;
 FAge := AAge;
end;

{ TMaxAgeFilter }

function TMaxAgeFilter.Satisfies(AData: TStudent): Boolean;
begin
 Result := AData.Age <= FMaxAge
end;

{ TGroupNameFilter }

function TGroupNameFilter.Satisfies(AData: TStudent): Boolean;
begin
 Result := AData.GroupName = FGroupName
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FStudentList := TStudentList.Create;

 FStudentList.Add(TStudent.Create("Вася","КПП-1",19));
 FStudentList.Add(TStudent.Create("Петя","ККХЦФ-3",21));
 FStudentList.Add(TStudent.Create("Оля","КХХЦФ-1",23));
 FStudentList.Add(TStudent.Create("Галя","КПП-1",26));

 FMaxAgeFilter := TMaxAgeFilter.Create;
 FGroupNameFilter := TGroupNameFilter.Create;

 FStudentList.AddFilter(FMaxAgeFilter);
 FStudentList.AddFilter(FGroupNameFilter);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FStudentList.Free;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 FMaxAgeFilter.MaxAge := TrackBar1.Position;
 RefreshVisualData
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
 FGroupNameFilter.GroupName := Edit1.Text;
 RefreshVisualData
end;

procedure TForm1.RefreshVisualData;
var
 I: Integer;
 FilteredStudentList: TStudentList;
begin
 // Получаем отфильтрованный список
 FilteredStudentList := FStudentList.CreateFilteredList;

 // Выводим данные отфильтрованного списка
 try
   Memo1.Lines.BeginUpdate;
   try
     Memo1.Lines.Clear;
     for I := 0 to FilteredStudentList.Count-1 do
     begin
       Memo1.Lines.Add(Format("%s,%s,%d",
         [
           FilteredStudentList[I].Name,
           FilteredStudentList[I].GroupName,
           FilteredStudentList[I].Age
         ]));
     end;
   finally
     Memo1.Lines.EndUpdate;
   end;
 finally
   FilteredStudentList.Free;
 end

end;

end.

Иллюстация всего лишь одного из многих возможных подходов.

Надеюсь, код ясен и без подробных комментариев.


 
ronyn   (2006-08-21 21:41) [7]

Извиняюсь, я имел ввиду БД. Это вроде как Table1.Filter:="Fam=""yes""" и т.д.
А мне надо несколько фильтров Table1.Filter:="Fam=""yes""";
Table1.Filter:="Fam=""no""" - вот в таком виде не срабатывает.
Можно в инспекторе сразу прописать сложный фильтр, но в тело кода точ такую же запись нельзя вписать, точнее сказать я не знаю как должен сложный фильтр выглядеть в коде.


 
Джо ©   (2006-08-21 21:44) [8]

> [7] ronyn   (21.08.06 21:41)
> Извиняюсь, я имел ввиду БД. Это вроде как Table1.Filter:
> ="Fam=""yes""" и т.д.

Извинения не приняты.


 
Anatoly Podgoretsky ©   (2006-08-21 22:03) [9]

Джо ©   (21.08.06 00:55) [6]
Ты что решил пацана напугать?


 
Ketmar ©   (2006-08-21 22:05) [10]

> [9] Anatoly Podgoretsky ©   (21.08.06 22:03)
после того, как был кинут такой кусок кода, это Джо ещё очень мягко сказал. %-)


 
ronyn   (2006-08-21 22:06) [11]

Дык - помощь нужна. пугайте-непугайте, а решить как-то это надо-)


 
Ketmar ©   (2006-08-21 22:08) [12]

> [11] ronyn   (21.08.06 22:06)
подозреваю, что никому, кроме тебя, не надо. а ты даже не потрудился толково описать условия задачи. вывод из этого напрашивается простой.


 
ronyn   (2006-08-21 22:14) [13]

да - не потрудился. по десять раз в разных местах форума прописал вопрос, никому не ясно. а тут уж совсем запутался - поэт так и написал...


 
Ketmar ©   (2006-08-21 22:19) [14]

> [13] ronyn   (21.08.06 22:14)
> по десять раз в разных местах форума прописал вопрос, никому не ясно
может, лучше было один раз, но внятно? %-))


 
Джо ©   (2006-08-21 22:20) [15]


> поэт так и написал...


[offtop]
Куда эти люди всегда так спешат, что даже слова не дописывают? Читая такие посты, так и предствавляешь себе: подбегает человек к компьютеру, запыхавшись, набирает какой-то свой вопрос, вскакивает и бежит дальше... еще что-то спрашивать, наверное. И нигде его не понимают, и никто не слышит.
"Скучно жить на этом свете, господа" ©.
[/offtop]


 
Джо ©   (2006-08-21 22:20) [16]

Или, действительно, некий поэт что-то именно так и написал? :)


 
ronyn   (2006-08-21 22:27) [17]

не, там было внятно, тока никто не ответил


 
ronyn   (2006-08-21 22:30) [18]

http://delphimaster.net/view/3-1156081674/

другие вообще модератором удалено, с пометкой ответ исчерпан - ну вот сами сюда загляните и увидите-)


 
Ketmar ©   (2006-08-21 22:33) [19]

что характерно (ц) -- ведь действительно ответили.


 
Anatoly Podgoretsky ©   (2006-08-21 22:38) [20]

Ketmar ©   (21.08.06 22:19) [14]
Мечтать не вредно.


 
ronyn   (2006-08-21 22:41) [21]

Может вы мне просто ответите. Лишь потой причине что я об этом попросил.


 
ronyn   (2006-08-21 22:45) [22]

Ketmar ©   (21.08.06 22:33) [19]
что характерно (ц) -- ведь действительно ответили. <<<
На любой вопрос так ответить можно?

Как реализуется технология ОЛЕ в .....?
Ответ: легко.
  Помоему тоже ответили.


 
Ketmar ©   (2006-08-21 22:46) [23]

> [22] ronyn   (21.08.06 22:45)
"так называемые парадоксы автора обычно находятся в голове у читателя" (ц)


 
Джо ©   (2006-08-21 22:50) [24]

> [18] ronyn   (21.08.06 22:30)
> http://delphimaster.net/view/3-1156081674/
>
> другие вообще модератором удалено, с пометкой ответ исчерпан

Правильная пометка.


> [21] ronyn   (21.08.06 22:41)
> Может вы мне просто ответите. Лишь потой причине что я об
> этом попросил.

OnFilterRecord.


 
Anatoly Podgoretsky ©   (2006-08-21 22:50) [25]

Прошу не трогать Парадокс.


 
Ketmar ©   (2006-08-21 23:04) [26]

"руки прочь от Гондураса!" (ц) %-)


 
Anatoly Podgoretsky ©   (2006-08-21 23:15) [27]

Кто с Парадоксом к нам придет, тот от парадокса и умрет.


 
Джо ©   (2006-08-21 23:16) [28]

Paradox не тетка. Выпустишь — не поймаешь!


 
Ketmar ©   (2006-08-21 23:17) [29]

> [28] Джо ©   (21.08.06 23:16)
вот это верно. Borland один раз выпустило...


 
Джо ©   (2006-08-21 23:19) [30]

> [29] Ketmar ©   (21.08.06 23:17)
> > [28] Джо ©   (21.08.06 23:16)
> вот это верно. Borland один раз выпустило...

В цитатник :)

П.С.
Жалко ветку. Хорошая была. Жалобная.


 
Ketmar ©   (2006-08-21 23:23) [31]

> [30] Джо ©   (21.08.06 23:19)
> Жалко ветку. Хорошая была. Жалобная.
да. загадили мы её знатно. не пора ли ей в "трепологию" переезжать? %-)


 
sniknik ©   (2006-08-21 23:24) [32]

> да - не потрудился. по десять раз в разных местах форума прописал вопрос
оппа... так те три ветки с одним и тем же вопросом в базах не единственные? было еще 7? ну так ты легко отделался, можно сказать легким испугом, не знал (думал ну ошибся... ну с кем не бывает). а то бы как злостного спамера, все под корень...
хотя вижу и оставленная ветка пользы не принесла...
========================
Поросенок,
Который не мечтает стать беконом,
Бесперспективен.


 
ronyn   (2006-08-22 12:12) [33]

А если я сам отвечу на вопрос, то ветка стало быть - принесла пользу. Забавно, давно пора было
>>Ketmar ©   (21.08.06 23:23) [31]
          > [30] Джо ©   (21.08.06 23:19)
          > Жалко ветку. Хорошая была. Жалобная.
   да. загадили мы её знатно. не пора ли ей в "трепологию" переезжать? %-)
Тока не понятно, зачем трепаться, если можно ответить.


 
Плохиш ©   (2006-08-22 12:19) [34]


> ronyn   (22.08.06 12:12) [33]
> Тока не понятно, зачем трепаться, если можно ответить.

Так трепаться начали после того как ответили. Если тебе ответы не понятны, то самый раз начать читать литературу для повышения своего уровня образования.
Не каждая кухарка может управлять государством, как оказалось.


 
fishka   (2006-08-22 16:00) [35]

Мне казалось, что фильтр записывается в одну переменную, затем при необходимости значение переменной изменяется (добавляется and).Фильтр отменяется, затем накладывается снова.
...
Table1.Filter:=perem;
...
Table1.Filtered:=False;
perem:=perem+" and " +new_perem;
Table1.Filter:=perem;
Table1.Filtered:=True;
примерно так....

Разве не об этом спрашивал автор вопроса?


 
ronyn   (2006-08-22 21:04) [36]

Меня сейчас на ха-ха пробило.
Честно  говоря - знал, что так будет. Сначала толпа народа будет трепаться и пардон, "сиськи мять", ничего не ответив толкового, .... а потом, в самом конце, найдется человек (именно), который просто напишет ответ на вопрос.
  Такое уже было с пол года назад на этом форуме.
Тогда тоже шло долгое бурное и бесполезное обсуждение...  Ответов на сорок...
 И в самом конце, если память не изменяет, Джо(R) или Юрий Зотов написал мне короткий ответ на поставленный вопрос.
 Думаю многие сейчас скажут мне , что я не прав... Бла, бла, бла...
Не, суть. Думаю, многим здесь надо зайти на главную страницу этого сайта и прочитать, к чему призывает этот сайт. - Помочь программисту в вопросах, который он не нашел в книжках - если быть кратким.
Можно много говорить на тему , мыл, такие как ты не праграммисты!! вон !!
тебе помогать не стоит!!
Но это не по мужски все. Здесь конечно не армия, и не мне решать вше поведение. Но все таки прошу прислушаться.

                        Это моё мнение. Спасибо за внимание-)


 
Anatoly Podgoretsky ©   (2006-08-22 21:14) [37]

Ну конечно форум как всегда виноват.


 
Плохиш ©   (2006-08-22 22:41) [38]


> Помочь программисту в вопросах, который он не нашел в книжках

Я рыдал. ronyn, тут врунов ещё больше не любят, чем халявщиков.


 
Ketmar ©   (2006-08-22 23:12) [39]

не трогайте товарисча. думаю, он нас ещё не раз повеселит.


 
Джо ©   (2006-08-23 02:38) [40]

Шоу маст гоу он :)



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.044 c
15-1155914647
тттт
2006-08-18 19:24
2006.09.10
Помогите настоить BIOS.


15-1155806124
Rouse_
2006-08-17 13:15
2006.09.10
Каждому спамеру по бульдозеру :)


3-1152245904
Хой
2006-07-07 08:18
2006.09.10
Компонент xlReport


15-1155424712
Баер
2006-08-13 03:18
2006.09.10
Какой монитор(ы) купить на 600 долларов?


4-1147598696
Белый Орёл
2006-05-14 13:24
2006.09.10
Вызвать MouseDblClick раньше MouseUp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский