ed "1" TYPE="application/x-mplayer2" src="http://www.arianmusic.com/music/arian2/winMedia/parvaz.wma" mce_src="http://www.arianmusic.com/music/arian2/winMedia/parvaz.wma" autostart="true" WIDTH="350" HEIGHT="250" align="left">
¤ نوشته شده در ساعت 11:08 توسط حق پرست |
اينم يه عکس باحال از مرد عنکبوتی

¤ نوشته شده در ساعت 08:32 توسط حق پرست |

¤ نوشته شده در ساعت 04:36 توسط حق پرست |
اجزا یک برنامه حرفه ای
در اين مقاله قصد دارم راجع به موارد كاربردي بحث كنم. براي شروع نيازهاي يك برنامه كاربردي را براي شما تشريح مي كنم. يكي از مهترين اجزاي يك برنامه حرفه اي DataBase مي باشد كه دلفي با قدرت از آن پشتيباني مي كند. دلفي از بانكهاي زيادي همچون Paradox, Access, SQL, Oracel, Fox Pro و غيره حمايت مي كند. دلفي همچنين ابزار زيادي براي استفاده از بانكهاي اطلاعاتي در اختيار ما مي گذارد. دلفي همچنين DataBase DeskTop را در اختيار ما مي گزارد تا بانكهاي اطلاعاتي را توسط آن ايجاد كرده و عمليات ورود اطلاعات را انجام دهيم. در مقالات بعدي به طور مشروح به بانك اطلاعاتي و طريقه استفاده از آن در دلفي مي پردازيم. از ديگر اجزا يك برنامه حرفه اي Instuler مناسب است كه با وجود متعلقات زيادي كه همراه يك برنامه حرفه اي بايد روي سيستم كاربر نهايي قرار گيرد اجتناب ناپذير بنظر مي رسد. تصور اينكه كاربر نهايي مجبور باشد خودش فايلهاي مورد نياز را در پوشه مناسب قرار داده و Registry را تنظيم كرده و موتور بانك اطلاعاتي مناسب را نصب كنند ActiveX ها را Register نمايند و متغيرهاي محيطي را تعريف كنند و ShortCut هاي مناسب را براي دسترسي به برنامه در Startmenu يا Desktop قرار دهد بسيار گيج كننده و غير ممكن است. دلفي اين مشكل را نيز با ارائه InstallShield Express حل كرده كه اگر فرصت شود در مقاله ديگري به تشريح قابليتهاي آن مي پردازيم. البته اين به اين معني نيست كه شما مجبوريد از اين Installer استفاده كنيد Installer هاي زيادي وجود دارند كه شما مي توانيد از آنها استفاده كنيد. جزء ديگر يك برنامه حرفه اي Interface يا رابط كاربر مي باشد و اين همان فرمهايي است كه كاربر نهايي مي بيند و از آنها براي ارتباط برقرار كردن با برنامه شما استفاده مي كند. ايجاد يك Interface مناسب مي تواند كاربران را در استفاده موثر و آسان از برنامه شما ياري دهد. استاندارد هاي زيادي در اين زمينه وجود دارد كه شما مي توانيد از آنها بهره ببريد. يكي از مباحثي كه در اين ضمينه مطرح مي شود GUI است كه در فرصت مناسب به آن مي پردازيم. اجزا ديگري نيز هستند كه در برخي از برنامه ها كاربرد پيدا مي كنند. مثلا Skin يا پوسته كه همان ظاهر برنامه مي باشد كه برنامه را با ظاهري گرافيكي مي آرايد. بعضي برنامه ها Skin هايي ايستا و بعضي داراي ظاهري پويا مي باشند. اين مبحث نيز بايد در يك مقاله جدا مورد بررسي قرار گيرد. همچنين دلفي داراي قابليتهاي بيشماري براي ايجاد يك محيط برنامه نويسي تيمي با امكان Integrated Debug و مديريت پروژه و نظارت بر چرخه زندگي يك برنامه مي باشد.
¤ نوشته شده در ساعت 04:33 توسط حق پرست |
تبدیل اعداد به حروف درزبانهای برنامه نویسی گوناگون
بسمه تعالی


می خواهیم تابعی بنویسیم که یک عدد بگیرد و آن را به حروف تدیل کند. ورودی و خروجی تابع از نوع string هستند.

در این مقاله، متن برنامه به زبان delphi آورده شده است. همچنین متن برنامه به زبان های c#, vb6, js نیز ضمیمه مقاله هستند. { نمونه کد مقالات در زیانهای برنامه نویسی گوناگون }

با استفاده از برنامه به زبان vb6 می توانید از این قابلیت در excel, access نیز استفاده کنید.


جدول زیر مثالی از نحوه عملکرد تابع می باشد:


عدد

به حروف

123

يكصد و بيست و سه

123000

يكصد و بيست و سه میلیون

123000000

يكصد و بيست و سه میلیارد

7210

هفت هزار و دويست و ده

1200005

يك ميليون و دويست هزار و پنج

1648195

يك ميليون و ششصد و چهل و هشت هزار و يكصد و نود و پنج


قبل از اینکه دست به کار کد نویسی بشویم باید مسئله را تحلیل کنیم و راه حل آن را دقیق بدست بیاوریم. وقتی که راه حل را یافتیم، می توانیم راه حل مورد نظرمان را به برنامه تبدیل کنیم!


با این ایده ساده کارمان را شروع کنیم که : نام هر عدد را می توانیم با استفاده از ترکیب تعدادی اجزای اصلی به دست آورد. با این ایده، باید اجزای اصلی را به دست آوریم. (منظور از اجزای اصلی قسمت های تکراری در اسامی اعداد است برای مثال : یک، دو، سه، بیست، پانصد، هزار، میلیون و ... می باشد).


علاوه بر اجزای اصلی که مبنای تشکیل اعداد می باشند، با کمی دقت در مثال بالا متوجه می شوید که ترکیب های سه رقمی اعداد، خود می توانند به عنوان اجزای تکرار شونده به کار روند. بر حسب اینکه ترکیب سه رقمی مورد نظر در چه جایگاهی قرار بگیرد، پسوند های هزار، میلیون، میلیارد و ... را می توان به آن اضافه کرد. مثلا ترکیب سه رقمی 123 را در نظر بگیرید. اگر 123 در سه رقم اول قرار بگیرند، آن را یکصد و بیست و سه می خوانیم و اگر در سه رقم دوم قرار بگیرند آن را یکصد و بیست و سه هزار می خوانیم و ...


مراحل زیر برای تبدیل اعداد به حروف می توان پیشنهاد کرد :
تجزیه عدد مورد نظر به قسمت های سه رقمی
ساختن نام هر یک از قسمت های سه رقمی (این مرحله ر باید بیشتر بررسی کنیم.)
افزودن پسوند مناسب به قسمت های سه رقمی
ترکیب قسمت های سه رقمی


برای ساختن نام قسمت های سه رقمی به روش زیر عمل می کنیم:

ابتدا باید تک تک رقم های عدد را به دست بیاوریم. می توانیم رقم ها را در یک آرایه ذخیره کنیم. با توجه به اینکه هر رقم با توجه به جایگاهی که در آن قرار دارد خوانده می شود باید جایگاه رقم به دست آمده را نیز در نظر داشته باشیم. . مثلا رقم 3 در عدد 123 چون در یکان قرار دارد به صورت "سه" خوانده می شود، اما در عدد 135 به صورت "سی" خوانده می شود و در عدد 398 به صورت "سیصد" خوانده می شود.


حالت های استثنا کارمان را سخت می کنند و باید همه آن ها را شناسایی کنیم. مثلا اعداد 10 تا 19 حالت استثنا هستند.


فهرست زیر شامل اجزای اصلی مورد نیاز می باشد :


صفر، یک، دو، سه، چهار، پنج، شش، هفت، هشت، نه

بیست، سی، چهل، پنجاه، شصت، هفتاد، هشتاد، نود

ده، یازده، دوازده، سیزده، چهارده، پانزده، شانزده، هفده، هجده، نوزده

یکصد، دویست، سیصد، چهارصد، پانصد، ششصد، هفتصد، هشتصد، نهصد

هزار، میلیون، میلیارد، تریلیون


البته آرایه هایی که در برنامه تعریف شده اند، اعضای دیگری نیز وجود دارند که برای پوشش دادن حالت های استثنا در نظر گرفته شده اند.


متن برنامه دلفی به همراه توضیحات:



const

yekan : array[0..9] of string = ('صفر','يک','دو','سه','چهار','پنج','شش','هفت','هشت','نه');

dahgan : array[0..9] of string = ('','','بيست','سي','چهل','پنجاه','شصت','هفتاد','هشتاد','نود');

dahyek : array[10..19] of string = ('ده','يازده','دوازده','سيزده','چهارده','پانزده','شانزده','هفده','هجده','نوزده');

