تبليغاتX
وبلاگ برنامه نویسان اهواز
آموزش برنامه نویسی به زبان های برنامه نویسی دلفی و ویژوال بیسیک و ...
 

سلام

یه تابع برای بدست آوردن نام کامپیوتری که برنامه داره اجرا میشه

میتونید از این تابع در ConnectionString برای بدست آوردن WorkStationID استفاده کنید

function ComputerName:string;

var

 BufsSIze:DWORD;

 CName : array [0..255] of char;

begin

 BufsSIze:=255;

 GetComputerName(CName,BufsSIze);

 Result:= CName;

end;

|+| نوشته شده توسط محمد جاهد در جمعه 28 فروردین1388  |
 سوکت پروگرمینگ در دلفی
سلام

با توجه به درخواست دوستان برای سوکت پروگرمینگ چون مطلب قبلی زیاد کامل نبود یه مقاله کامل و ساده دارم آماده می کنم که بزودی در همین وبلاگ قرار میدهم. در این مقاله آموزشی کار با سوکت با استفاده از ابزارهای TServerSocket,TClientSocket گفته شده که برای مثال به برنامه برای چت رو با هم طراحی میکنیم . بعد از اون می خوام یه مقاله هم درباره ارسال و دریافت اطلاعات بصورت باینری (File,Image,...) بنویسم و با برنامه مثال همینجا قرار بدم. امیدوارم خوشتون بیاد و بتونه کمکتون کنه

راستی نظر یادتون نره، تا منم سریعتر آمادش میکنم آخه باید ببینم کسی هست که بخواد یا نه

موفق باشید

یا حق

|+| نوشته شده توسط محمد جاهد در دوشنبه 15 مهر1387  |
 جستجو در جدول (Searching in Table)

جستجو در جدول (Searching in Table)

برای جستجو اول باید ببینید به چه نوع گزارشی نیاز دارید، می خواهید یک عبارت رو در یک فیلد مشخص(یا قابل تغییر توسط کاربر) فقط پیدا کنید؟یا می خواهید لیستی از اطلاعات مربوط به عبارت مورد جستجو را پیدا کنید؟ هر کسی بسته به نوع کارش یه روشی داره، مثلا اگر بخواهید در دفترچه تلفن فقط یک تلفن یا نام رو پیدا کنید (فقط پیدا کنید نه لیست تهیه کنید) میتوانید این کارو با دستور Locate براحتی انجام بدید روش انجام اون اینجوریه:

برای مثال اول یه شی از نوع TEdit و یکی هم TButton از پالت Standard به فرم اضافه کنید (خاصیت کپشن Button رو به جستجو تغییر بدید و Name اونو هم به BSearch و خاصیت Name شی Edit رو هم به ESearch تغییر بدید) بعد روی دکمه دوبار کلیک کن.حالا کد زیر رو بنویس:

FDM.TTelInfo.Locate('Tel',ESearch.Text,[loCaseInsensitive]);

با این دستور اولین رکوردی که فیلد Tel اون مثل عبارت وارد شده در TSearch باشه رو پیدا میکنه و مکان نما رو به اون رکورد انتقال می ده. برای بهتر شدن و جالب تر شدن می تونید اسم فیلد رو هم از کاربر بوسیله یک شی Edit دیگه که مثلا اسم اونو ESField گذاشتید به شکل زیر دریافت کنید.

FDM.TTelInfo.Locate(ESField.text,ESearch.Text,[loCaseInsensitive]);

اینطوری کاربر میتونه با وارد کردن اسم فیلد مربوطه در فیلدهای مختلف هم جستجو کنه. حالا خودت سعی کن تا بوسیله شی TComboBox از پالت Standard کاربر فقط اسم فیلد رو انتخاب کنه نه اینکه خودش اسم اونو وارد کنه. (یه راهنمایی: این شی یه خاصیت به نام Items داره که میتونی اسم فیلدها رو توش بنویسی(همشو که گفتم یه چیزیم خودت بنویس))

خب این از این روش، بریم برا روشی که باعث انتخاب لیستی از رکوردهای مورد نیاز ما میشه. این روش بسیار دقیق تر و تنظیم اون حرفه ای تره، خیلی سادس فقط باید یکم خلاقیت بخرج بدی، خب، از این روش میشه مثلا برای وقتی که بخوایم لیستی از تمامی شماره هایی که فیلد Name اونا برابر عبارت هست رو نشون بده میشه استفاده کرد.در این دستور میشه از روش های قسمت where در دستور Select از SQL استفاده کرد.مثلا برای مثال بالا میشه:

FDM.TTelInfo.Filtered:=False;

FDM.TTelInfo.Filter:= 'Name = '+QuotedStr(ESearch.text);

FDM.TTelInfo.Filtered:=True;

