به سه روش میتوان گروهی از رکوردها را در جدول تعیین کرد که عبارتاند از:
1ـ استفاده از خاصیت Filter
2ـ استفاده از رویداد OnFilterRecord
3ـ استفاده از متد SetRange
استفاده از خاصیت Filter
در این روش مراحل ایجاد فیلتر به صورت زیر است:
1ـ خاصیت Filtered را به مقدار True تغییر دهید.
2ـ مقداری را در خاصیت Filter قرار دهید که باید بر اساس آن فیلتر انجام شود.
به عنوان مثال، دستورات زیر را در نظر بگیرید:
Table1.Filtered := True;
Table1.Filter := ‘Fname = ‘Saeed’’ ;
این دستورات، رکوردهایی را نشان میدهد که نام آنها saeed باشد.
در خاصیت Filter میتوان از عملگرهای not , or , and استفاده نمود. به عنوان مثال، دستورات زیر را در نظر بگیرید:
Table1.Filter := ‘Age > 20 and Age 40’ ;
Table1.Filtered := True ;
این دستورات، تمام رکوردهایی را نشان میدهد که سن آنها بین 20 تا 40 باشد.
مجموعه دستورات زیر، تمام رکوردهای جدول را نمایش میدهد.
Table1.Filter := “ ;
Table1.Filtered := True ;
یا
Table1.Filtered :=False;
اگر مقدار خاصیت Filter خالی و مقدار خاصیت Filtered برابر با True باشد، تمام رکوردهای جدول را نمایش میدهد. از این روش میتوان برای حذف فیلترهای قبلی استفاده کرد.
استفاده از رویداد OnFilterRecord
روش دیگر ایجاد فیلتر استفاده از رویداد OnFilterRecord است. این رویداد، برای هر یک از
رکوردهای جدول فراخوانی میشود. این رویداد، برای ایجاد فیلتر از پارامتر
Accept استفاده میکند و به صورت زیر به کار میرود:
; (مقدار فیلتر) Accept :=
این دستور، در پارامتر Accept هر رکوردی که در شرط فیلتر صدق کند، مقدار True را قرار میدهد. به عنوان مثال، برای ایجاد فیلتر با این روش، رویداد OnFilterRecord جدول را دوبار کلیک کرده کد زیر را تایپ کنید:
Accept := (Table1.FieldByName ('Code').Values = '7’) ;
این دستور، رکوردی را نمایش میدهد که کد دانشجویی آن ‘7’ باشد. کد کامل این برنامه به صورت زیر است:
procedure Tform1.TableFilterRecord (DataSet:TdataSet; var Accept:Boolean);
begin
Accept := (Table1.FieldByName ('code').Values = '7’);
متد FindFirst : با استفاده از این متد میتوان اولین رکوردی را پیدا کرد که شرایط فیلتر را داشته باشد و به صورت زیر استفاده میشود:
.FindFirst; نام عنصر
در این متد، اگر اشارهگر، به اولین رکوردی انتقال یابد که دارای شرایط فیلتر باشد، مقدار True و گرنه مقدار False را برمیگرداند.
متد FindNext: با استفاده از این متد میتوان رکورد بعدی را تعیین کرد که دارای شرایط فیلتر است و کاربرد آن به صورت زیر است:
.FindNext ; نام عنصر
اگر اشارهگر به رکورد بعدی که دارای شرایط فیلتر است، منتقل شود، این متد مقدار True و گرنه مقدار False را برمیگرداند.
متد FindLast : این متد، برای پیدا کردن آخرین رکوردی به کار میرود که شرایط فیلتر را داشته باشد، و به صورت زیر استفاده میشود:
.FindLast ; نام عنصر
اگر اشارهگر، به آخرین رکوردی انتقال یابد که دارای شرایط فیلتر باشد، این متد مقدار True و گرنه مقدار False را برمیگرداند.
متد FindPrior : این متد، اشارهگر را به رکورد قبلی انتقال میدهد که دارای شرایط فیلتر باشد، و به صورت زیر به کار میرود:
.FindPiror ; نام عنصر
اگر اشارهگر، به رکورد قبلی که دارای شرایط فیلتر باشد، منتقل گردد این متد مقدار True و گرنه مقدار False را برمیگرداند.
متد SetRange : با استفاده از این متد میتوان گروهی (محدودهای) از رکوردها را در جدول تعیین کرد و از آنها استفاده نمود. پس از تعیین محدودهای از رکوردها، میتوان فرض کرد که بقیه رکوردها وجود ندارند. متد SetRange به صورت زیر به کار میرود:
‘ ; نام فیلد.IndexName := ' نام عنصر
; ([مقدار 2] , [مقدار 1]) .SetRange نام عنصر
به عنوان مثال، دستورات زیر را در نظر بگیرید:
Stu.IndexName := 'Fname';
stu.SetRange (['Saeed']) ;
در این دستورات، رکوردهایی در جدول ظاهر میگردند که نام آنها ‘saeed’ باشد. مجموعه دستورات زیر، رکوردهایی را که حقوق آنها بین 20 تا 40 ریال باشد، نمایش میدهد.
Stu.IndexName := 'Age' ;
Stu.SetRange ([20] , [40]);
متد CancelRange : با استفاده از متد CancelRange میتوان محدوده در نظر گرفته برای جدول را حذف نمود و تمام رکوردهای جدول را نمایش داد. کاربرد متد CancelRange به صورت زیر است:
.CancelRange ; نام عنصر
به عنوان مثال، دستور زیر را در نظر بگیرید:
Stu.CancelRange;
این دستور، محدودهای را حذف میکند که توسط SetRange قبلی ایجاد شد و سبب نمایش تمام رکوردهای بانک اطلاعاتی میشود.
متد SetRangeStart : با استفاده از این متد میتوان بازه شروع فیلتر قبلی را حذف نمود و بازه شروع فیلتر جدیدی را تعریف کرد. این متد به صورت زیر به کار میرود:
.SetRangeStart; نام عنصر
;مقدار بازه شروع فیلتر := نوع فیلد .as (‘نام فیلد’) FieldByName . نام عنصر
متد SetRangeEnd: این متد، بازه پایانی فیلتر قبلی را حذف کرده بازه پایانی فیلتر جدیدی را تعریف میکند و به صورت زیر به کار میرود:
.SetRangeEnd ; نام عنصر
; مقدار بازه پایانی فیلتر := نوع فیلد .as (‘نام فیلد’) FieldByName . نام عنصر
متد EditRangeStart : با استفاده از این متد میتوان بازه شروع فیلتر قبلی را تعویض کرد و بازه شروع جدیدی را تعریف نمود و به صورت زیر به کار میرود:
.EditRangeStart; نام عنصر
;بازه شروع فیلتر := نوع فیلد .as (‘نام فیلد’) FieldByName . نام عنصر
متد EditRangeEnd: این متد برای تعویض بازه پایانی فیلد موجود به کار میرود و به صورت زیر مورد استفاده قرار میگیرد:
.EditRangeEnd ; نام عنصر
; بازه پایانی فیلتر جدید := نوع فیلد .as (‘نام فیلد’) FieldByName . نام عنصر
به عنوان مثال، دستورات زیر را در نظر بگیرید:
with Table1 do
begin
EditRangeStart;
FieldByName ('Age').asInteger := StrToInt (Edit1.Text);
EditRangeEnd;
FieldByName ('Age').asInteger := StrToInt (Edit2.Text);
ApplyRange;
End;
این دستورات کلیه رکوردهایی را نمایش میدهد که سن آنها بین مقادیر عنصر Edit2 , Edit1 باشد.
متد ApplyRange : این متد، فیلتر را با استفاده از بازه شروع فیلتر و بازه پایان فیلتر بر روی جدول اجرا میکند و به صورت زیر استفاده میشود:
.ApplyRange ; نام عنصر
به عنوان مثال، دستورات زیر را در نظر بگیرید:
with Table1 do
Active := True;
SetRangeStart;
FieldByName ('Age').asInteger := 20;
SetRangeEnd;
FieldByName ('Age').asInteger := 40;
ApplyRange;
End;
این دستورات، رکوردهایی از جدول را نمایش میدهد که سنشان در بازه 20 تا 40 باشد.
در کد زیر کار با system Restore point ویندوز را یاد خواهید گرفت. دسترسی به اخرین تغییرات در ویندوز
نکته:در ویندوز 7 Run as Admin… فراموش نشود
program WMIShowRestorePoints;
///www.delphiplus.ir
/// wwww.lear4u.blogsky.com
{$APPTYPE CONSOLE}
uses
SysUtils
,ActiveX
,ComObj
,Variants;
function RestorePointTypeToStr(RestorePointType:Integer):string;
begin
case RestorePointType of
0 : Result:='APPLICATION_INSTALL';
1 : Result:='APPLICATION_UNINSTALL';
13 : Result:='CANCELLED_OPERATION';
10 : Result:='DEVICE_DRIVER_INSTALL';
12 : Result:='MODIFY_SETTINGS'
else
Result:='Unknow';
end;
end;
function EventTypeToStr(EventType:integer) : string;
begin
case EventType of
102 : Result:='BEGIN_NESTED_SYSTEM_CHANGE';
100 : Result:='BEGIN_SYSTEM_CHANGE';
103 : Result:='END_NESTED_SYSTEM_CHANGE';
101 : Result:='END_SYSTEM_CHANGE'
else
Result:='Unknow';
end;
end;
function WMITimeToStr(WMITime:string) : string; //convert to dd/mm/yyyy hh:mm:ss
begin
//20020710113047.000000420-000 example source <a href="http://technet.microsoft.com/en-us/library/ee156576.aspx">http://technet.microsoft.com/en-us/library/ee156576.aspx</a>
result:=Format('%s/%s/%s %s:%s:%s',[copy(WMITime,7,2),copy(WMITime,5,2),copy(WMITime,1,4),copy(WMITime,9,2),copy(WMITime,11,2),copy(WMITime,13,2)]);
end;
procedure GetRestorePoints;
var
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
User : OLEVariant;
Domain : OLEVariant;
function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;
begin
objWMIService := GetWMIObject('winmgmts:\\localhost\root\default');
colItems := objWMIService.ExecQuery('SELECT * FROM SystemRestore','WQL',0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
WriteLn(Format('%s %-15s',['Description',colItem.Description]));
WriteLn(Format('%s %-15s',['RestorePointType',RestorePointTypeToStr(colItem.RestorePointType)]));
WriteLn(Format('%s %-15s',['EventType',EventTypeToStr(colItem.EventType)]));
WriteLn(Format('%s %-15s',['SequenceNumber',colItem.SequenceNumber]));
WriteLn(Format('%s %-15s',['CreationTime',WMITimeToStr(colItem.CreationTime)]));
Writeln('');
end;
end;
begin
try
CoInitialize(nil);
try
GetRestorePoints;
Readln;
finally
CoUninitialize;
end;
except
on E:Exception do
Begin
Writeln(E.Classname, ': ', E.Message);
Readln;
End;
end;
end.