sadgan : array[0..9] of string = ('','يکصد','دويست','سيصد','چهارصد','پانصد','ششصد','هفتصد','هشتصد','نهصد');

base : array[0..4] of string = ('','هزار','ميليون','ميليارد','تريليون');


// تابع تبديل عدد به حروف

function num2str(snum : string) : string;

// تابع تبدیل عدد سه رقمی به حروف

function getnum3(num3 : integer) : string;

var

s : string;

d1, d2, d3, d12 : integer;

begin

d12 := num3 mod 100; // دو رقم اول

d3 := num3 div 100; // صدگان

if d3 <> 0 then

s := sadgan[d3] + ' و ';

// نام گذاري اعداد 10 تا 19 در بين

// اعداد دو رقمي استثنا است

if (d12 >= 10) and (d12 <= 19) then

begin

s := s + dahyek[d12];

end

else

begin

d2 := d12 div 10; // دهگان

if d2 <> 0 then

s := s + dahgan[d2] + ' و ';

d1 := d12 mod 10; // يکان

if d1 <> 0 then

s := s + yekan[d1] + ' و ';

// حذف حرف <و> اضافي

s := copy(s, 1, length(s) - 3);

end;

getnum3 := s;

end;


var

L, i, b : integer;

stotal : string;

begin

// اگر عدد صفر بود، يکراست نتيجه را برگردان

if snum = '0' then

result := yekan[0]

else

begin

// براي اينکه بتوان عدد را به قسمت هاي سه رقمي تقسيم کرد

// به سمت چپ عدد، به اندازه کافي صفر مي افزاييم

for i := Length(snum) to ((Length(snum) - 1) div 3 + 1) * 3 - 1 do

snum := '0' + snum;


L := Length(snum) div 3 - 1; // تعداد قسمت هاي سه رقمي منهاي يک


// سه رقم سه رقم حلقه را تکرار کن

// از چپ به راست

for i := 0 to L do

begin

// به دست آوردن سه رقم مورد نظر

b := strtoint(copy(snum ,i * 3 + 1, 3));

// اگر سه رقم به دست آمده صفر باشد، در نام عدد تاثيري ندارد

// نام قسمت سه رقمي را بدست مي آوريمgetnum3 با استفاده از تابع

// پسوند را به آن اضافه مي کنيمbase با استفاده از آرايه

if b <> 0 then

stotal := stotal + getnum3(b) + ' ' + base[L - i] + ' و ';

end;

// حذف حرف <و> اضافي

stotal := copy(stotal, 1, length(stotal) - 3);

result := stotal;

end;

end;


{ نمونه کد مقالات در زیانهای برنامه نویسی گوناگون }

























¤ نوشته شده در ساعت 04:32 توسط حق پرست |
دلفی بخش 9
آموزش دلفی (بخش نهم)



محدودكردن تغییر اندازه فرم در دلفی گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages، تابع WM_GetMinMaxInfo میباشد.


unit MinMax;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm) private { Private declarations } procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage); Begin inherited; with PMinMaxInfo(MSG.lparam)^ do begin with ptMinTrackSize do begin X := 300; Y := 150; end; with ptMaxTrackSize do begin X := 350; Y := 250; end; end; end;
end.






¤ نوشته شده در ساعت 04:31 توسط حق پرست |
دلفی بخش 8
آموزش دلفی (بخش هشتم)



استفاده از DLLها در دلفی ایجاد یک DLL با استفاده از منو فایل گزینه New Items را انتخاب کنید و آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demo باشد و بانام UDemo.pas آنرا ذخیره کرده باشید. باید در فایل DLL بصورت زیر کد نویسی نمایید:


library demodll;
{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }
uses SysUtils, Classes, UDemo in 'UDemo.pas' {Demo};
{$R *.res} procedure ShowdemoForm;stdcall; begin Demo :=Tdemo.Create(nil); demo.Show; end;
function ShowdemoFormModal:integer;stdcall; begin demo :=Tdemo.Create(nil); Result := demo.ShowModal; end;
Exports ShowDemoForm, ShowdemoFormModal; begin end.

دقت کنید که نام DLL فوق DemoDll می باشد و با نام DemoDll.dpr ذخیره گردیده است.
حال بر روی فرم موجود تمام دکمه‌ها و آبجکت‌های مورد نظرتان را اضافه و کد نویسی کنید (اختیاری). در پایان در منو Project گذینه Build DemoDll را انتخاب کرده و اجرا نمایید. فایلی با نام DemoDll.dll ایجاد می گردد که برای استفاده آماده است.

استفاده از یک DLL بصورت دینامیکی برای استفاده از یک DLL ‌بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLL شما موجود است بصورت زیر تعریف نمایید:



unit UMain;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TShowdemoFormModal= Function :integer; . . .

دقت کنید که نام برنامه انتخابی پیش فرض Main و با نام UMain.pas ذخیره گشته است. حال برای لود کردن DLL یادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت زیر کد نویسی کنید:



var hndDLLHandle:THandle; ShowdemoFormModal:TShowdemoFormModal;
procedure TFMain.Button1Click(Sender: TObject); begin try hndDLLHandle:=LoadLibrary('Demodll.dll');
if hndDLLHandle <> 0 then begin @ShowdemoFormModal:=getProcAddress(hndDLLHandle,'ShowdemoFormModal');
if addr(ShowdemoFormModal) <> nil then begin ShowdemoFormModal; end else showmessage ('function not exists ...'); end else showMessage('Dll Not Found!'); finally freelibrary(hndDLLHandle); end; end;




¤ نوشته شده در ساعت 04:30 توسط حق پرست |
دلفی بخش 7
آموزش دلفی (بخش هفتم)



نصب ProgressBar روی StatusBar در دلفی StatusBar می باشد. انجام این کار بسیار ساده است. برای این کار کافی است بر روی فرم خود یک StatusBar اضافه نمایید حالا در قسمت تعاریف متغیر های عمومی کد زیر را بنویسید: ProgressBar1: TprogressBar;
در ادامه دستورات زیر را در خاصیت OnCreate فرم خود بنویسید:


var ProgressBarStyle: LongInt; begin {create a run progress bar in the status bar} ProgressBar1 := TProgressBar.Create(StatusBar1); ProgressBar1.Parent := StatusBar1; {remove progress bar border} ProgressBarStyle := GetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE); ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE; SetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE, ProgressBarStyle); {set progress bar position and size - put in Panel[2]} ProgressBar1.Left := StatusBar1.Panels.Items[0].Width + StatusBar1.Panels.Items[1].Width + 4; ProgressBar1.Top := 4; ProgressBar1.Height := StatusBar1.Height - 6; ProgressBar1.Width := StatusBar1.Panels.Items[2].Width - 6; {set range and initial state} ProgressBar1.Min := 0; ProgressBar1.Max := 100; ProgressBar1.Step := 1; ProgressBar1.Position := 0; end;

حالا برای آنکه پس از خارج شدن از فرم حافظه اشغال شده آزاد گردد، در قسمت OnDestroy در Event فرمتان دستور زیر را اضافه نمایید:


ProgressBar1.free;





¤ نوشته شده در ساعت 04:29 توسط حق پرست |
دلفی بخش 6
آموزش دلفی (بخش ششم)



نمایش میزان كپی شدن فایل با ProgressBar در دلفی
چطور میتوان زمان کپی شدن فایل را با استفاده از ProgressBar نمایش داد؟ برای انجام این کار ابتدا بر روی یک فرم یک ProgressBar اضافه کنید سپس تابع زیر را تایپ کنید:


procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string); var FromF, ToF: file of byte; Buffer: array[0..4096] of char; NumRead: integer; FileLength: longint; begin AssignFile(FromF, Source); reset(FromF); AssignFile(ToF, Destination); rewrite(ToF); FileLength := FileSize(FromF); with Progressbar1 do begin Min := 0; Max := FileLength; while FileLength > 0 do begin BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF, Buffer[0], NumRead); Position := Position + NumRead; end; CloseFile(FromF); CloseFile(ToF); end; end;

در این تابع شما در واقع فایل مبدا را خوانده و در مقصد مینویسید. حالا یک دکمه اضافه کرده کد زیر رو اضافه نمایید:


procedure TForm1.Button1Click(Sender: TObject); begin CopyFileWithProgressBar1('c:Welcome.exe', 'c: empWelcome.exe'); end;


چطور می توان زمان کپی شدن فایل را محاسبه و نمایش داد؟ برای این کار نیز میتوانید از تابع زیر استفاده کنید:


procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string); var FromF, ToF: file of byte; Buffer: array[0..4096] of char; NumRead: integer; FileLength: longint; t1, t2: DWORD; maxi: integer; begin AssignFile(FromF, Source); reset(FromF); AssignFile(ToF, Destination); rewrite(ToF); FileLength := FileSize(FromF); with Progressbar1 do begin Min := 0; Max := FileLength; t1 := TimeGetTime; maxi := Max div 4096; while FileLength > 0 do begin BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF, Buffer[0], NumRead); t2 := TimeGetTime; Min := Min + 1; // Show the time in Label1 label1.Caption := FormatFloat('0.00', ((t2 - t1) / min * maxi - t2 + t1) / 100); Application.ProcessMessages; Position := Position + NumRead; end; CloseFile(FromF); CloseFile(ToF); end; end;

در این تابغ ابتدا زمان اولیه در متغیر t1 ذخیره شده و سپس پس از کپی شدن هر قسمت از فایل، زمان در متغیر t2 ذخیره میشود و توسط فرمول زیر مقدار زمان باقی مانده تا کپی کامل فایل بدست می آید.


((t2 - t1) / min * maxi - t2 + t1) / 100





¤ نوشته شده در ساعت 04:28 توسط حق پرست |
رباعی خیام 1



هر چند که رنگ و روی زيباست مرا

چون لاله رخ و چو سرو بالاست مرا

معلوم نشد که در طربخانه خاک

نقاش ازل بهر چه آراست مرا



چون عهده نمی شود کسی فردا را

حـالی خوش دار اين دل پر سودا را

می نوش به ماهتاب ای ماه که ما

بـسيار بـــگردد و نــيـابد ما را



چون در گذرم به باده شویید مرا

تلقين ز شراب ناب گویید مرا

خواهید به روز حشر یابید مرا

از خاک در میکده جوييد مرا



چندان بخورم شراب کاین بوی شراب

آید ز تراب چون روم زیر تراب

گر بر سر خـاک من رسد مخموری

از بوی شراب من شود مست و خراب



بر لوح نشان بودنی ها بوده است

پیوسته قلم ز نيک و بد فرسوده است

در روز ازل هر آن چه بايست بداد

غم خوردن و کوشيدن ما بيهوده است



ای چرخ فلک خرابی از کینه تست

بیدادگری پیشه ديرينه تست

وی خاک اگر سينه تو بشکافند

بس گوهر قیمتی که در سینه تست



چون چرخ بکام يک خردمند نگشت

خواهی تو فلک هفت شمُر خواهی هشت

چون بايد مرد و آرزوها همه هِشت

چو مور خورد به گور و چه گرگ به دشت



اجزای پياله ای که در هم پيوست

بشکستن آن روا نمی دارد مست

چندين سر و ساق نازنين و کف دست

از مهر که پيوست و به کين که شکست



می خور که به زیر گل بسی خواهی خفت

بی مونس و بی رفيق و بی همدم و جفت

زنهار به کس مگو تو اين راز نهفت

هر لاله که پژمرد نخواهد بشکفت




می خوردن و شاد بودن آيين منست

فارغ بودن ز کفر و دين؛ دین منست

گفتم به عروس دهر کابين تو چیست

گفتــا دل خـرم تـو کابين مـن است



مهـتاب بــه نـور دامـن شـب بـشکافت

می نوش دمی خوش تر از اين نتوان یافت

خوش بــاش و بـينديش که مـهتاب بسی

اندر سر گور یک به یک خـواهد تافت



از منزل کفر تا به دين يک نفس است

وز عالم شک تا به یقین یک نفس است

ایـن یـک نفس عـزیز را خـوش مـیدار

کز حاصل عمر ما همین یک نفس است



شادی بطلب که حاصل عمر دمی است

هر ذره ز خاک کیقبادی و جمی است

احوال جهان و اصل این عمر که هست

خوابی و خیالی و فریبی و دمی است



اين کهنه رباط را که عالم نام است

آرامگه ابلق صبح و شام است

بزمی است که وامانده صد جمشید است

گوريست که خوابگاه صد بهرام است



آن قصر که بهرام درو جام گرفت

آهو بچه کرد و رو به آرام رفت

بهرام که گور می گرفتی همه عمر

ديدی که چگونه گور بهرام گرفت؟



هر ذره که بر روی زمینی بوده است

خورشید رخی زهره جبینی بوده است

گـرد از رخ آستین بـه آزرم افشان

کـان هم رخ خوب نازنینی بـوده است



امروز که نوبت جوانی من است

می نوشم از آن که کامرانی من است

عیبم نکنيد گرچه تلخ است خوش است

تلخ است از آن که زندگانی من است




بسیار بگشتيم به گرد در و دشت

اندر همه آفاق بگشتيم بگشت

کس را نشنيديم که آمد زين راه

راهی که برفت ، راهرو باز نگشت




ای بی خبران شکل مجسم هیچ است

وین طارم نه سپهر ارقم هیچ است

خوش باش که در نشیمن کون و فساد

وابسته يک دمیم و آن هم هیچ است



دنيا ديدی و هر چه ديدی هيچ است

و آن نيز که گفتی و شنيدی هيچ است

سـرتاسـر آفـاق دویـدی هیـچ است

و آن نيز که در خانه خزيدی هيچ است



چون نيست ز هر چه هست جز بـاد بدست

چون هست ز هر چـه هست نقصان و شکست

انـگار که هســت هـر چه در عـالم نيست

پندار کــه نـيست هــر چـه در عـالم هــست




تا کی ز چراغ مسجد و دود کنشت؟

تا کی ز زيان دوزخ و سود بهشت؟

رو بر سر لوح بين که استاد قضا

اندر ازل آن چه بودنی است ، نوشت



دوری که در آمدن و رفتن ماست

او را نه نهایت نه بدایت پیداست

کس می نزند دمی درین معنی راست

کاین آمدن از کجا و رفتن به کجاست



تا چند زنم به روی دریا ها خشت

بیزار شدم ز بت پرستان و کنشت

خیام که گفت دوزخی خواهد بود

که رفت به دوزخ و که آمد ز بهشت



نيکی و بدی که در نهاد بشر است

شادی و غمی که در قضا و قدر است

با چرخ مکن حواله کاندر ره عقل

چرخ از تو هزار بار بيچاره تر است



ابر آمد و زار بر سر سبزه گریست

بی باده گلرنگ نمی شاید زيست

اين سبزه که امروز تماشاگه ماست

تا سبزه خــاک ما تماشاگه کیست



گویند بهشت عدن با حور خوش است

من می گویم که آب انگور خوش است

اين نقد بگیر و دست از آن نسیه بدار

کاواز دهل برادر از دور خوش است



چون آمدنم به من نبد روز نخست

وین رفتن بی مراد عزمی ست درست

بر خیز و میان ببند ای ساقی چست

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



ساقـی غـم مـن بلند آوازه شده است

سرمستی مـن برون ز اندازه شده است

با مـوی سپید سـر خوشم کـز می تو

پيرانه سرم بهار دل تازه شده است



از مـن رمقی بـسعی سـاقی مانده است

وز صحبت خلق بی وفایی مانده است

از بـاده دوشــین قــدحی بـيش نــمـاند

از عـمر نـدانم که چه باقی مانده است




مـن هیچ ندانم که مرا آن که سرشت

از اهل بهشت کرد یا دوزخ زشت

جامی و بتی و بربطی بر لب کشت

اين هر سه مرا نقد و ترا نسیه بهشت



چون ابر به نوروز رخ لاله بشست

برخیز و به جام باده کن عزم درست

کاين سبزه که امروز تماشاگــــه تست

فردا همه از خاک تو بر خواه د رست



هر سبزه که بر کنار جویی رسته است

گويی ز لب فرشته خويي رسته است

پا بر سر هر سبزه به خــواری ننهی

کان سبزه ز خاک لاله رويی رسته است



گویند که دوزخی بود عاشق و مست

قولی است خلاف دل در آن نتوان بست

گر عاشق و مست دوزخی خواهد بود

فردا باشد بهشـت همچون کف دست



اين کوزه چو من عاشق زاری بوده است

در بند ســر زلف نــگاری بــوده است

ايــن دسته کــه بر گردن او می بـینی

دستی است که بر گردن ياری بوده است



دارنده چو ترکيب طبايع آراست

از بهر چه او فکندش اندر کم و کاست

گر نيک آمد شکستن از بهر چه بود

ور نيک نیامد اين صور ، عیب کراست



اين بحر وجود آمده بيرون ز نهفت

کس نيست که اين گوهر تحقيق بسفت

هر کس سخنی از سر سودا گفته است

زان روی که هست کس نمی داند گفت



دل سر حیات اگر کماهی دانست

در مرگ هم اسرار الهی دانست

امروز که با خودی ندانستی هیچ

فردا که ز خود روی چه خواهی دانست



گردون نگری ز قد فرسوده ماست

جیحون اثری ز اشک آلوده ماست

دوزخ شرری ز رنج بیهوده ماست