در این مثال در خط اول خاصیت فیلتر جدول رو غیر فعال کردیم و در خط دوم با مقدار دادن به خاصیت Filter جدول گفتیم که عبارت موجود در ESearch رو در فیلد Name جستجو کنه تابع QuotedStr باعث میشه دوتا تک کوتیشن( ' ) دوطرف رشته داده شده قرار بگیره.مثلا اگر مقدار ESearch برابر محمد باشه مقدار خاصیت Filter برابر با عبارت زیر میشه :

Name = 'محمد'

اما بدون دستور  QuotedStr  میشه :

Name = محمد

که باعث خطا میشه و نمیشه اینجوری برای فیلدهای رشته ای استفاده کرد.(دقیقا مثل SQL) فقط فیلدهای از نوع رشته ای باید اینطوری وارد بشن.

 

پیشرفته تر:

مثلا برای پیدا کردن تمامی شماره تلفن های با یک پیش شماره مشخص میشه نوشت:

FDM.TTelInfo.Filter:= 'Tel  Like  '+QuotedStr(ESearch.text+'*');

 

در اینجا دستور Like بمعنی شبیه بودن می باشد و * باعث میشود هر کاراکتری جایگزینش شود و باعث پیدا شدن هر رکوردی که فیلد Tel اون با عبارت وارد شده شروع شده باشد می شود.

 

خیلی روش ها برای جستجو در دیتابیس وجود داره که گفتنشون زمان زیادی می بره.

|+| نوشته شده توسط محمد جاهد در دوشنبه 13 اسفند1386  |
 اولین تجربه با دلفی (1)

خب این دلفیه برای نوشتن یه برنامه با دلفی باید این مراحل رو انجام بدی،1- تحلیل برنامه یعنی بفهمی که مسئله چیه و متوجه درخواست ها بشی،2- انتخاب یک دیتابیس مناسب با نیاز کاربر بر اساس نیاز اون از نظر حجم داده ها و نوع سیستم

که تک کامپیوتره یا سیستم شبکه است،3- شروع به طراحی برنامه در دلفی بدین صورت که اول یه برنامه جدید بوسیله New VCL Forms Application درست میکنی که یه فرم به نام Form1 که دارای Unit1 هست رو برات ایجاد می کنه که میتونه فرم اصلی برنامت باشه (من این فرم رو به نام FMain و یونیتشو به نام UMain میذارم) بعد از منوی File وارد New میشی و Other رو کلیک میکنی توکادر ظاهر شده از سمت چپ گزینه Delphi Files رو انتخاب میکنی بعد از سمت راست گزینه  (دیتا ماژول) Data Module رو انتخاب وOK رو میزنی اونوخ یه فرم به نام DataModule1 و Unit2 درست می شود (من این فرم رو به نام FDM و یونیتشو به نام UDM میذارم) که میتونی از اون برای نگه داشتن ابزارهای کار با دیتابیس استفاده کنی این روش خوبیه که همه چیز یک جا باشه کنترل راحت تری هم داره فرم های برنامه هم سنگین نمی شن

خب حالا باید ابزارهای دیتابیس رو تو این دیتاماژول بزاری اول مطمئن شو که تو قسمت فرم دیتا ماژول هستی نه کد (برای جابجایی بین این دو قسمت میتونی از کلید F12 استفاده کنی)بعد از قسمت ابزارهای دلفی(Tool Palette) وارد گزینه DBGo میشی و اول یه ADOConnection با دوبار کلیک روی اون به صفحه اضافه میکنی بعد به ازای هر جدول (Table) یا Query (در Access)و (View در SQL) که داری یه ADOTable رو صفحه میزاری حالا باید این Object هایی که آوردی رو تنظیم کنیم یعنی ADOConnection به دیتابیس وصل میشه و تمام Tableها به اون وصل میشن و DataSourceها (که بعدا میگم) هرکدوم به یه Table وصل میشه اینجوری یه ارتباط با دیتابیس وجود داره که باعث امنیت بالاتری میشه و برنامه هم سریعتر ارتباط برقرار میکنه روش تنظیمشون به روش زیره :

از AdoConnection شروع میکنیم من دوست دارم اسم اونو بزارم ADOC که اول رووش یه بار کلیک میکنیم و از قسمت Object Inspector و گزینه Name اونو تغییر میدیم به چیزی که میخوایم (این یه کار اختیاریه) حالا باید ارتباط این شی رو با دیتابیس برقرار کنیم روی این Object  دوبار کلیک میکنیم بعد در کادر ظاهر شده دکمه Build رو کلیک می کنیم و کادر اصلی ADO دیده می شود در برگه اول در صورتی که دیتابیس Access باشد باید از لیست گزینه Microsoft Jet 4.0 OLE DB رو انتخاب و در برگه دوم در قسمت 1 باید آدرس فایل دیتابیس رو انتخاب کنیم. اگر دیتابیست Accesse  برو به قسمت بعد از تنظیمات SQL،

حالا اگر دیتابیس SQL باشد باید در برگه اولADO  از لیست گزینه Microsoft OLE DB Provider for SQL Server رو انتخاب می کنیم و برگه دوم رو اینجوری تنظیم میکنیم در قسمت 1 باید نام سروری که بانک روی اون قرار داره رو وارد کنیم اگه رو کامپیوتر خودته میتونی خالی بزاریش در قسمت دوم باید مشخصات کاربری که برای دیتابیس در SQL تنظیم کردید رو مشخص کنید (اگر هیچ تنظیم کاربری انجام ندادید گزینه Use a specific user name and password رو انتخاب کنید و در قسمت User Name مقدار sa رو وارد کن و Password رو خالی بزار) اگر پسورد تنظیم نکردید دوتا تیک رو هم علامت دار کن که هردوتاشون مشخصه چیکار میکنن، در قسمت 3 باید نام دیتابیس رو مشخص کنیم که بهتره گزینه اول رو انتخاب و نام بانک رو از لیست انتخاب کنی، تنظیمات مربوط به SQLتموم شد

بعد OK رو انتخاب کنیم و در کادر اول هم دوباره ok تا کادرهای باز بسته شود. تمام این تنظیمات در خصوصیت (Property) به نام ConnectionString از شی ADOC ذخیره شدن که شامل یک رشته است که بعدا اونو خودکار تنظیم میکنیم (یکم تحمل کن)،خب فقط مونده خاصیت LoginPromt که باید به False تنظیم بشه تا زمان فعال شدن ارتباط پیغام UserName&Password هست رو نشون نده حالا اگه همه چی رو درست تنظیم کرده باشید با تغییر خاصیت Connected از False به True ارتباط به درستی برقرار میشه و شما تونستید ارتباط رو برقرار کنید.

 حالا باید تمام AdoTable ها رو که آوردی رو با موس انتخاب کنی بعد خاصیت Connection اونارو به ADOC تغییر بدی تا از بانک استفاده کنن، حالا یه بار رو فضای خالی کلیک کن تا از حالت انخاب خارج بشن و یکی یکی باید بگی که به کدوم جدول (Table) وصل بشن این کارو با تنظیم خاصیت TableNameهرکدومشون انجام میدی (بهتره که بعد از تنظیم این خاصیت، خاصیت Name رو هم برابر اسم Table انتخاب شده باشه مثلا اگه TableName=TCar اونوخ Name=TCar) خب این کارو باید برای تک تک این AdoTableها انجام بدی و بعد همه رو دوباره انتخاب و خاصیت Active همه رو به True تغییر بدی. خب اگه درست کار رو انجام داده باشی بدون مشکل باید تمام جداولت باید فعال شده باشن.

حالا برای اینکه بتونی اطلاعات رو تو بانک ذخیره کنی و ببینی باید برای هر AdoTable یه شی DataSource از تو ابزارها تو قسمت DataAccess وارد صفحه کنی و خاصیت DataSet هرکدوم رو به نام جدولی که میخوایم وصل بشه مشخص می کنیم (بهتره Name هر کدوم رو مثه DataSet  تنظیم کنی مثلا DSTCar وقتی که به TCar تنظیمش میکنید). خب حالا دیگه تنظیمات بانک تا حدی تمام شد. به همین راحتی، توجه داشته باشید که فرمهای از نوع Data Module توی برنامه در حالت اجرا قابل دیدن نیستن. فقط میتونید از اشیاء موجود در اون استفاده کنید.

چقدر آسونه!!! بقیه رو تو پست بعدی می گم

|+| نوشته شده توسط محمد جاهد در یکشنبه 28 بهمن1386  |
 نحوه اجرای دستورات DOS در دلفی
در این مثال نحوه اجرای دستورات داس و نیز نحوه فرستادن پارامتر های مورد نیاز به آن نشان داده شده

http://www.4shared.com/file/32687642/bdfbdc40/Run_Command.html

|+| نوشته شده توسط محمد جاهد در جمعه 30 آذر1386  |
 یه مثال ساده برای استفاده از Property اشیاء موجود در صفحه در دلفی
این مثال نحوه عملکرد دستور GetProbValue را در دلفی به شما نشان می دهد

http://www.4shared.com/file/32687821/78360776/BFS1.html

|+| نوشته شده توسط محمد جاهد در جمعه 30 آذر1386  |
 آموزش سوكت پروگرامينگ در دلفي

 آموزش سوكت پروگرامينگ در دلفي

 

مقدمه :
اما نه اول بي مقدمه بگم : ) مقدمه پروتکلها و اصلا آي پي چيه و پروتکل چيه و پورت چيه را برين خودتون بخونين ياد بگيرين ...

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

