فروم تخصصی - پشتیبانی CPSD
آموزش نكات فني قفل گذاري مبتني بر Trial Keeper Professional بخش دوم - نسخه‌ی قابل چاپ

+- فروم تخصصی - پشتیبانی CPSD (http://cpsd.ir/forum)
+-- انجمن: محصولات (/forumdisplay.php?fid=1)
+--- انجمن: غیر رایگان (/forumdisplay.php?fid=7)
+---- انجمن: Trial Keeper Professional (/forumdisplay.php?fid=4)
+----- انجمن: مقالات و مثال های آموزشی مرتبط با Trial Keeper Professional (/forumdisplay.php?fid=18)
+----- موضوع: آموزش نكات فني قفل گذاري مبتني بر Trial Keeper Professional بخش دوم (/showthread.php?tid=86)



آموزش نكات فني قفل گذاري مبتني بر Trial Keeper Professional بخش دوم - CPSD Admin - ۲۳ مرداد ۱۳۹۰ ۰۹:۲۷ عصر

ضمن سلام

در ادامه مبحث قبلي ميخوام به روشي اشاره كنم كه علاوه بر كاهش زمان كاري به نوعي به عنوان يك پيچيدگي درجه سه هم جهت جلوگيري از شكسته شدن قفل به کار بیاد .

يك كركر معمولاً مترصد اجراي يك رويداد ميمونه تا اون رو بتونه دور بزنه . ميتونيد به روش زير زمان انتظار اون رو اندكي به تعويق بندازيد .

روال چك شدن تابع Initialize رو به صورت رندوم انجام بديد . در اين حالت قصد داريم فراخواني اين روال رو نه به صورت مستمر ، بلكه به صورت اتفاقي انجام بديم . در اين روش حتي اين امكان ميتونه به وجود بياد كه عمليات چك كردن رو در داخل يك رويداد تكرار پذير نيز به انجام برسونيد .
بيايد با همديگه به ساختار دستور رندوم نگاهي بندازيم

دستور رندوم و يا همون Rnd مقداري عددي از نوع Single رو برميگردونه و در هر بار اجرا ، اين عدد متفاوت از دفعه قبل خواهد بود .

هميشه دقت كنيد اين تابع رو به همراه دستور Randomize به كار ببريد , تا پراكندگي عددي در هر بار فراخواني به وجود بياد . به مثال زير دقت كنيد :

کد:
Randomize
Int ( Rnd * 100 + 1)

دستور فوق اقدام به برگرداندن عددي بين 1 تا 100 ميكنه .
خب اجازه بديد اون رو در داخل رويداد يك دكمه قرارش بديم تا در حالتي كه عدد برگشتي زوج بود برنامه اقدام به نمايش يك پيغام مزاحم كنه :
کد:
Private Sub cmdSampleButton_Click ()
Randomize
If Int ( Rnd * 100 + 1 ) Mod 2 = 0 Then MsgBox "Sample Nag Message"
End Sub
حالا همون مثال بالا در خصوص تابع Initialize هم قابل استفاده هستش
کد:
Private Sub cmdSampleButton_Click()
Randomize
If Int ( Rnd * 100 + 1 ) Mod 2 = 0 Then Initialize ( … )
End Sub
در مثال فوق هم تابع Initialize به صورت اتفاقي فراخواني ميشه . شما نمي تونيد قبل از اجراي دستور ، از فراخواني تابع Initialize مطمئن باشيد چرا كه فراخواني اون رو به دست يك رويداد اتفاقي سپرديد .

با 100 بار كليك بر روي دكمه فوق ، دستور Initialize بين 0 تا 100 بار ميتونه اجرا بشه .

در همين جا مجدداً اشاره اي به يك توصيه عمومي دارم :

فاصله فيزيكي كدها در داخل اكسس از همديگه زياد باشه


روالهاي كنترلي رو در فاصله اي دور از همديگه قرار بديد ، اينجوري رديابي كدها از طريق اديتورهاي متني موجود به سختي امكان پذيره . در پاسخ به اين سئوال كه چه جوري بايد اين كار رو انجام بديد ادامه مطلب رو مطالعه بفرماييد :

يكي از كارهاي خيلي مؤثري كه ميتونيد انجام بديد ، انجام بخشي از عمليات در داخل توابع هستش .

اجازه بديد روال نحوه برگردوندن يك عدد اتفاقي رو در داخل يك تابع با همديگه ببينيم ، در داخل يك ماژول اقدام به معرفي يك تابع با عنوان SeedRandomA كنيد :

کد:
Function SeedRandomA() As Integer
Randomize
SeedRandomA = Int(Rnd * 100 + 1 )
End Function
اين تابع دقيقاً همون كار رو انجام ميده , حالا بيايد نگاهي به نحوه استفاده از اون بندازيم .

در داخل رويداد کلیک دكمه ، دستورات با به كار گيري اين تابع به صورت زير تغيير پيدا ميكنه :
کد:
Private Sub cmdSampleButton_Click()
If SeedRandomA Mod 2 = 0 Then Initialize ( … )
End Sub
هنوز هم جا براي بهينه سازي وجود داره ، اجازه بديد تغيير آخر رو هم اعمال كنيم و تابع رو به صورت زير تغيير بديم ، قبل از اون توجه شما رو به توضيح زير جلب ميكنم :

دستور If SeedRandomA Mod 2 = 0 Then عملاً داره بررسي ميكنه كه اگر شرط صحيح باشه ( عدد زوج باشه ) آنگاه دستور مورد نظر رو به انجام برسونه .

ما قصد داريم همين عمليات رو هم در داخل تابع و به دور از چشم كركر انجام بديم . ( منظورم فاصله فيزيكي بيشتر كد كنترلي هستش )

کد:
Function SeedRandomB() As Boolean
Randomize
SeedRandomB = Int(Rnd * 100 + 1) Mod 2
End Function
به نوع مقدار برگشتي از تابع SeedRandomB دقت كنيد و تفاوت اون رو با حالت قبلي ببينيد . خروجي اين تابع بررسي ميكنه كه عدد مورد نظر زوج هست و يا نه ( تابع قبلی فقط عدد رو برميگردوند )
در نهايت تغييرات رو با هم در داخل روال انتساب داده شده به دكمه اعمال ميكنيم :
کد:
Private Sub cmdSampleButton_Click()
If SeedRandomB Then Initialize ( … )
End Sub
دقت كنيد كه كد چقدر كوتاهتر و مرتب تر شد .

مزيت اين كار توي چيه ؟!

فهم الگوريتم به كار رفته و اعمال تغيير در داخل اون دشوار تر از حالت قبلي هستش ، كركر نياز داره كه به دنبال تابع SeedRandomB بگرده و عمليات داخلي اون رو ملاحظه كنه .
شما امكان فراخواني توابع رو در جاي جاي برنامه داريد و اين همون معناي يك بار بنويس و چندين بار استفاده كن هستش .
در صورتي كه نيازي به تغيير داشته باشيد ، شما فقط نياز داريد كه روال داخل تابع رو تغيير بديد و رفلكس اين تغيير رو در تمامي جاهاي ديگه كه از اون تابع استفاده به عمل اومده ، به صورت يكجا ببينيد . ( با ذكر يك تبصره )

استفاده از توابع گامي در جهت يك برنامه نويسي پويا به حساب مياد .

با اعمال اين تغييرات گامي ديگه به سمت طراحي برنامه اي با ديواره دفاعي مستحكمتر برداريد .
در جلسه بعدي اين مبحث ، اشاره اي به رجيستري و نحوه كار با اون خواهم داشت .

البته قصد باز كردن اون مبحث رو به صورت كامل ندارم چرا كه استفاده كارآمد از اين قابليت در مباحث قفل گذاري ، نيارمند تكنيكهايي خاص هستش كه متاسفانه امكان آموزش اونها در اين سطح وجود نداره .

استفاده موثر از اين امكان در قفل گذاري نيازمند تكنيكهايي هستش كه يادگيري اونها براي شما دوستان زمان زيادي رو طلب ميكنه . كليه اون تكنيكها در داخل Trial Keeper Professional گنجونده شده و بر همين اساس از كنار اون مطلب با ديدي نه چندان عمقي عبور ميكنيم .

در سرفصلهاي بعدي وارد مباحث عمقي تر قفل گذاري به كمك Trial Keeper Professional ميشيم . اين اكتيو ايكس بسياري از قابليتهاي حرفه اي رو در داخل خودش به صورت بالقوه حمل ميكنه كه سعي ميكنيم در اين سلسله مطالب اونها رو به صورت حرفه اي تر و كاملتر آموزش بديم و اجرا كنيم .

توضيح و يادآوري چندين باره : تكنيك شكستن قفل در داخل Access متفاوت از فايلهاي اجرايي هستش ، بر همين اساس دوستاني كه با نحوه شكستن قفلهاي فايلهاي اجرايي آشنايي دارن شايد تناقضهايي رو با اصول موجود در اون نوع قفل شكني ها مشاهده كنند . برخي مطالب به صورت مشترك در داخل فايلهاي اجرايي نيز ميتونه مد نظر قرار بگيره ، ولي در حال حاضر قصد ايجاد مرزي مشخص رو در اون رابطه ندارم .
خب اميدوارم اين مطلب هم مورد توجه شما قرار گرفته باشه . تا فرصتي ديگه خدا نگهدار .