¤ نوشته شده در ساعت 09:41 توسط حق پرست |
اموزش دلفی (بخش چهارم)
آموزش دلفی (بخش چهارم)



آرایه‌ها در دلفی دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم: var array[indexType1, ..., indexTypen] of baseType;
در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.
نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید: d(.i.):= 3 + i; // Equivalent d:= 3 + i;
نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید: var A : array [Boolean] of integer; begin A[True] := 50; A[False] := 100; end;
نکته: توابع Low و High کران‌های پایین وبالای یک متغییر آرایه‌ای یا نوعی یا ترتیبی را بر میگردانند: for I := 0 to High(X) do S := S + X;

آرایه‌های ثابت: آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشته‌ها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند. type TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
const DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); var Today : TDay;
begin Today := TDay(DayOfWeek(Date) - 1); ShowMessage('Today is ' + DayNames[Today] + '!'); end;

آرایه‌های دینامیکی: آرایه‌های دینامیکی، آرایه‌های تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید: var MyFlexibleArray: array of Real;
قبل از به کار گیری آرایه‌های دینامیکی، ابتدا باید از رویه SetLength برای تخصیص حافظه آرایه استفاده کرد: SetLength (MyFlexibleArray, 2; (
نکته: آرایه‌های دینامیکی همیشه مبتنی بر صفر می باشند.
نکته: شما می‌توانید آرایه‌های دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید: MyFlexibleArray := nil;
نکته: مقدار حافظه‌ای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایه‌ای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص می‌یابد.

فشرده‌سازی آرایه‌ها: در دلفی شما هنگامی که ساختار خود را تعیین کردید می‌توانید با استفاده از کلمه کلیدی packed اطلاعات ذخیره شده خود را متراکم کنید: type TNumbers = packed array[1..100] of Real;
نکته: استفاده از packed سرعت دسترسی به اطلاعات را کند میکند. در مورد آرایه‌ای از کاراکترها این مورد سازگارتر می‌باشد.

آرایه‌های چند بعدی دینامیکی: برای تعریف آرایه‌های چند بعدی دینامیکی، تنها کافی است ...array of را در ساختار خود تکرار کنید. به طور مثال: type TMessageGrid = array of array of string;
var Msgs: TMessageGrid;
این تعریف یک آرایه دو بعدی از رشته‌ها می باشد. سپس باید به آرایه خود فضا نسبت داد: SetLength(Msgs, I, J);

شما می‌توانید آرایه‌های چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular) ایجاد کنید. ابتدا رویه SetLength را صدا زده و پارامتر بعد اول را بدهید: var Ints: array of array of Integer;
SetLength(Ints, 10);
ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازه‌های مختلف) تخصیص دهید: SetLength(Ints[2], 5);




¤ نوشته شده در ساعت 11:02 توسط حق پرست |
اموزش دلفی (بخش سوم)
آموزش دلفی (بخش سوم)



نكات مفید كار در محیط دلفی محیط دلفی برای برنامه نویسی یکی از بهترین محیطهای برنامه نویسی است گذشته از کارکرد داخلی و کمپایلر آن که بسیار قوی و سریع است، محیط آن یعنی IDE آنهم قدرت بسیار زیادی دارد که باعث شده یکی از بهترین ادیتورها باشد. در این مقاله من سعی بر این داشته ام تا با ارائه یک سری از نکات و کلیدهای میانبر که می توانند برای کار در دلفی بسیار مفید و کارا باشند، کمک کنم تا شما بتوانید با قدرت بیشتر به برنامه نویسی و کار در این محیط قدرتمند ادامه دهید.
در قسمت اول مقاله که در حال حاضر در مقابل شماست من یک سری از کلیدهای میانبر و ترکیبی مورد استفاده در IDE دلفی را بصورت لیست وار و همراه یک توضیح کوچک آورده ام. دوستان عزیز برنامه نویس ممکنه که شما مدتها با دلفی مشغول برنامه نویسی بوده باشید اما من یقین دارم که در این لیست نکات و روشهای جدیدی را خواهید آموخت.
جستجو در متن بصورت مستقیم: برای اینکار کلیدهای Ctrl+E را بفشارید و بدنبال آن شروع به تایپ کلمه مورد نظر کنید نتیجه آن را خود ببینید. برای اینکه به کلمه بعدی بروید کافیست کلید F3 را بزنید.
ایجاد فرورفتگی در کد: بعضی اوقات - که خیلی هم پیش می‌آید - لازم است که یک مقداری از متن را بصورت بلوک شده به جلو و یا عقب ببریم. منظور دندانه دار کردن متن است که به خوانایی برنامه کمک می کند. برای اینکار می تونید از کلید Ctrl +Shift+I برای جلو بردن و Ctrl+Shift+U برای عقب برگرداندن متن بلوک شده استفاده کنید.
پرش به قسمت تعریف یک شی (Object): ببنید شی مورد نظرتون (از قبیل VCL, Procedure, Function,...) در کجا و چطور تعریف شده می توانید کلید Crtl رو پایین نگه داشته و روی شی مورد نظر Click کنید.
برای تغییر حالت کاراکترها: شما می توانید یک قسمت از متن (که ممکن است با حروف بزرگ و یا کوچک تایپ شده باشد) را انتخاب کنید و با زدن کلیدهای Ctrl+O+U به ترتیب تمامی حروف کوچک آن قسمت از متن را به حروف بزرگ و تمامی حروف بزرگ آنرا به حروف کوچک تبدیل کنید. برای تعییر حالت یک کلمه نیز میتوانید روی کلمه مورد نظر رفته و کلیدهای Ctrl+K+F برای بزرگ کردن و کلیدهای Ctrl+K+E را برای کوچک کردن حروف آن کلمه بکار برد.
درست کردن ماکرو متنی: این امکان بسیار مفید است و می تواند بسیاری از کارهای نوشتاری را کاهش دهد با اینکار شما میتوانید یک سری از کارهای تکراری که روی متون انجام می دهید را بصورت ماکرو در آورده و از آنها به راحتی استفاده کنید. برای شروع به ضبط ماکرو کلیدهای Ctrl+Shift+R را بفشارید و آن سری کارهایی را که می خواهید را انجام دهید و سپس برای اینکه به کار ضبط ماکرو پایان دهید کلیدهای Ctrl+Shift+R را دوباره بزنید. حال برای استفاده از ماکرو کافیست در هر جا که لازم بود کلیدهای Ctrl+Shift+P را بفشارید.
انتخاب متن بصورت مربعی: اگر شما از کهنه کارهای کامپیوتر باشید حتما از زمان داس یادتون هست که برنامه ای بود به نام PE2 که یکی از امکانات بسیار جالبش این بود که یک مربع از متن رو میتوانستین انتخاب کنید و آنرا کپی یا حذف کنید. بله درست متوجه شدید در محیط دلفی هم شما اینکار را میتوانید انجام دهید اما نه به مشکلی PE2 بلکه اینکار را میتوانید فقط با گرفتن کلید Alt و کشیدن موس روی متن انجام دهید. هر چند ممکن است در نگاه اول زیاد این امکان مفید به نظر نیاید ولی بعضی وقتهای خیلی کار را راحت میکنه، که حتماً تجربه خواهید کرد.
گذاشتن علامت روی متن: این کار که به BookMark معروف است بسیار مفید و کارا می باشد. در هنگامی که شما روی قسمتی از متن برنامه کار میکنید و می خواهید به یک قسمت دیگر بروید ممکن است برای برگشتن به مکان اول خود کمی مشکل پیدا کنید. ولی شما میتوانید با زدن چند دکمه به محل مورد نظرتون باز گردید. برای اینکار در خطی که قصد دارید علامت بگذارید کلیدهای Ctrl+Shift+0..9 را بفشارید. منظور اینست که کلیدهای Ctrl+Shift را نگه دارید و یکی از اعداد 0 تا 9 را وارد کنید تا آن خط به همان شماره علامت گذاری شود و سپس هر جا که خواستید بروید و سپس هر بار که کلید Ctrl را نگه دارید و شماره مورد نظر را وارد کنید به همان خط باز خواهید گشت. البته توجه داشته باشید که فقط می توانید 10 خط را با این روش علامت گذاری بکنید و برای برداشتن علامت ها کافیست روی همان خط دوباره کلید Ctrl+shift و شماره‌ای که برای آن خط وارد کرده اید را بفشارید با اینکار علامت آن خط برداشته می شود.
ایجاد کلاس مورد نظر: شما هنگامی که در قسمت Private و یا Public یک type، روال یا تابع درست کردید لازم دارید که قسمتی را برای قرار دادن کدهای مربوط به آن روال یا تابع را ایجاد کنید. برای اینکار شما پس از اینکه نام تابع را تایپ کردید می توانید کلیدهای Ctrl+Shift+C را فشار دهید تا دلفی یک قسمت برای نوشتن کدهای مورد نظرتان ایجاد کند.
ظاهر کردن پنجره Code insight: شما حتما به اهمیت و مفید بودن این قسمت دلفی واقفید که در هنگام کد نویسی تا چه حد می تواند کارها را راحت کند. بله در هنگام وارد کردن کدها بعد از وارد کردن نام یک کلاس و یا Object با زدن یک نقطه (.) پنجره Code Insight ظاهر می شود. حال در بعضی وقتها شما ممکن است که نقطه را قبلا وارد کرده باشید و یا در مواقع دیگر این پنجره ظاهر نشود. در این صورت برای اینکه پنجره را ظاهر کنید باید دوباره نقطه را وارد کنید ولی راه آسانتری هم وجود دارد و آن اینست که کلیدهای Ctrl+Speacebar را فشار دهید.
ظاهر کردن پنجره Code Parameter: همانند بالا در هنگام ظاهر شدن Hint مربوط به راهنمای توابع که معمولاً بعد از گذاشتن پرانتز مربوط ظاهر میشود و در مورد پارامترهای لازم می باشد نیز می توانید از کلیدهای Ctrl+Shift+SpaceBar استفاده کنید.
رفتن از قسمت تعریف توابع و روالها به قسمت کد آنها: همیشه این نیاز وجود خواهد داشت که شما در هنگامی که دارید به دنبال یک روال در قسمت type میگردید بعد از پیدا کردن نام آن می خواهید که خود آن تابع یا روال را نیز ببنید. برای اینکار خوب حتما نام آن را جستجو میکنید ولی یک راه آسانتر اینست که شما روی نام آن تابع قرار گیرید و کلیدهای Ctrl+Shift+Up/Down را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.