خب من آموزشي که ميخوام بدم برنامه نويسي و توايع سوکت هست تحت ويندوز و نه لينوکس ( که در واقع پلتفرم مادر سوکتها هست ) و به زبان دلفي. برخلاف همه آموزشها و سورسهاي ديگه که اکثرا به زبان سي هستند.

خب اينم يه مقدمه کوچولو ... بي مقدمه اگه ميگفتم ميگفتن به دستور زبان و نگارش فارسي توهين کردي : )

خب بريم سر آموزش قدم به قدم ايجاد يک سوکت و اتصال به سرور و ارسال ديتا...

براي اين کار اول يه فرم معمولي دلفي ايجاد کنيد
و در قسمت
Uses
بايد يونيت زير را اضافه کنيد
WinSock
اين کار براي اين است که بتوانيد از توابعي که شرکت بورلند قبلا  زحمتشو کشيده بتونيد استفاده کند

بعد يک
Button روي فرم بزاريد و روي آن دوبار کليک کنيد و شروع کنيد به برنامه نويسي سوکت
توجه داشته باشين که اين الفباي سوکت پروگرامينيگ هست و ميتونه تا مطالب خيلي پيشرفته تر مثل
Thread (ريسمانها) و چند پردازشي هم زمان سوکتها و نوشتن سرورهاي اختصاصي ادامه پيدا کنه ..

خب بعد از اينکه يونيت فوق را اضافه کرديد بايد يک سوکت بسازيد
قبل از هر کاري بايد به قول معروف بارگزاري اصلي را انجام بديد که با دستور زير اين کار انجام ميشه

err:= WSAStartup(MakeWord(1,1),WSAData;(

اينجا تابع WsaStartup اين عمل را براي ما انجام ميده و يک عدد از نوع Integer بر ميگردونه که اگه
0 باشه يعني تابع با موفقيت عمل خودشو انجام داده و اگه -1 برگردونه يعني سيستم عامل سوکتها را پشتيباني نميکنه .
البته منم سوکت پروگرامينيگ ور‍ژن 1 را انتخاب کردم و ورژن 2 اون هم هست ولي 1 را چون اکثرا ساپورت ميکنن استفاده کردم .
اما پارامتر دوم يک استراکچر از نوع
TWSADATA هست که در قسمت تعريف متغيير ها ميتونيم اونو به صورت زير تعريف کنيم

Var
WSAData :TWSAData ;
Err : Integer;
SOCK : Tsocket

بر عکس اين تابع WSACleanup هست که معمولا در پايان برنامه استفاده ميشه ... که بعد راجع بهش توضيحات لازمه را ميدم .
خب بعد از اينکه اين تابع عدد 0 را با موفقيت برگردوند ميريم سراغ اصل قسمت يعني ايجاد يک سوکت
که به وسيله تايعي به نام
Socket() انجام ميشه

(
SOCK :=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP

در اينجا بايد يک متغير از نوع
Integer داشته باشيم که من اونو SOCK نامگذاري کردم و همانطور که در بالا مشاهده ميکنيد من اون از نوع TSOCKET تعريف کردم که در واقع فرقي زيادي با نوع Integer نميکنه و خود TSOCKET از نوع u_int ميباشد ( هرکدوم که عشقتون ميکشه تعريف کنيد ما که فرقي بينشون نديديم ) و ما بقي کارهامون با اين متغيير انجام ميشه و در واقع هندل اصلي ما براي ارسال و دريافت اطلاعات روي سوکت ساخته شده ميباشد .
اين تابع يکسري متغيير هم ميگيره که به مثلا
AF_INET هميشه براي پروتکلهاي اينترنت بکار ميره
يا به قول معروف کلا براي خانواده اينترنت : )
البته پروتکلهاي ديگه مثل
AF_IRDA هم هست که ما کاري باشون نداريم ....

دومين پارامتر يا ارگومان نوع اتصال را مشخص ميکنه که من نوع
TCP يا را انتخاب کردم که با مشخه SOCK_STRAM مشخص ميشه ..
و اگه اتصال از نوع
UDP ميخواستم بايد به جاي اون SOCK_DGRAM قرار ميدادم و.....

و پارامتر سوم هم نوعش بستگي دار به نوعي که در پارامتر دوم انتخاب کردم و چون حالا ما نوع
tcp يا Sock_Stram انتخاب کرديم به طبع بايد پارامتر سوم را IPPROTO_TCP انتخاب کنيم
اگر هم نوع
UDP بود ميتونستيم پارامتر سوم را IPPROTO_UDP انتخاب کنيم
خب ...
چنانچه اين تابع با موفقيت انجام بگيره مقدار
SOCK يه عدد غير 0 خواهد شد .
امتحان کنيد ببنيد مثلا با استفاده از دستور زير
ShowMessage(InttoStr(SOCK));
ميتونيد مقدارشو ببينيد.
معمولا يه عدد زوج بالاي 100 هست ... ولي هر عددي در کل ميتونه باشه .

خب اين تا اللان فقط 2 خط برنامه نويسي بود : )

-----------------------------------------------------------------------------------------

مرحله بعدي اتصال به سرور هست با استفاده از سوکتي که ساختيم
تابعي که به سرور ما را متصل ميکنه اسمش هست
Connect
اين تابع 3 تا پارامتر ميگره که اولي همان سوکتي هست که قبلا ساختيمش
SOCK
دومين پارامتر مشخصات سروري هست که بايد به اون متصل بشيم
خب
اينجا بايد به اين صورت عمل کنيم
يه متغيير مثلا به نام
SinServer
از نوع
sockaddr_in
به صورت زير
var
SinServer : SockAddr_in ;

تعريف ميکنيم و قبل از اينه در تابع کانکت از اون استفاده کنيم به صورت زير مشخصات سرور را توي اون مينويسيم
; (
ZeroMemory(@sinServer, sizeof(SinServer

sinServer.sin_family := AF_INET;
;(80
sinServer.sin_port := htons(
sinServer.sin_addr.s_addr:=inet_addr('192.168.100. 1’);

خب در 4 خط بالا 3 تابع که تاحالا توضيح نداده بودم مبينيد
اولي کارش اينه که محتويات پوينتري که قراره مشخصات سرور توش قرار بگيره ر را خالي ميکنه
البته توي دلفي اين عمل فکر ميکنم به صورت اتوماتيک توسط کامپايلر بورلند انجام بگيره ولي خب کار از محکم کاري عيب نميکنه : )
دومين تابع
HTONS
هست که مياد آدرس پورتي که ميخوايم را تبديل به نوع خاصي ميکنه _ ميشه گفت تابع تبديل کلمات دوبايتي به حال
BE هست
Big Ending
اگه در مورد نوعش سوالي دارين بفرمائين تا جداگونه توضيح بدم دقيقا کار اين تابع چيه ولي شما فعلا همينطور باش کار کنيد ( دونستنش زياد فايده کاربردي نداره )
و تابع
Inet_addr
که کار اين تابع اينه که يک رشته کاراکتري آدرس آي پي را ميگيره و به يک عدد چهاربايتي قالب
BE
تبديل ميکنه
( اين نوع
BE
را اگه خواستين جداگونه توضيح بدم ولي بازم دونستنش زياد فايده کاربردي نداره : )


بعد که مشخصات سرور را پر کردين با تابع کانکت به صورت زير به سرور متصل بشين
; )(
SOCK2 := Connect( SOCK,SinServer,sizeof(SinServer
اينجا بازگشتي تابع به
SOCK2
هست که عينا از نوع همون
SOCK
قبلي هست و يک عدد هست
مقدارش را هم براي اينکه مطمئن بشين درست به سرور متصل شدين حتما چک کنيد
اگر مقدار صفر نشون داد يعني درست وصل شدين و اگه -1 بود يعني اتصال با مشکل مواجه شده و بايد ببينيد روي اون آدرس سرور اصلا چنين پورتي باز هست يا خير...
خب بعد از اين مرحله اگه با موفقيت به سرور متصل شده بودين ميريم سر اصل مطب يعني ارسال اطلاعات به سرور

براي اين کار من به تابع نوشتم که پيشنهاد ميکنم شما هم از همين تابع استفاده کنيد تا راحتتر هر پکتي با هر شکلي ( اللخصوص از نوع اکسپلويتيشا ) به سرور ارسال کنيد

تابع زير را کپي کنيد داشته باشين
ک(
procedure Mys(str: String
var
;
I: Integer
begin
for I:=1 to Length(str) do
begin
;
Err :=send(sock,str[i],1,0)
end;
End;


اگه نگاه کنيد متوجه ميشين که من از تابعي به نام
SEND
استفاده کردم
اين تابع کارش ارسال اطلاعات توسط سوکت هست !
فکر کنم متوجه شدين چرا من يه تابع براش نوشتم : )

حالا مثلا يه خط از نوع رشته اي ميخوايم ارسال کنيد
بعد از تابع
Connect
از تابع بالا به صورت زير استفاده ميکنيم
Mys(‘SALAm ‘);
اگه يه برنامه سمت سرور داشته باشين که هرچي مياد را بهتون نشون بده متوجه ميشين که پيغام سلام براش ارسال شده .
---------------------
اما اگه توجه داشته باشين ما در سورسهاي اکسپلويتها جملات معمولي به کار نبرديم مثلا
0
XAB,0X22
و.....
خب اينجا ميتونيد از علامت
$
و تابع
Char
مثلا به صورت زير
Char($AF)+Char($24) S :=
MyS(S);

استفاده کنيد و يک رشته اکسپلويت را آماده کنيد به با تابع بالا به سمت سرور ارسال کنيد
$22,$
AB

بعد از ارسال هم ميتونيد ارتباط را با تابع
(
closesocket(Sock
قطع کنيد ...
err := WSACleanup
و با تابع بالا هم کلا شر حافظه اي که براي اين کار اختصاص داديم را بکنيم
کمبود
Ram
ادمو به چه کاراي کثيفي که وادار نميکنه : )
تابع
Recv را هم چون زياد ربطي به ارسال رشته هاي اکسپلويت نداشت توضيح ندادم
در بعضي از سورسها البته استفاده ميشه ..... شکل و قيافش هم تقريبا شبيه به شکل و قيانه همون تابع
SEND هست زياد فرقي نداره


اين هم اصول سوکت پروگرامينگ تحت دلفي
اگه سوال تخصصي تر هم بود تا اونجا که سوادم قد بده درخدمتم
اگه جايي قلط املايي داشتم به بزرگي خودتون ببخشين......

 

|+| نوشته شده توسط محمد جاهد در سه شنبه 8 خرداد1386  |
 آشنايي با DBISAM (بخش دوم)
آشنايي با DBISAM (بخش دوم): نوشتن يك برنامه Desktop
در اين مقاله به بررسي نحوه ايجاد يك برنامه Desktop با استفاده از DBISAM و چگونگي در نظر گرفتن پيش‌نيازهاي لازم براي تبديل آن به يك برنامه Client/Server در آينده خواهيم پرداخت. حالتهايي كه بررسي خواهند شد عبارتند از:
A) برنامه قرار است در محيط تك كاربره اجرا شود.
B) برنامه طوري نوشته شود كه امكان تبديل به نسخه Client/Server‌ در آينده در نظر گرته شود.

A) برنامه قرار است در محيط تك كاربره اجرا شود: در اين حالت با استفاده از كامپوننت Table و Query ويژه DBISAM (بنامهاي TDBISAMTable و TDBISAMQuery) و بدون انجام تنظيمات خاصي به جداول مربوطه متصل ميشويم. فرض كنيد ميخواهيم يك برنامه ساده ايجاد كنيم كه در آن از يك جدول براي نگهداري مشخصات كاربران استفاده ميشود.
مراحلي كه بايد طي شوند عبارتند از:
ايجاد جداول مربوطه: 1) برنامه Database System Utility را اجرا كنيد.
2) از منوي File گزينه New Table را انتخاب كنيد. پنجره New Table باز خواهد شد .
3) فيلدهاي جدول را بصورت زير تعريف كنيد: Primary Index Required Size Data Type Field Name Yes Yes 0 AutoInc UserID No Yes 20 String UserName No Yes 12 String Password No No 0 Date RegDate
4) اكنون از ليست Language گزينه Farsi‌ را انتخاب كنيد. اينكار باعث فعال شدن Sort و ديگر امكانات فارسي ميشود .
5) براي ذخيره جدول بر روي دكمه Save كليك كنيد.
6) در پنجره Save new table as گزينه Connection Type بصورت پيش فرض بر روي Local (Single/Multi User) قرار دارد و اين همان چيزي است كه ما اكنون ميخواهيم.
7) در قسمت Available Databases بر روي دكمه Select كليك كرده و مسير مقصد را مشخص كنيد.
8) در قسمت Save As نام فايل جدول را مشخص كنيد (در اينجا ما UserInfo را وارد كرده‌ايم).
استفاده از جداول ايجاد شده در يك پروژه در دلفي:
اكنون كه جداول موردنياز آماده شده‌اند وقت آنستكه از آنها در يك پروژه واقعي در دلفي استفاده كنيم. براي انجام اينكار مراحل زير را طي كنيد:
1) دلفي را اجرا كنيد.
2) در Component Palette صفحه DBISAM‌ را فعال كنيد .
3) يك كامپوننت TDBISAMTable بر روي فرمتان قرار دهيد.
4) در ////Object//// Inspector مسيري كه جداول را در آنجا ذخيره كرده‌ايد را در مشخصه DatabaseName وارد كنيد.
5) مقدار مشخصه TableName را از ليست انتخاب كنيد
UserInfo). 6) روي كامپوننت DBISAMTable1 بر روي فرم دابل كليك كنيد.
7) در پنجره //Form//1.DBISAMTable1 كه باز شده است رايت كليك و گزينه Add all fields را انتخاب كنيد. اينكار باعث ميشود فيلدهاي جدول بصورت كامپوننتهاي جداگانه در دسترس برنامه قرار گيرد.
8) اكنون از صفحه Data Access در Component Palette يك كامپوننت TDataSource بر روي فرم قرار دهيد.
9) مشخصه Dataset كامپوننت DataSource1 را بر روي DBISAMTable1‌ قرار دهيد.
10) اكنون وقت وصل كردن اين مجموعه به يك يا چند كامپوننت Data-Aware‌ است. از صفحه Data Controls در Component Palette يك كامپوننت TDBGrid انتخاب كرده و بر روي فرم قرار دهيد.
11) مشخصه DataSource كامپوننت DBGrid1 را بر روي DataSource1 قرار دهيد.
12) مشخصه Active كامپوننت DBISAMTable1 را برابر True‌ قرار دهيد. فرم تمام شده مانند تصوير 7 خواهد بود.
13) برنامه را اجرا كنيد.
اكنون ميتوانيد مانند برنامه‌هاي معمول نوشته شده با دلفي در DBGrid‌ به افزودن، ويرايش و حذف داده‌ها بپردازيد. همانطوركه ديديد ايجاد يك برنامه بانك اطلاعاتي معمولي با DBISAM درست مانند ايجاد يك برنامه با استفاده از BDE است و تنها تفاوت آن استفاده از TDBISAMTable بجاي TTable است. بطور كلي براي استفاده از DBISAM بجاي BDE كافي است معادل كامپوننتهاي BDE در DBISAM استفاده كنيد.

B) برنامه طوري نوشته شود كه امكان تبديل به نسخه Client/Server‌ در آينده در نظر گرفته شود: براي تعبيه امكان تبديل يك برنامه به نسخه Client/Server بايد 2 كامپوننت TDBISAMSession و TDBISAMDatabase را به فرم برنامه‌تان اضافه كنيد. Session چيست؟ در برنامه نويسي بانكهاي اطلاعاتي هر Session بمنزله يك كاربر ميباشد. بعنوان مثال اگر قرار باشد 3 كاربر به يك سرور بانك اطلاعاتي (Database Server) متصل شوند اين سرور 3 Session خواهد داشت.
كاربرد كامپوننت Database چيست؟
در برنامه نويسي بانكهاي اطلاعاتي در دلفي هر كامپوننت Database نماينده يك Database واقعي است. يك Database واقعي معمولا يك فولدر يا دايركتوري حاوي تعدادي جدول (Table) و فايلهاي مرتبط با آنها ميباشد. كامپوننت Database بما كمك ميكند تا تمام جداول مرتبط با هم را در قالب يك Database در پروژه گروه‌بندي كنيم. مزيت ديگر استفاده از كامپوننت Database اينستكه ميتوان كليه مشخصات يك Database واقعي (مسير نگهداري جداول، ...) را در آن تنظيم كرده و در كامپوننت‌هاي Table و Query بجاي مشخص كردن مسير محل نگهداري جداول براي هر كدام، فقط مشخصه DatabaseName آنها را برابر نام تعريف شده در كامپوننت Database قرار دهيم. بدين ترتيب با عوض كردن مقادير در كامپوننت‌ Database تمام Table ها و Query هاي متصل به آن نيز از تنظيمات آن پيروي خواهند كرد. اكنون كه با مفاهيم لازم آشنا شديد اقدام به انجام تغييرات در برنامه‌اي كه قبلا ايجاد نموده‌ايم مي‌كنيم تا امكان تبديل آن به نسخه Client/Server در آينده را به آن اضافه كنيم.
1) از صفحه DBISAM در Component Palette يك كامپوننت TDBISAMSession انتخاب كرده و بر روي فرم قرار دهيد.
2) مشخصه‌هايي كه فعلا بايد در اين كامپوننت تنظيم كنيد عبارتند از:
AutoSessionName = True PrivateDir فعال كردن مشخصه AutoSessionName باعث ميشود خود DBISAM، Session ها را بصورت مقتضي نامگذاري كند. اين امكان بخصوص زماني مفيد است كه چند كاربر با استفاده از يك نرم‌افزار واحد (مثلا همين برنامه) بخواهند به Database Server متصل شوند. در چنين حالتي اگر نام Session ها يكسان باشد كاربر اول وارد ميشود، اما ورود كاربران ديگر مشكلاتي را بهمراه خواهد داشت.امكان AutoSessionName اين مشكل را با نامگذاري اتوماتيك Session ها حل ميكند. DBISAM هنگام باز كردن يك جدول با استفاده از Table يا Query يك نسخه موقتي از جدول مربوطه را در جايي ايجاد ميكند و با آن كار ميكند، سپس تغييرات را در جدول اصلي اعمال ميكند. استفاده از اين جدول موقتي براي سرعت بخشيدن به كار با جداول Database‌ ميباشد. اگر شما مسيري را براي نگهداري فايلهاي موقتي ايجاد نكنيد سرعت كار با جداول (خصوص در محيط Client/Server) پايين خواهد بود. شما ميتوانيد با مقدار دادن به مشخصه PrivateDir در كامپوننت DBISAMSession اين مشكل را حل كنيد.
3) از صفحه DBISAM در Component Palette يك كامپوننت TDBISAMDatabase انتخاب كرده و بر روي فرم قرار دهيد.
4) در مشخصه DatabaseName آن يك عبارت (مثلا dbDatabase1) وارد كنيد.
5) همانطور كه مي‌بينيد مقدار SessionName در كامپوننت DBISAMDatabase1 بصورت اتوماتيك مقداردهي شده و برابر DBISAMSession1_1 قرار گرفته است.
6) به مشخصه DatabaseName كامپوننت DBISAMTable1 نگاه كنيد. اكنون اين مشخصه حاوي گزينه‌اي بنام dbDatabase1 (و يا عبارتي كه شما قبلا در مرحله 4 مشخص كرده‌ايد) ميباشد . آنرا انتخاب كنيد.
7) در كامپوننت DBISAMDatabase1 مشخصه Directory را برابر مسير كنوني جداول قرار دهيد.
8) مقدار مشخصه Active كامپوننت DBISAMTable1 را برابر True قرار دهيد. همانطوركه مي‌بينيد اينكار باعث فعال شدن اتوماتيك كامپوننت‌هاي DBISAMDatabase1 و DBISAMSession1 نيز ميشود.
اكنون برنامه ما اين قابليت را دارد كه در كمتر از چند دقيقه تبديل به نسخه Client/Server شود.

نطر یادتون نره ها

|+| نوشته شده توسط محمد جاهد در جمعه 24 آذر1385  |
 آموزش دلفی (مقدماتی)
قسمت اول
قبل از اين كه وارد محبث دستورات زبان پاسكال شويم، لازم است كه با مجموعه اي از عناصر و اشكال كد نويسي اين زبان آشنا شويم. سوالي كه من در اين فصل به دنبال پاسخ آن هستم اين است كه قواعد كلي براي نوشتن كد به زبان پاسكال چيست؟ پاسخ واحد و يكساني به اين سوال وجود ندارد زيرا كه سلايق مختلف مي تواند سبب ساخت اشكال گوناگوني از كدنويسي شد. با اين حال اصولي همچون توضيح نويسي، نوشتن با حروف بزرگ يا UpperCase، فاصله‌ها و ... وجود دارد كه شما بايد بدانيد. به طور كلي هدف تمامي انواع كد نويسي وضوح بيشتر است. مسئله مهم نوع كدنويسي شما نيست بلكه اين مهم است كه به سبك و سياق كدنويسي خود پايبند و وفادر باشيد.

توضيحات
در پاسكال، توضيحات را مي توان به هر يك از اشكال زير به كار برد:
{ اين يك توضيح است }
(* اين يك توضيح ديگر است *)
// اين يك توضيح يك خطي است و در انتهاي اين خط پايان مي يابد

اولين حالت از همه كوتاهتر است و معمولا از همه بيشتر استفاده مي شود. حالت سوم نيز از ++C استعارفه گرفته شده است و تنها در نسخه هاي 32 بيتي دلفي عمل مي كند. توضيحات از اين نوع وقتي كه شما مي خواهيد توضيحات خلاصه اي را راجع به يك خط از كد بدهيد بسيار مفيد هستند.
در كدهاي اين كتاب تلاش من بر اين است كه توضيحات را به صورت ايتاليك           (و كليدواژه ها را به صورت سياه) دربياورم، تا تقريبا شبيه به شكل Highlight كردن خود دلفي باشد.

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


{ ..... يكسري كد پاسكال
{يك توضيح نمونه}
....... يكسري كد پاسكال}


در صورتي كه مي توانيد اين كد را به صورت زير بنويسيد

{ ...... يكسري كد پاسكال
اين يك توضيح درست است//
...... يكسري كد پاسكال}



توجه داشته باشيد كه اگر علامت $ كنار يك علامت { بيايد، آنگاه يك راهنماي كامپايلر خواهد بود كه شكل عمومي آن از اين قرار است: {+X$}

استفاده از حروف بزرگ
كامپايلر پاسكال مثل بسياري كامپايلرهاي ديگر به حروف بزرگ و كوچك حساس نيست. بنابراين نام Myname، MyName، myName و MYNAME همگي دقيقا يكي هستند. روي هم رفته، اين مساله صراحتا مثبت است، زيرا زبان هايي كه حساس به شكل حروف هستند سبب ايجاد خطاهاي بسياري خواهند شد.
توجه داشته باشيد كه شما بايد از حروف بزرگ براي بيشتر قابل خواندن بودن كد استفاده كنيد. يك راه بسيار عالي براي اين مساله بزرگ تايپ كردن حروف اول كلمات است (شما نمي توانيد در بين نام متغييرها از فاصله استفاده كنيد). مثال:

MyLongIdentifier
MyVeryLongAndAlmostStupidIdentifier

بايد توجه داشته باشيد كه فاصله‌ها، خطوط و تب‌هايي كه شما به كد خود اضافه مي كنيد، فاصله هاي سفيد خوانده مي شوند و همگي توسط كامپايلر ناديده گرفته مي شوند. لازم است كه از فاصله هاي سفيد جهت بالا بردن توانايي خواندن متن خود استفاده كنيد؛ اين فاصله هاي سفيد هيچ تاثيري در كامپايل شدن كد ندارند.
بر خلاف BASIC، پاسكال به شما اجازه مي دهد كه چند خط كد را در يك خط طولاني بنويسيد. فقط كافي است در انتهاي هر خط از سيميكلون (؛) استفاده كنيد و پس از آن خط بعدي را بنويسيد.

Highlight كردن نحوي

براي ساده تز شدن خواندن و نوشتن كد هاي پاسكال، اديتور دلفي خاصيت به نام Highlight كردن نحوي يا Syntax Highlighting دارد. بنابر معناي هر يك از كلماتي كه شما در اديتور دلفي تايپ مي كنيد، هر كلمه رنگ تازه اي مي يابد. به طور پيش فرض كليدواژه ها سياه هستند، رشته ها و توضيحات به صورت رنگي و اغلب ايتاليك هستند و همين جور الي اخر.
احتمالا كلمات رزرو شده، توضيحات و رشته ها بيشترين اجزايي هستند كه از اين خاصيت سود مي جويند. شما به يك نگاه مي توانيد از كليدواژه هاي اشتباه تايپ شده، رشته اي كه به درستي بسته نشده است و طول يك توضيح چند خطي آگاه شويد.
شما مي توانيد به سادگي رنگ هاي استفاده شده به وسيله IDE دلفي را از طريق صفحه Editor Colors پنجره Environment Options تغيير دهيد. ( به شكل 2.1 نگاهي بياندازيد) اگر شما براي خودتان كار مي كنيد رنگهايي را كه بيشتر دوست مي داريد انتخاب كنيد. اگر شما با ساير برنامه نويسان به صورت گروهي كار مي كنيد همگي بايد يك رنگ بندي استاندارد را قبول كنيد. من متوجه شده ام كه كار كردن با يك رايانه با رنگ بندي هاي متفاوت كه به وسيله افراد مختلف استفاده مي شود واقعا سخت است.


استفاده از قالب هاي كد
دلفي 3 يك خصوصيت جديد را راجع به ويرايش كد معرفي نمود. با استفاده از اين خاصيت لازم نيست شما تمامي حروف يك كلمه يا دستور را تايپ كنيد. فقط چند حرف اول آن را تايپ كنيد و كليد Ctrl+J را براي كلمات كليدي و Ctrl+Space را براي ساير كلمات و دستورات استفاده كنيد. در اين صورت مشاهده خواهيد كرد كه منويي ظاهر خواهد شد و دستوراتي را كه با حروف مورد نظر شما شروع مي شوند را به نمايش خواهند گذاشت.

كلمات كليدي
كلمات كليدي، تمام لغاتي هستند كه بوسيله Object Pascal رزرو شده اند و در نقش هاي اساسي را در زبان بازي مي كنند. كلمات كليدي نمي توانند به عنوان نام متغييرها استفاده شوند.
در جدول 2.1 ليستي از اين كلمات را مي بينيد.

جدول 2.1 - كليدواژه ها و ساير كلمات كليدي در آبجكت پاسكال

كلمه كليدي نقش
absolute directive (variables)
abstract directive (method)
and operator (boolean)
array type
as operator (RTTI)
asm statement
assembler backward compatibility (asm)
at statement (exceptions)
automated access specifier (class)
begin block marker
case statement
cdecl function calling convention
class type
const declaration or directive (parameters)
constructor special method
contains operator (set)
default directive (property)
destructor special method
dispid dispinterface specifier
dispinterface type
div operator
do statement
downto statement (for)
dynamic directive (method)
else statement (if or case)
end block marker
except statement (exceptions)
export backward compatibility (class)
exports declaration
external directive (functions)
far backward compatibility (class)
file type
finalization unit structure
finally statement (exceptions)
for statement
forward function directive
function declaration
goto statement
if statement
implementation unit structure
implements directive (property)
in operator (set) - project structure
index directive (dipinterface)
inherited statement
initialization unit structure
inline backward compatibility (see asm)
interface type
is operator (RTTI)
label declaration
library program structure
message directive (method)
mod operator (math)
name directive (function)
near backward compatibility (class)
nil value
nodefault directive (property)
not operator (boolean)
object backward compatibility (class)
of statement (case)
on statement (exceptions)
or operator (boolean)
out directive (parameters)
overload function directive
override function directive
package program structure (package)
packed directive (record)
pascal function calling convention
private access specifier (class)
procedure declaration
program program structure
property declaration
protected access specifier (class)
public access specifier (class)
published access specifier (class)
raise statement (exceptions)
read property specifier
readonly dispatch interface specifier
record type
register function calling convention
reintroduce function directive
repeat statement
requires program structure (package)
resident directive (functions)
resourcestring type
safecall function calling convention
set type
shl operator (math)
shr operator (math)
stdcall function calling convention
stored directive (property)
string type
then statement (if)
threadvar declaration
to statement (for)
try statement (exceptions)
type declaration
unit unit structure
until statement
uses unit structure
var declaration
virtual directive (method)
while statement
with statement
write property specifier
writeonly dispatch interface specifier
xor operator (boolean)


عملگرها در پاسكال

Unary Operators (Highest Precedence)
@ Address of the variable or function (returns a pointer)
not Boolean or bitwise not
Multiplicative and Bitwise Operators
* Arithmetic multiplication or set intersection
/ Floating-point division
div Integer division
mod Modulus (the remainder of integer division)
as Allows a type-checked type conversion among at runtime (part of the RTTI support)
and Boolean or bitwise and
shl Bitwise left shift
shr Bitwise right shift
Additive Operators
+ Arithmetic addition, set union, string concatenation, pointer offset addition
-

Arithmetic subtraction, set difference, pointer offset subtraction

or Boolean or bitwise or
xor

Boolean or bitwise exclusive or

Relational and Comparison Operators (Lowest Precedence)
= Test whether equal
<> Test whether not equal
< Test whether less than
> Test whether greater than
<= Test whether less than or equal to, or a subset of a set
>= Test whether greater than or equal to, or a superset of a set
in Test whether the item is a member of the set
is Test whether object is type-compatible (another RTTI operator)

|+| نوشته شده توسط محمد جاهد در پنجشنبه 23 آذر1385  |
 درباره DBISAM بیشتر بدانیم (قسمت اول)
درباره DBISAM :
در اين مقاله ميخواهيم شما را با DBISAM ، پديده دنياي بانكهاي اطلاعاتي آشنا كنيم. يك راست و بدون مقدمه ميرويم سر اصل مطلب. اين ليست قابليتهاي اين Database Engine است:
پشتيباني كامل 100 زبان بين المللي ( از جمله فارسي و انگليسي ) پشتيباني تاريخ هجري شمسي ايندكس و سورت صحيح فارسي تنظيمات خاصي براي استفاده بصورت Client/Server نياز نيست .
بازده استثنايي وبهينه سازي Filtering وSQL .
امكانات بازسازي و تعمير درون ساخت .
امكان تبديل فرمت تمام انواع Database به فرمت DBISAM .
داراي برنامه كمكي ويژه جهت Browse ،Restructure ، Update وجستجوي Database پشتيباني كامل Blob ،شامل block size قابل تنظيم بصورت دلخواه Buffered Transaction جهت حفاظت داده‌ها هنگام قطع برق و امثال آن ايندكس هاي Primary و Secondary پشتيباني كامل Filter فايلهاي داده in-memory با پشتيباني Streaming جستجوي در ايندكس با استفاده از علامتهاي (* ، ؟) تعيين محدوده (بازه) با تعداد دقيق ركورد‌ها پشتيباني فيلد Auto-Increment اعداد منطقي ترتيبي پشتيباني كامل NULL Min/Max وبررسي Validity مقادير پيش فرض فشرده سازي كليدها وايندكس‌ها فشرده سازي اتوماتيك ايندكس‌ها پشتيباني Database هاي read-only برروي CD-ROM پشتيباني كامل BCD ايندكس‌هاي Case-Insensitive حفاظت از داده ها با Password-Encryption ايندكس‌هاي ثانويه Unique امكان تعريف Version Numbering فايلهاي داده توسط كاربر
DBISAM اصلا چيست؟
DBISAM يك موتور Database مانند BDE ، SQL Server و Interbase است، با امكانات خارق‌العاده. عدم نياز به هيچگونه Driver يا DLL براي اجراي برنامه جالب است نه؟
يعني برنامه شما براي اجرا به هيچگونه درايور يا DLL اي نياز ندارد، چرا كه تمام موتور Database و ملحقات آن مستقيما به درون فايل Exe شما كامپايل ميشود. حجمي هم كه به فايل شما اضافه ميشود مقداري جزئي و قابل چشم پوشي است. اين در حالي است كه BDE براي باز كردن يك فايل ساده Paradox به مجموعه‌اي از درايورها نياز دارد و برنامه شما در صورت عدم حضور آنها با نمايش يك Exception با يك دردسر اساسي روبرو خواهد شد. استفاده از DBISAM بعنوان يك جايگزين براي BDE اكثر برنامه نويساني كه با BDE كار كرده اند با مشكلات آن به خوبي آشنا هستند: خراب شدن ايندكس‌ها ، خراب شدن فايلهاي داده در صورت قطع برق ، مشكل User Lock و ... اينها همه مشكلاتي است كه در DBISAM حل شده است .
تبديل برنامه Desktop به Client/Server هنگامي كه از يك برنامه‌نويس خواسته مي‌شود تا برنامه‌اي كه با BDE نوشته است را تبديل به نسخه Client/Server كند كابوس او شروع مي‌شود، زيرا بايد اكثر بخشهاي برنامه‌اش را باز نويسي كند . اما با استفاده ازDBISAM اين كار به آساني مقدار‌دهي يك مشخصه در كامپونت Session است: Session Type := StRemote; بله به همين سادگي است‌! يعني با صرف زماني كمتر از چند دقيقه مي‌توانيد هم سرور DBISAMرا نصب و راه اندازي كنيد و هم برنامه‌تان را تبديل به نسخه Client /Server كنيد. هيجان انگيز است! نه ؟ نصب Database Server در كمتر از چند دقيقه! اگر تا كنون Database Engine هاي ديگر مانند SQL Server و امثال آن را نصب كرده باشيد حتما ميدانيد كه عمليات نصب و پيكربندي آنها نزديك به يكساعت وقت ميگيرد، البته بشرطي كه تجربه لازم در نصب و پيكربندي آنها را داشته باشيد، در غير اينصورت بايد ساعتها وقت را نيز براي يادگيري موارد فوق كنيد، اين درحالي است كه مي‌توانستيد چنين وقتي را صرف رسيدن به امور مهمتري مانند رسيدگي به برنامه خود كنيد. اما نصب Database Server اين سيستم در 1 دقيقه نيز ممكن است!!! چگونه؟ با طي مراحل فوق: انتخاب كامپيوتري كه قرار است نقش Database Server را بعهده بگيرد. انجام تغييرات لازم در فايل .INI مربوطه (از جمله مشخص كردن IP Address سرور، ... ). اجراي Database Server (كه يك فايل Exe بيش نيست!). قابليت اجراي برنامه ها در حالت Read-Only فرض كنيد ميخواهيد برنامه‌اي بنويسيد كه حاوي يكسري داده باشد (مانند ديكشنري، برنامه هاي مالتي‌مديا، دايرة‌المعارف ، و ...) ونيز برنامه شما قرار است در يك محيط Read-Only (مثلا از روي CD يا DVD) اجرا شود . دراين حالتDBISAM بشما اجازه مي‌دهد بدون هيچگونه تغييري در كد برنامه، آنرا به محيط مقصد (CD ، DVD) منتقل كنيد و بدون نياز به انجام هيچ تغيير خاصي آنرا اجرا كنيد. پشتيباني زبان فارسي DBISAM اولين Database Engine اي است كه زبان Farsi را هم تحويل گرفته و آ نرا پشتيباني مي‌كند، شما هنگام طراحي جداول مي‌توانيد زبان جدول را بر روي "Farsi" قرار دهيد .
در اينصورت اگر روي يكي از فيلد هاي حاوي حروف فارسي ايندكس تعريف كنيد خواهيد ديد كه عبارات شما بر اساس ترتيب حروف فارسي مرتب خواهند شد
1- پشتيباني زبان فارسي توسط DBISAM
2- سورت صحيح عبارات فارسي بر اساس ترتيب الفباي فارسي پشتيباني تاريخ هجري شمسي حرفه‌اي‌هاي Database مي‌دانند كه اكثر Database Engine هاي موجود محدوده تاريخ شمسي را بعنوان بازه صحيح قبول ندارند و اجازه ذخيره شدن آن در جداول با فيلد Date را نمي‌دهند، اما DBISAM از اين قاعده پيروي نمي‌كند. يعني شما مي‌توانيد در يك فيلد از نوعDate در جداول DBISAM تاريخي مانند 10/5/1382 را بدون هيچ مشكلي ذخيره كنيد .
امكان Partial Search برروي فيلدهاي فارسي در DBISAM امكان جستجو با استفاده از علائم * و ؟ بر روي فيلد هاي فارسي نيز وجود دارد. بدين ترتيب شما مي توانيد بعنوان مثال با استفاده از عبارت *محمد* در تركيب جستجو كليه موارد شبيه به كلمه فوق ( مانند "محمد رضا"، "محمدي") را پيدا كنيد .
بهينه‌سازي فيلد‌هاي Image هنگامي كه مي‌خوا‌هيد تصاوير را در جداول DBISAM نگهداري كنيد ، سيستم بصورت اتوماتيك آنها را فشرده و بهينه‌سازي مي‌كند تا فضاي كمتري براي نگهداري آنها مورد‌نياز باشد و نيز سرعت خواندن و نوشتن آنها در سيستم افزايش يابد .
امكان بازسازي و تعمير جداو ل DBISAM داراي متدهاي ويژه تعمير و بازسازي database ميباشد. با استفاده از اين امكان برنامه‌نويس مي‌تواند هر گاه كه نياز به تعمير database دارد با اجراي متدي مانند Table1.Repair; جدول مورد نظر را تعمير كند.
امكان تبديل انواع database هاي ديگر به فرمت DBISAM فرض كنيد مي‌خواهيد جداول خود را از Interbase ، SQL Server و يا Paradox بهDBISAM تبديل كنيد. براي انجام اين كار كافي است يك Alias به database مبدا تعريف و يا مسير محتوي فايلها database مبدا را براي DBISAM Transfer Utility مشخص كنيد . ظرف مدت كوتاهي ابزار فوق ساختار جداول و تمام داده‌هاي درون آنها را به فرمت DBISAM تبديل خواهد كرد.
دسترسي به Source Code كل سيستم! هنگامي كه شما نسخه كامل DBISAM را نصب ميكنيد سورس كليه بخشهاي سيستم آن مانند سورس Server ، سورس Component ها، سورس ابزارهاي جانبي هم بهمراه سيستم اصلي نصب ميشوند. بدين ترتيب علاوه بر تمام مزاياي ديگر اين سيستم، هرگاه نياز به مطالعه نحوه كار يكي از بخشها، يا نياز به ايجاد تغيير در يك بخش از سيستم يا ابزارهاي جانبي آن داشتيد ميتوانيد براحتي اين كار را انجام دهيد.
نكته فوق‌العاده اين است كه حتي كامپوننتهاي استفاده شده براي ساختن ابزارهاي كمكي DBISAM نيز بهمراه سورس كامل‌شان بهمراه DBISAM (در قالب يك tab بنام DBISAM Utilities) در محيط IDE دلفي نصب ميشوند و شما بدون هيچگونه مشكلي ميتوانيد كل سيستم را هر وقت كه نياز داشتيد re-compile كنيد! ]اينم يواشكي بهتون بگم كه كامپوننتهاي موجود در DBISAM Utilities در حقيقت همان كامپوننتهاي معروف InfoPower هستند كه راست به چپ را نيز پشتيباني مي‌كنند! يادتون نره يه نگاهي هم به آنها بياندازيد.
در مقالات بعدي اين سري شما را با نحوه ايجاد برنامه‌هاي Desktop و Client/Server با استفاده از DBISAM آشنا خواهيم كرد.
نظر یادتون نره
|+| نوشته شده توسط محمد جاهد در جمعه 26 آبان1385  |
 
 
بالا