Форум: "Начинающим";
Текущий архив: 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]Шоу маст гоу он :)
← →
Германн © (2006-08-23 02:46) [41]Кстати. Ник ronyn на форуме появился давно. Сам с автором ник"а много "бодался"! Так это тот или новый?
← →
Джо © (2006-08-23 03:14) [42]The same, surely.
← →
Германн © (2006-08-23 03:20) [43]
> Джо © (23.08.06 03:14) [42]
Мерси боку.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.06 c