¤ نوشته شده در ساعت 10:53 توسط حق پرست |
طبیعت زیبا

¤ نوشته شده در ساعت 06:05 توسط حق پرست |
عالم همه قطره است ودریاست حسین

¤ نوشته شده در ساعت 05:56 توسط حق پرست |
موزش دلفی (بخش اول) نویسنده محمد رضا حق پرست
آموزش دلفی (بخش اول)



منبع: dev.ir
تاریخچه زبان دلفی دلفی در واقع یک کامپایلر پاسکال است. دلفی 6 نسل جدید کامپایلر های پاسکال است که شرکت Borland از زمان ایجاد اولین نسخه پاسکال توسط Andres Hejlsberg در 15 سال پیش به بازار عرضه کرد.
برنامه نویسی به زبان پاسکال در سالیان سال از استواری و ثبات، زیبایی و ظرافت و البته سرعت بالای کامپایل سود برده است. دلفی هم از این قاعده مستثنی نیست. کامپایلر دلفی ترکیبی از بیش از یک دهه تجربه طراحی کامپایلر پاسکال و معماری بهبود یافته کامپایلر های 32 بیتی است. اگرچه قابلیت های کامپایلرها با گذشت زمان پیشرفت قابل توجهی داشته است ولی سرعت آن چندان کاهش نیافته و همچنان از سرعت بالایی برخوردار است. به علاوه استحکام و قدرت کامپایلر دلفی معیاری برای سنجش دیگر کامپایلر هاست.
در اینجا به بررسی تفصیلی روند حرکتی دلفی در هر یک از نسخه های آن می پردازیم و مشخصات مهم آن را بررسی می کنیم.
سال 1995 - Delphi1 در زمان استفاده از سیستم عامل DOS برنامه نویسان مجبور بودند از بین زبان پر قدرت ولی کم سرعت Basic و زبان کارآمد ولی پیچیده و نامفهوم Assembly یکی را انتخاب کنند. پاسکال با ارائه یک زبان ساخت یافته و یک کامپایلر سریع و کم نقص این شکاف را پرکرد. برنامه نویسان Windows 3.1 هم با تصمیم گیری مشابهی رو برو شدند. یکی زبان قدرتمند و سنگین ++C و یکی زبان ساده و محدود کننده Visual Basic .
ارائه Delphi1 در این مورد هم راه حل خوبی برای برنامه نویسان بود. دلفی مجموعه متفاوتی برای برنامه نویسی بود . طراحی و توسعه برنامه های کاربردی، ایجاد DLL ها، پایگاههای داده و ... که یک محیط ویژوال وسیع را تشکیل می داد. Delphi1 اولین ابزار برنامه نویسی ویندوز بود که محیط طراحی ویژوال، کامپایلر بهینه کد برنامه و دسترسی قوی به پایگاههای داده را در یک جا جمع کرد که آن را به یکی از بهترین ابزارهای روش نوین توسعه سریع نرم افزار (Rapid Application Development) تبدیل کرد. این مجموعه قدرتمند باعث شد که در همان زمان بسیاری از برنامه نویسان زبانهای دیگر به Delphi روی بیاورند و این موفقیت بزرگی برای Borland به حساب می آمد. همچنین بسیاری از برنامه نویسان پاسکال دلفی را ابزاری یافتند که توسط آن هم از توانایی و تجربه خود در برنامه نویسی پاسکال استفاده می کردند و هم توانایی کار در ویندوز را به دست آوردند. همچنین زبانی که در آن زمان با نام پاسکال شیئی (ObjectPascal) در دانشگاهها ایجاد شده بود یک زبان بسیار خشک و محدود کننده بود که اصلاٌ حالت کاربردی پیدا نکرد.
ویژگیهای دلفی مثل طراحی ظاهری حساب شده و کاربر پسند آن باعث شد که زبان پاسکال شیئی عملاٌ از رده خارج شود. تیم طراحی VB در Microsoft قبل از حضور دلفی هیچ رقیب مهمی برای خود نمی دید. VisualBasic در آن زمان زبانی نا کارآ ، کم سرعت و کند ذهن بود. Visual Basic 3 در عمل اصلا توانایی رقابت با Delphi 1 را نداشت. در این سال شرکت Borland گرفتار یک سری مشکلات قضائی با شرکت Lotus بود که در نهایت هم متخلف شناخته شد. همچنین درگیری مشابهی هم با Microsoft بر سر تلاش در تغییر دادن فضای نرم افزار های Microsoft پیدا کرد. همچنین Borland مشغول طراحی و فروش طرح Quatro به شرکت Novell و طراحی پایگاه های داده dBase و Paradox بود که با استقبال قابل توجهی مواجه نشد.
در این زمان که Borland مشغول فعالیتهای قضایی و تجاری بود Microsft توانست گوی سبقت را از Borland برباید و قسمت اعظم بازار ابزار های برنامه نویسی تحت Windows را در اختیار بگیرد و سعی می کرد تا این طرز فکر را اشاعه دهد که چون Windows را طراحی کرده صلاحیت و توانایی تهیه بهترین ابزار های برنامه نویسی تحت آن را نیز در دست دارد. در این شرایط Borland با عرضه Delphi و نسخه جدید ++Borland C سعی کرد خدشه ای در فرمانروایی Microsoft وارد کند و سهمی در بازار بزرگ این محصولات داشته باشد.
سال 1996 - Delphi2 یک سال بعد Delphi2 تمام مزایای نسخه قبلی را تحت سیستم های جدید 32 بیتی (Windows 95,Windows NT) ارائه داد. همچنین Delphi2 با ارائه خصوصیات اضافه و کارکرد های قویتری نسبت به Delphi1 توانایی های خود را افزایش داد. (ازجمله ارائه کامپایلر 32 بیتی که سرعت بالایی به نرم افزار ها می بخشید، کتابخانه بزرگ و کاملی از اشیای مختلف، شیوه جدید و تکامل یافته ای برای اتصال به پایگاه های داده مختلف، ادیتور پیشرفته، پشتیبانی از OLE ، توانایی وراثت در فرمهای ویژوال و سازگاری با پروژه های 16 بیتی Delphi1 ). Delphi2 به معیاری برای سنجش و مقایسه همه ابزارهای توسعه نرم افزار در آن زمان تبدیل شد.
در آن زمان با ارائه سیستم 32 بیتی Windows95جهش بزرگی در سیستم عامل Windows رخ داد و Borland بسیار مشتاق بود که Delphi را به بهترین ابزار برنامه نویسی سیستم جدید تبدیل کند. نکته این که در آن زمان به منظور تاثیر در افکار عمومی و تاکید بر قدرت Delphi در سیستم عامل 32 بیتی قرار بود که نرم افزار با نام جدید Delphi32 به بازار عرضه شود ولی در آخرین مراحل به خاطر اینکه نشان دهند این زبان زبانی رشد یافته و تکامل یافته نسخه قبلی یعنی Delphi1 است نام Delphi2 را برای آن انتخاب کردند.
Microsoft تلاش کرد که با Visual Basic 4 با Delphi مقابله کند ولی از ابتدا کیفیت پایین آن و ضعف آن در انتقال برنامه های 16 بیتی به سیستم 32 بیتی و بروز اشکالات ساختاری در طراحی آن موجب شکست زودهنگام Visual Basic 4 شد. در این زمان هنوز تعداد زیادی از برنامه نویسان به Visual Basic وفادار بودند. Borland هنچنین روشها و ابزارهای قدرتمندی همچون PowerBuilder برای طراحی نرم افزار های Client/Server ارائه داد ولی Delphi هنوز آن قدر قدرتمند نشده بود که بتواند نرم افزارهایی که جایی در بین توسعه گران پیدا کرده اند را براندازد.
سال 1997 - Delphi3 از زمان تهیه و توسعه Delphi1 تیم توسعه Delphi در فکر گسترش و ایجاد یک زبان قدرتمند جهانی بود. برای Delphi2 این تیم تمام نیروی خود را صرف اعمال مربوط به انتقال تواناییها و کارکرد ها به سیستم 32 بیتی و همچنین اضافه کردن خصوصیات Client/Server و پایگاه داده کرد. در زمان تهیه Delphi3 تیم توسعه فرصت لازم برای گسترش مجموعه ابزار موجود را یافت و در این راستا کیفیت و کمیت ابزارهای Delphi بهبود یافت. به علاوه راه حل هایی برای مشکلات عمده و قدیمی برنامه نویسان تحت ویندوز ارائه شد. به ویژه استفاده از برخی فناوری های پیچیده و نا مفهوم (مثل COM و ActiveX وتوسعه نرم افزار های تحت Web وکنترل پایگاههای داده چند کاربره). روش نمایش کد برنامه همچنین توانایی کامل کردن خودکار کد (Code Completion) عملیات کد نویسی را راحت تر کرد. ضمن این که همچنان در بیشتر موارد اساس و متدولوژی برنامه نویسی مانند Delphi1 بود و بر پایبندی به قوانین اصولی Pascal تاکید می شد.
در این زمان رقابت شرکت های تولید کننده ابزار های برنامه نویسی بسیار تنگاتنگ شده بود. Microsoft با ارائه Visual Basic 5 به پیشرفت های خوبی دست یافت ازجمله پشتیبانی قوی از COM و ActiveX و ایجاد برخی خصوصیات و تغییرات کلیدی و اساسی در کامپایلر VB. ضمن این در همین سال Borland با پشتوانه قوی Delphi و با استفاده از ساختار موفق آن ابزارهای دیگری همچون Forte و BC++ Builder به بازار عرضه کرد.
تیم Delphi در زمان طراحی Delphi3 چند تن از اعضای کلیدی خود را از دست داد. Andres Hejlsberg معمار اصلی Delphi در اقدام غیر منتظره ای Borland را ترک کرد و تصمیم گرفت به رقیب دیرینه یعنی Microsoft بپیوندد. اما حرکت تیم Delphi متوقف نشد و معاون Hejlsberg که سالها تجربه همکاری با او را داشت توانست رهبری این تیم را به خوبی در دست بگیرد. همچنین مسئول فنی تیم (Paul Gross) هم در اقدام مشابهی به گروه Microsoft ملحق شد. این تغییرات بیشتر به خاطر اختلافات شخصی بین افراد تیم بود و نه به خاطر مسائل حرفه ای.
سال 1998 - Delphi4 Delphi4 بیشتر بر روی راحتتر کردن کار با دلفی متمرکز شد. مرورگر روال ها (Module Explorer) بهبود یافت و مرور و ویرایش Unit ها را راحت تر کرد. کنترل کد و کامل کردن خودکار کلاسها این فرصت را به کاربر داد که فکر و زمان خود را روی ساختار اصلی برنامه بگذارد و در وقت صرفه جویی کند. طراحی رابط کاربر هم کاملاٌ عوض شد و بهبود یافت و اشکال زدا (Debugger) نیز پیشرفت قابل توجهی داشت. Delphi4 قابلیتهای برنامه نویسان را در استفاده از تکنولوژیهای چند منظوره خارجی مثل MIDAS ، DCOM ، MIS و Corba افزایش داد.
در این سال Delphi جایگاه خود را در رقابت با دیگران مستحکم کرده بود و کم کم به سمت دست یابی به سودآوری مالی مورد نظر خود پیش می رفت. در واقع در این زمان بود که حاصل کار سنگین چند ساله تیم نمایان می شد. بعد از سالها آزمایش Delphi شهرت و محبوبیت خاصی پیدا کرد و دیگر برنامه نویسان Delphi توانایی جدا شدن از آن را نداشتند. در این زمان Borland به کار سوٌال برانگیزی دست زد و به منظور تبلیغ بیشتر و برتری در جنگ روانی با دیگر شرکتها نام Inprise را برای فعالیتهای تجاری خود برگزید.
ابزار های مربوط به فن آوری Corba را گسترش داد تا راه جدیدی برای سودآوری ایجاد کند. برای موفقیت در این زمینه Corba نیاز به رابط کاربر قدرتمندی داشت که در کنار توانایی های آن کار کردن با آن نیز راحت باشد. دقیقاٌ همان کاری که در سالهای قبل در مورد COM و برنامه نویسی تحت Web انجام شده بود و به موفقیت دست یافته بود. با این وجود بنا به دلایل مختلفی این گسترش و توسعه Corba هیچ وقت تکامل و موفقیتی که مورد نظر بود را به دست نیاورد و بر خلاف تبلیغات و سرمایه گذاری های انجام شده فن آوری Corba تنها توانست نقش کوچکی در روند رو به جلوی Delphi ایفا کند.
سال 1999 - Delphi5 Delphi5 در برخی زمینه ها پیشرفت های قبلی را ادامه داده است. اولاٌ مسیری را که Delphi4 با اضافه کردن ویژگیهای زیادی شروع کرده بود ادامه داد. Delphi4 باعث شد کارهایی که قبلاٌ به صرف وقت زیادی احتیاج داشت بسیار سریعتر انجام شود. Delphi به شکل امیدوار کننده ای به برنامه نویس این امکان را می دهد که بیشتر به برنامه ای که میخواهد بنویسد توجه کند و نه به قواعد برنامه نویسی و نوشتن کد های تکراری و خسته کننده. این ویژگیهای سودمند شامل رابط کاربر بهبودیافته و سیستم اشکال زدایی(Debugger) توانمند ، امکانات برنامه نویسی تیمی و ابزار های ترجمه می شود.
ثانیا Delphi5 خصوصیات جدیدی را در بر می گیرد که توسعه برنامه های تحت وب را واقعاٌ راحت کرده است. این ویژگیها شامل طراح اشیای مربوط به ASP برای ساختن صفحات (Active Server Page)، اشیایی موسوم به Internet Express برای پشتیبانی از XML و خصوصیات جدید MIDAS که آن را به یک ابزار همه کاره در پایگاه های داده تحت Web تبدیل کرد. در نهایت با صرف وقت ، هزینه و صبر زیاد توانست Delphi5 قدرتمند را عرضه کند. این فعالیت مدتها به طول انجامید و قبل از عرضه عمومی، Delphi5 بارها در بازبینی ها و آزمایشهای داخلی قسمتهای مختلف آن تغییر کرد و بهبود یافت.
Delphi5 در نیمه دوم سال 1999 به بازار عرضه شد و به نفوذ و تسلط بر بازار ادامه داد. در این زمان Visual Basic که کم کم به عضوی تحقیر آمیز برای Microsoft تبدیل می شد هم با پیشرفتهایی توانست در رقابت دوام بیاورد و از صحنه خارج نشود. در اقدام درست و به جایی نام Inprise دوباره به Borland بازگشت. این اقدام از سوی طرفداران و مشتریان قدیمی Borland با استقبال خوبی مواجه شد.
سال 2001 – Delphi6 در هنگام تهیه Delphi6 ساختار Delphi در زمینه های مختلف شکل گرفته بود و به یک تکامل نسبی رسیده بود. این مسئله باعث شد که تیم طراحی بتواند وقت خود را بر روی طرحی که مدتها تنها در حد یک نظریه بود بگذارد و آن را بسیار زودتر از آن که انتظار می رفت عملی کند: گام نهادن به محیط های فراتر از Windows . بیشتر نیروی توسعه گران Delphi در این مدت صرف رهانیدن Delphi از بند Windows شد که این خود در درجه اول مبارزه ای آشکار با سلطه Microsoft بود و ثانیاٌ راه برنامه نویسان را به سوی فضا های دیگر برنامه نویسی باز کرد. در ابتدا این عمل ریسک بزرگی بود و بیم آن می رفت که جایگاه Delphi در Windows هم به خطر بیفتد ولی در نهایت به نقطه رشد و قوتی بدل شد که Delphi را به یکی از بهترین ابزار برنامه نویسی Multi Platform تبدیل کرد.تکنولوژی CLX روالهای مختلف Delphi را با Kylix (عضو جدید خانواده Borland که در فضای Linux کار می کند) به اشتراک گذاشت و استفاده از سیستم بایت Java باعث شد که Delphi حتی از قید سخت افزار هم رها شود.
به نظر می رسد که این فعالیتها باعث ثبات Delphi در دنیای برنامه نویسان شود و نگرانی های Borland و برنامه نویسان که همیشه می ترسیدند که مبادا با ضعیف شدن Windows جایگاه خود را از دست بدهند حال به افتخار و آرامش برای آنان و نگرانی برای طرفداران Microsoft تبدیل شده است.





