Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Filter [D7, Paradox]


Страницы:   1 2 3

ronyn ©   (2006-08-20 17:43:00) 

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


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

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


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

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

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


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

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


Anatoly Podgoretsky   (2006-08-21 22:38:00) [24]

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


Ketmar   (2006-08-21 22:33:00) [25]

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


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

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1156081674&n=1

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


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

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


Джо   (2006-08-21 22:20:00) [28]

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


Джо   (2006-08-21 22:20:00) [29]


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


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


Ketmar   (2006-08-21 22:19:00) [30]

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


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

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


Ketmar   (2006-08-21 22:08:00) [32]

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


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

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


Ketmar   (2006-08-21 22:05:00) [34]

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


Anatoly Podgoretsky   (2006-08-21 22:03:00) [35]

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


Джо   (2006-08-21 21:44:00) [36]

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

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


ronyn   (2006-08-21 21:41:00) [37]

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


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

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

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-20 23:27:00) [39]

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


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

Happy end


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо