![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Filter [D7, Paradox]
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