¤ نوشته شده در ساعت 05:54 توسط حق پرست |
موزش دلفی (بخش دوم) نویسنده محمد رضا حق پرست
آموزش دلفی (بخش دوم)



مدیریت حافظه در دلفی تخصیص خودکار حافظه وقتی شما از نوع‌های پایه (Integer ،real ،word و…) برای ایجاد متغییرهای خود استفاده می کنید، هیچ نگرانی درباره تخصیص حافظه آن وجود ندارد چون دلفی خودش آنرا تخصیص حافظه می کند و سپس آزاد میکند.



type TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) var Name : String; {256 Bytes} X, Y : Integer; {4 + 4 = 8 Bytes} List : array [0..10] of Double; {8 * 11 = 88 Bytes} Today : TDay; {1 Byte}

دراین نمونه پس از پایان برنامه، تمام حافظه تخصیص داده شده فراخوانی و آزاد می شود.

تخصیص حافظه دینامیکی در این حالت برنامه نویس احتیاج دارد تا انباره حافظه را شخصا" تخصیص و آزاد کند.
نوع Pointer اشاره‌گرها در دلفی می‌توانند شکل‌های مختلفی را در برگیرد. نخست، نوع اشاره‌گری که یک آدرس حافظه را برای نوع ویژه‌ای از داده، همانند صحیح، رشته و غیره نگه میدارد (Typed Pointer).



var ;Number : ^Integer ;Name : ^String

دوم، اشاره‌گرهای بدون نوع. اشاره‌گرهای بدون نوع (Untyped Pointers) خیلی به نوع معمولی خود شبیه هستند. اما محدودیت‌هایی مثل اینکه باید به نوع خاصی اشاره (Point) کند را ندارد.



var ;Something : Pointer

حال اشاره‌گر بدون نوع ما می تواند به هر نوعی از داده اشاره کند. برای تخصیص حافظه آن، از کمپلکس بیش از یک بیت استفاده میکنیم. برای مثال برنامه زیر کامپایل می شود ولی در زمان اجرا حافظه‌ای تخصیص نمیشود.



begin New(Something); Dispose(Something); end;

برای تخصیص حافظه کامپایلر باید بداند که نوع داده ما برای تخصیص حافظه چیست:



type IntPtr = ^Integer;
var Something : Pointer; begin Something := New(IntPtr); Integer(Something^) := 10; Dispose(Something); end;


تخصیص بلاکی از حافظه ما می‌توانیم از اشاره به بلاک‌هایی از تخصیص حافظه در سیستم استفاده کنیم. این کار را با رویه‌های GetMem و FreeMem برای تخصیص و آزاد سازی حافظه استفاده میکنیم.



var Something : Pointer begin GetMem(Something, 100); FreeMem(Something, 100); end;


اشاره به حافظه از قبل تخصیص داده شده هر دو نوع اشاره‌گرها می توانند به هر جایی از حافظه اشاره بکنند. این بدان معناست که آنها می‌توانند اشاره به فضای اشغال شده با داده‌هایی که در حال حاضر موجودند داشته باشند. این نمونه اشاره‌گر احتیاجی به تخصیص حافظه ندارد.



var Something : Pointer; MyString : PChar; // type PChar = ^Char;
begin GetMem(Something, 100); MyString := Something; StrCopy(Something, 'Hello World'); FreeMem(Something, 100); end;


حافظه Heap Heap شامل قسمتی از حافظه موجود در یک برنامه است که آنرا حافظه پویا می نامیم. Heap بخشی است که در آن تخصیص و تعریف حافظه به صورت تصادفی (Random) اتفاق می‌افتد. این به آن معناست که اگر شما سه بلاک از حافظه را به طور متوالی تخصیص دهید، می توانید بعد از هر دستور آنرا از بین ببرید. مدیر Heap جزئیات را برای شما نگهداری می کند. بنابراین شما به سادگی می توانید یک حافظه جدید را با GetMem و یا بوسیله صدا زدن constructor هنگام ساختن یک شی درخواست کنید و دلفی به شما یک بلاک جدید را برخواهد گرداند. Heap یکی از سه فضای موجود در برنامه کاربردی را استفاده کرده و دوتای دیگر به صورت فضای یکپارچه (Global) و پشته قرار می گیرند.

حافظه Stack Stack شامل قسمتی از یک بخش از حافظه موجود یک برنامه است که دینامیکی است اما برای تخصیص و آزادسازی فرامین مخصوص دارد. تخصیص Stack به صورت LIFO می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین‌های نوعی استفاده می‌شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.



¤ نوشته شده در ساعت 05:51 توسط حق پرست |

¤ نوشته شده در ساعت 05:48 توسط حق پرست |
تخصصی دلفی
ارائه نکات برنامه نویسی و پاسخ به پرسشهای شما در زمینه برنامه نویسی

سلام
این وبلاگ نمونه هایی از مطالب ارائه شده در کتاب در دست تالیفم یعنی"نکات کلیدی برنامه نویسی به زبان دلفی " میباشد که در آن سعی میکنم حدالامکان به پرسش های شما در زمینه های مختلف برنامه نویسی و از جمله زبان دلفی پاسخ دهم. همچنین سعی میکنم تکه کدهای مربوط به نکات برنامه نویسی که اکثر برنامه نویسان به آنها احتیاج دارند را هم برای استفاده علاقمندان قرار بدم در ضمن من مهندس نورانی هستم و برای طرح پرسش از گزینه "نظر بدین" و یا "چند نظر" استفاده کنید .با تشکر از شما
نوشته شده توسط محمد رضا حق پرست

چگونه می توان جداول Detial/Master را در Sql Server در زمان اجرا کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOCommand1.CommandText := 'Create Table MasterTable ' + '(FieldName Primary Key);'; ADOCommand1.Execute; ADOCommand1.CommandText := 'Create Table Detailtable ' + '(Fieldname Primary Key Refrenced Mastertable(Fieldname));'; ADOCommand1.Execute;end;
2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان لیستی از جداول یک دیتا بیس Sql Server را دریافت کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOQuery1.SQL.Add('Exec SP_Tables'); ADOQuery1.Active := True;end;
2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان لیستی دیتا بیس های Sql Server را دریافت کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOQuery1.SQL.Add('Exec SP_DATABASES'); ADOQuery1.Active := True;end;
2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان لیستی از کاربران فعال Sql Server را دریافت کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOQuery1.SQL.Add('Exec SP_WHO'); ADOQuery1.Active := True;end;
2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان User را در Sql Server حذف کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOCommand1.CommandText := 'Use DataBaseName'; ADOCommand1.Execute; ADOCommand1.CommandText := 'Exec SP_DropUser ' + QuotedStr('Username'); ADOCommand1.Execute;end;
2 نوشته شده توسط محمد رضا حق پرست |
چگونه می توان User را در Sql Server ایجاد کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOCommand1.CommandText := 'Use DataBaseName'; ADOCommand1.Execute; ADOCommand1.CommandText := 'Exec SP_AddUser ' + QuotedStr('Username'); ADOCommand1.Execute;end;


2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان User's Login را در Sql Server حذف کرد؟


procedure TForm1.Button1Click(Sender: TObject);begin ADOCommand1.CommandText := 'Exec SP_DropLogin ' + QuotedStr('UserName'); ADOCommand1.Execute;end;

2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان User's Login را در Sql Server ایجاد کرد؟

procedure TForm1.Button1Click(Sender: TObject);begin ADOConnection1.Connected := True; ADOCommand1.CommandText := 'Exec SP_AddLogin ' + QuotedStr('UserName') + ',' + QuotedStr('Password') + ',' + QuotedStr('Database Name') + ',' + QuotedStr('English') + ';'; ADOCommand1.Execute;end;

2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان فیلد lookup را در زمان اجرا درست کرد؟

with TStringField.Create(YourDataSet) dobegin FieldName := 'FieldName'; FieldKind := fkLookup; DataSet := YourDataSet; Name := DataSet.Name + FieldName; KeyFields := 'YourKeyFields'; LookupDataSet := YourLookupDataSet; LookupKeyFields := 'YourLookupKeyFields'; LookupResultField := 'YourLookupResultField';
FieldDefs.Add(FieldName, ftString, 50, False);end;

2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان لیستی از تمامی کلیدهای خارجی (foreignkeys) در حال استفاده در جدول داده شده را دریافت ک

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls;
type TForm1 = class(TForm) ADOConnection1: TADOConnection; Memo1: TMemo; BStart: TButton; procedure BStartClick(Sender: TObject); private procedure GetForeignKeys(sTableName: string; MyConnection: TADOConnection; var SlForeignKeyName, SlKeysActTable, SlKeysForeignTable, SlForeignKeyTable: TStringList); public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.GetForeignKeys(sTableName: string; MyConnection: TADOConnection; var SlForeignKeyName, SlKeysActTable, SlKeysForeignTable, SlForeignKeyTable: TStringList);var MySelectQuery, MyRecordQuery: TADOQuery; i: Integer; SlKeysAct, SlKeysFor: TStringList; sConstraintName, sForeignKeys, sForeignTable: string;
procedure GetKeys(sKeyList: string; fAct: Boolean); var i: Integer; sKey: string; begin i := 0; repeat Inc(i); if sKeyList[i] <> ',' then begin sKey := sKey + sKeyList[i]; end else begin if fAct then begin SlKeysAct.Add(sKey); end else begin SlKeysFor.Add(sKey); end; if (Length(sKey) + 1) < i then begin if sKey[(i + 1)] = ' ' then begin Inc(i); end; end; sKey := ''; end; until (i = Length(sKeyList)); if sKey <> '' then begin if fAct then begin SlKeysAct.Add(sKey); end else begin SlKeysFor.Add(sKey); end; end; end;
procedure GetForeignKeyFieldsAndTable(sSQL: string); var i: Integer; sValue: string; iPos: Integer; fAddValue: Boolean; fInFields: Boolean; begin if Length(sSQL) >= 10 then begin

sValue := Copy(sSQL, 1, 10); if AnsiUpperCase(sValue) = 'REFERENCES' then begin Delete(sSQL, 1, 11); end; i := 0; iPos := 0; sValue := ''; fInFields := False; repeat Inc(i); fAddValue := False;

if (sSQL[i] <> '.') and (sSQL[i] <> ' ') and (sSQL[i] <> '(') and (sSQL[i] <> ')') and (fInFields = False) then begin sValue := sValue + sSQL[i]; fAddValue := True; end;

if sSQL[i] = '(' then begin fInFields := True; end; if (fInFields) and (sSQL[i] <> '(') and (sSQL[i] <> ')') then begin sValue := sValue + sSQL[i]; end;

if sSQL[i] = ')' then begin fInFields := False; end; if (fAddValue = False) and (fInFields = False) then begin case iPos of (* Datenbank *) 0: begin sValue := ''; Inc(iPos); end;

1: begin sValue := ''; Inc(iPos); end;

2: begin sForeignTable := sValue; sValue := ''; Inc(iPos); end;

3: begin sForeignKeys := sValue; sValue := ''; Inc(iPos); end; else begin end; end; end; until (i = Length(sSQL)); end; end;begin try MySelectQuery := TADOQuery.Create(Application); with MySelectQuery do begin Name := 'MyHelpSelectQuery'; Connection := MyConnection; SQL.Add('sp_help ' + sTableName); Active := True; end; try MyRecordQuery := TADOQuery.Create(Application); with MySelectQuery do begin Name := 'MyHelpRecordQuery'; Connection := MyConnection; Recordset := MySelectQuery.NextRecordset(i); Recordset := MySelectQuery.NextRecordset(i); Recordset := MySelectQuery.NextRecordset(i); Recordset := MySelectQuery.NextRecordset(i); Recordset := MySelectQuery.NextRecordset(i); if MySelectQuery.State = dsBrowse then begin Recordset := MySelectQuery.NextRecordset(i); if FindField('Constraint_Type') <> nil then begin SlKeysAct := TStringList.Create; SlKeysFor := TStringList.Create; try while not EOF do begin if AnsiUpperCase(FieldByName('Constraint_Type').AsString) = AnsiUpperCase('FOREIGN KEY') then begin SlKeysAct.Clear;

GetKeys(FieldByName('Constraint_Keys').AsString, True);

sConstraintName := FieldByName('Constraint_Name').AsString;

Next;

GetForeignKeyFieldsAndTable(FieldByName('Constraint_Keys').AsString);

SlKeysFor.Clear; GetKeys(sForeignKeys, False); for i := 0 to (SlKeysAct.Count - 1) do begin SlForeignKeyName.Add(sConstraintName);
SlKeysActTable.Add(SlKeysAct.Strings[i]);
SlKeysForeignTable.Add(SlKeysFor.Strings[i]);
SlForeignKeyTable.Add(sForeignTable); end; end; Next; end; finally FreeAndNil(SlKeysAct); FreeAndNil(SlKeysFor); end; end; end; end;
finally FreeAndNil(MyRecordQuery); end; finally FreeAndNil(MySelectQuery); end;end;
procedure TForm1.BStartClick(Sender: TObject);var SlForeignKeyName, SlKeysActTable, SlKeysForeignTable, SlForeignKeyTable: TStringList; i: Integer;begin try SlForeignKeyName := TStringList.Create; SlKeysActTable := TStringList.Create; SlKeysForeignTable := TStringList.Create; SlForeignKeyTable := TStringList.Create; GetForeignKeys('Kundendaten', ADOConnection1, SlForeignKeyName, SlKeysActTable, SlKeysForeignTable, SlForeignKeyTable); for i := 0 to (SlForeignKeyName.Count - 1) do begin if i > 0 then begin Memo1.Lines.Add(''); end; Memo1.Lines.Add(SlForeignKeyName.Strings[i]); Memo1.Lines.Add(SlKeysActTable.Strings[i]); Memo1.Lines.Add(SlKeysForeignTable.Strings[i]); Memo1.Lines.Add(SlForeignKeyTable.Strings[i]); end; finally FreeAndNil(SlForeignKeyName); FreeAndNil(SlKeysActTable); FreeAndNil(SlKeysForeignTable); FreeAndNil(SlForeignKeyTable); end;end;
end.
2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان سطر های یک DBGrid را به صورت یکی در میان رنگ کرد؟

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);var test1: Real; RowNo: Integer;begin with (Sender as TDBGrid) do begin if (gdSelected in State) then begin Canvas.Brush.Color := clblue; end else begin

rowno := Query1.RecNo;

test1 := (RowNo / 2) - trunc(RowNo / 2);

if test1 = 0 then begin farbe := clWhite end

else begin farbe := clYellow; end; Canvas.Brush.Color := farbe;

Canvas.Font.Color := clBlack; end; Canvas.FillRect(Rect);

Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString); endend;
2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان یک دیتا بیس Access را در زمان اجرا درست کرد؟

uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);var AccessApp: Variant;begin AccessApp := CreateOleObject('Access.Application'); AccessApp.NewCurrentDatabase('c:111.mdb'); AccessApp := Unassigned;end;



2 نوشته شده توسط محمد رضا حق پرست
چگونه می توان ستون های یک DBGrid را برای Fit شدن AutoSize کرد؟


procedure SetGridColumnWidths(Grid: Tdbgrid);const DEFBORDER = 10;var temp, n: Integer; lmax: array [0..30] of Integer;begin with Grid do begin Canvas.Font := Font; for n := 0 to Columns.Count - 1 do

lmax[n] := Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER; grid.DataSource.DataSet.First; while not grid.DataSource.DataSet.EOF do begin for n := 0 to Columns.Count - 1 do begin

temp := Canvas.TextWidth(trim(Columns[n].Field.DisplayText)) + DEFBORDER; if temp > lmax[n] then lmax[n] := temp;

end; grid.DataSource.DataSet.Next; end; grid.DataSource.DataSet.First; for n := 0 to Columns.Count - 1 do if lmax[n] > 0 then Columns[n].Width := lmax[n]; end; end;
procedure TForm1.Button1Click(Sender: TObject);begin SetGridColumnWidths(dbgrid3);end;
2 نوشته شده توسط محمد رضا حق پرست
چگونه میتوان ستون ردیف را به یک DBGrid اضافه کرد؟

برای این کار ابتدا در DBGrid یک فیلد خالی ایجاد کنید و Title آن را به No تغییر دهید و کد زیر را در رخداد مربوطه بنویسید.


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);begin if DataSource1.DataSet.RecNo > 0 then begin if Column.Title.Caption = 'No' then DBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top, IntToStr(DataSource1.DataSet.RecNo)); end;end;
2 نوشته شده توسط محمد رضا حق پرست |












¤ نوشته شده در ساعت 05:48 توسط حق پرست |
صفحه قبل « | » صفحه بعد
Template Designer: Hadi Mohammadi - Temp4blog.Com - in afflitation whit WeblogSara.com