-
اين مقاله مناسب كاربراني مي باشد كه استفاده زيادي
از گرافيك در برنامه هاي خودشان مي كنند. توسط اين مقاله
مي توانيد تا يك تصوير نقشه بيتي را در داخل صفحه
با زواياي مختلف بچرخانيد .
( شكل شماره – 1 )
اجازه دهيد تا در ابتدا نگاهي به اين موضوع از نظر رياضيات
بياندازيم. از نظر رياضيات ، هر نقطه اي مي تواند حول
يك نقطه ديگر و با زواياي مختلف بچرخد. اگر به شكل شماره 1
توجه فرماييد ، خواهيد ديد كه نقطه ( يا نيم خط ( P مي تواند
حول نقطه O و در زواياي مختلفي بچرخد.
فرمولي كه در رياضي براي چرخاندن يك نقطه حول نقطه ثابت
و با زاويه مشخص است ، بدين صورت مي باشد :
حال اگر بخواهيم نقطه مذكور را حول يك نقطه ديگر بچرخانيم
به اين فرمول احتياج پيدا خواهيم كرد :
اين فرمولها به صورت ماتريسي نوشته شده اند.
به طور كلي ماتريسها كمك بسيار زيادي در رابطه با گرافيك
و تغييرات آن اعمال مي كنند. در بسياري از روشهاي ويرايش
يك تصوير يا گرافيك ، ما از ماتريسها كمك مي گيريم.
حال اجازه دهيد اين فرمول را به دستورات دلفي تبديل كنيم
و نتيجه آن را مشاهده كنيم ...
كد:
CONST
MaxPixelCount = 32768;
TYPE
TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
...
// "Simple" approach. For pixel (i,j), use "reverse" rotation to find
// where the rotated pixel must have been before the rotation.
// Don't bother with center of pixel adjustment.
// Assumes input BitmapOriginal has PixelFormat = pf24bit.
FUNCTION RotateBitmapMethod1 (CONST BitmapOriginal: TBitmap;
CONST iRotationAxis, jRotationAxis: INTEGER;
CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;
VAR
cosTheta : EXTENDED;
i : INTEGER;
iOriginal : INTEGER;
iPrime : INTEGER;
j : INTEGER;
jOriginal : INTEGER;
jPrime : INTEGER;
RowOriginal: pRGBTripleArray;
RowRotated : pRGBTRipleArray;
sinTheta : EXTENDED;
BEGIN
// The size of BitmapRotated is the same as BitmapOriginal. PixelFormat
// must also match since 24-bit GBR triplets are assumed in ScanLine.
RESULT := TBitmap.Create;
RESULT.Width := BitmapOriginal.Width;
RESULT.Height := BitmapOriginal.Height;
RESULT.PixelFormat := pf24bit; // Force this
// Get SIN and COS in single call from math library
sincos(AngleOfRotation, sinTheta, cosTheta);
// If no math library, then use this:
// sinTheta := SIN(AngleOfRotation);
// cosTheta := COS(AngleOfRotation);
// Step through each row of rotated image.
FOR j := RESULT.Height-1 DOWNTO 0 DO
BEGIN
RowRotated := RESULT.Scanline[j];
jPrime := j - jRotationAxis;
FOR i := RESULT.Width-1 DOWNTO 0 DO
BEGIN
iPrime := i - iRotationAxis;
iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta);
jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta);
// Make sure (iOriginal, jOriginal) is in BitmapOriginal. If not,
// assign blue color to corner points.
IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND
(jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1)
THEN BEGIN
// Assign pixel from rotated space to current pixel in BitmapRotated
RowOriginal := BitmapOriginal.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
END
ELSE BEGIN
RowRotated[i].rgbtBlue := 255; // assign "corner" color
RowRotated[i].rgbtGreen := 0;
RowRotated[i].rgbtRed := 0
END
END
END
END {RotateBitmapMethod1};
همان طور كه در كد بالا ملاحظه مي فرماييد ما از دستور ScanLine جهت
چاپ و نمايش پيكسلهاي تصوير استفاده كرده ايم. اين دستور يكي از
بهترين دستورات دلفي براي نمايش پيكسلهاي تصوير مي باشد.
اين دستور به صورت اسمبلي تدوين شده است و نتيجه آن بسيار سريع
مي باشد و سرعت نمايش آن نسبت به ساير دستورات ترسيم ، به خاطر
خطي بودن آن ، بسيار بالاتر مي باشد.
در ابتدا ما به صورت موقت يك تصوير نقشه بيتي ديگر مي سازيم. سپس
تصوير اوليه را با استفاده از فرمول ذكر شده ، مي چرخانيم و در تصوير
جديد قرار مي دهيم. نتيجه يا همان Result اين Function به صورت يك
تصوير نقشه بيتي مي باشد كه همان تصوير چرخانده شده است.
به خاطر داشته باشيد كه تمامي دستورات مربوط به گرافيك و سرعت
عملكرد آنها بستگي كامل به سرعت كامپيوتر كاربر دارد.
موفق باشيد
-
محيط دلفي براي برنامه نويسي يكي از بهترين محيطهاي برنامه نويسي است گذشته از كاركرد داخلي و كمپايلر آن كه بسيار قوي و سريع است، محيط آن يعني IDE آنهم قدرت بسيار زيادي دارد كه باعث شده يكي از بهترين اديتورها باشد. در اين مقاله من سعي بر اين داشته ام تا با ارائه يك سري از نكات و كليدهاي ميانبر كه مي توانند براي كار در دلفي بسيار مفيد و كارا باشند، كمك كنم تا شما بتوانيد با قدرت بيشتر به برنامه نويسي و كار در اين محيط قدرتمند ادامه دهيد.
در قسمت اول مقاله كه در حال حاضر در مقابل شماست من يك سري از كليدهاي ميانبر و تركيبي مورد استفاده در IDE دلفي را بصورت ليست وار و همراه يك توضيح كوچك آورده ام. با توجه به اينكه اين مطالب حاصل تجربه هاي خودم در كار با دلفي (از 1 تا 7) بوده ممكنه كه يك سري موارد ديگري هم باشد كه من تا حالا برخورد نداشتم كه دوستان عزيز ميتونند به اين ليست اضافه كنند و نام خود را در انتهاي اين مقاله ذكر كنند و حتما يك نسخه از آن را براي من ارسال كنند.
اميدوارم كه اين سري مقالات با كمك شما در اثر مرور زمان بهتر و مفيد تر شود.
دوستان عزيز برنامه نويس ممكنه كه شما مدتها با دلفي مشغول برنامه نويسي بوده باشيد اما من يقين دارم كه در اين ليست نكات و روشهاي جديدي را خواهيد آموخت.
قسمت اول - كليدهاي ميانبر و تركيبي:
جستجو در متن بصورت مستقيم:
براي اينكار كليدهاي 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 را بزنيد. در اينحالت اگر روي كد تابع باشيد به قسمت تعريف آن خواهيد رفت.
خوب اين هم قسمت اول اين مقاله كه اميدوارم مفيد بوده باشد.
من منتظر شنيدن نظرات و تجربيات شما هستم.
استفاده از اين مقاله در سايتها و ديگر رسانه ها بشرط ذكر نام و نشاني نويسنده بلامانع مي باشد.
-
كمي تاريخچه
FastReport قبلا با نام FreeReport عرضه مي شد و يك محصول رايگان بود. ولي بعدها به FastReport تغيير نام پيدا كرد و به صورت تجاري عرض گرديد. البته هنوز كمپوننت FreeReport توسعه مي يابد و نسخه هاي جديدتر آن را از سايت
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
يا
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مىتوانيد داون لود كنيد.
آشنايي كلي با شكل گزارش سازي در FastReport
اين كمپوننت يك محيط Report Desinger در اختيار شما قرار مي دهد كه با استفاده از آن مي توانيد Reportها را طراحي كنيد، اسكريپت نويسي كنيد و يا فرم هاي جديد براي انتخابي كردن گزارش خود ايجاد كنيد. براي وارد شدن به اين Report Desinger بايد از كمپوننت TfrReport استفاده كنيد. كافي است يك كمپوننت TfrReport روي فرم بگذاريد و روي آن دابل كليك كنيد يا كليد سمت راست را زده و گزينه Design Report را انتخاب كنيد. ممكن است اين محيط كه موسوم به Desinger است در ابتدا كمي شلوغ به نظر بيايد ولي در انتهاي اين مقاله آموزشي كاملا با استفاده از اين Desinger آشنا خواهيد شد.
شما مي توانيد گزارش هاي خود را در فايلهايي با پسوند frf. ضبط كنيد و در موقع نياز هر كدام از آنها را Load نماييد و همچنين اگر برنامه شما تنها يك گزارش دارد مي توانيد آن گزارش را در خود فايل EXE نگهداري كنيد.
ساخت يك گزارش ساده
يك كمپوننت TfrReport را روي فرم قرار دهيد و روى آن دابل كليك كنيد تا به محيط Report Designer برويم. خوب ... مىخواهيم براى شروع يك گزارش بسيار ساده بسازيم.
از ToolBar سمت چپ گزينه Insert rectangle object را انتخاب كنيد. آيكن اين گزينه شبيه به آيكن كمپوننتMemo است.
مىبينيد كه وقتى اين كمپوننت را در محل مربوطه قرار مىدهيد پنجره اى باز مي شود:
همانند شكل در قسمت بالا تايپ كنيد: "سلام دوستان!" و سپس اين پنجره را ببنديد.
خوب! اولين گزارش خودمون رو ساختيم. حالا به سادگى گزارش را Save كنيد و اسم اون رو بگذاريد Test. اين فايل رو در همون جايى ضبط كنيد كه پروژه تون در اونجا Save شده است.
حالا Designer رو ببنديد و يك Button روي فرمتون بگذاريد و و در اونت OnClick آن كد زير رو بنويسيد:
frReport1.LoadFromFile('Test.frf');
frReport1.ShowReport;
خوب! كار ساخت اولين گزارشمون تمام شد. ما خيلي ساده در ابتدا گزارشى را كه قبلا ساخته بوديم Load كرديم و بعدش هم از متد ShowReport براى نمايش گزارش استفاده كرديم. البته مىتوانستيم از متد PrintPreparedReportDlg براى چاپ مستقيم گزارش بدون نمايش پيشنمايش يا Preview استفاده كنيم.
نكته: در صورتى كه بخواهيم ميتوانم با True كردن پراپرتي StoredInDFM گزارش را در EXE خود ضبط كنيم. در آن صورت لازم نيست گزارش را ضبط كنيم و همچنين احتياجى نيست كه آن را در كد Load بكنيم.
اين حالت تنها وقتى مفيد است كه برنامه شما فقط يك گزارش داشته باشد.
خوب! ما تا حالا اصول استفاده از FastReport رو ياد گرفتيم. در باقي اين مقاله آموزشى گزارشهاى پيشرفتهترى مىسازيم و آرام آرام شما با FastReport احساس راحتى مىكنيد.
ساخت يك گزارش ديگر
خوب ... يك كمپوننت TTable رو از پالت BDE روى فرمتون قرار دهيد و پراپرتي DatabaseName آن را برابر DBDEMOS و پراپرتى TableName را برابر Biolife قرار دهيد.
يك كمپوننت TfrReport و همچنين يك كمپوننت TfrDBDataSet روى فرم قرار دهيد و پراپرتى DataSet آن را برابر نام Table1 قرار دهيد و پراپرتى DataSet كمپوننت TfrReport را برابر frDBDataSet1 قرار بدهيد. حالا با كليك بر روى كمپوننت frReport1 وارد محيط Designer شده و Tools>Tools>Insert DB Fields را انتخاب كنيد.
خوب شما انتخاب كنيد و آن را روي فرم قرار دهيد. پنجره اي شبيه به شكل زير نمايش داده مىشود:
تمام فيلدها را انتخاب كنيد و OK را بزنيد.....
خوب تقريبا كارمان تمام است. اگر خوب نگاه كنيد مي بينيد كه دو باند روى فرم گزارش اضافه شد كه يكى Page Header و ديگرى Master Data نام دارد. File>Preview را انتخاب كنيد و ببينيد گزارش شما چه شكلى خواهد بود. گزارش خودتان را Save كنيد و از روشى كه قبلا ذكر شد براى نمايش گزارش در زمان اجرا يا Run-Time استفاده كنيد.
ساخت گزارشهاى پيشرفتهتر
به موارد زير توجه كنيد:
1- اگر بخواهيد از كمپوننتهايى مثل RichEdit - Chart - CheckBox و ... در گزارش خود استفاده كنيد بايد كمپوننت مربوطه را روى فرم برنامه خود قرار دهيد.
2- اگر بخواهيد امكان Export گزارش به فرمتهاى HTML - Text - CSV يا DOC را به برنامه خود بدهيد بايد كمپوننت مربوطه را روى فرم برنامه خود قرار دهيد.
3- اگر بخواهيد گزارش Master-Detailى بسازيد بايد از دو باند Master data و Detail data استفاده كنيد.
4- اگر بخواهيد مجموع مقادير يك فيلد رو در انتهاى يك گزارش بنويسيد بايد از يك باند Master footer استفاده كنيد و گزينه Insert rectangle object را انتخاب كنيد. سپس Insert Expression را انتخاب كنيد. Functions را انتخاب كنيد و از تابع Count براى انجام اين كار استفاده كنيد. همچنين مىتوانيد Variables را انتخاب كنيد و از مواردى همچون شماره صفحه، كل صفحات، تاريخ و ... استفاده كنيد.
اميدوارم اين مقاله بتونه هر چند اندك شما رو با FastReport آشنا كنه
-
برخي مواقع بعضي از برنامه هاي شما احتياج به خواندن اطلاعات از روي
CD را دارند. قبل از اجراي برنامه مي توان با استفاده از دستورات مختلفي
مانند FileExists وجود CD مورد نظر در CD-Rom را بررسي كرد و در صورت صحيح
بودن آن برنامه را اجرا كرد.
اما اگر كاربر در هنگام اجراي برنامه CD حاوي اطلاعات را از CD-Rom خارج كند
به چه صورت مي توان آن را تشخيص داد.
شايد بررسي مكرر توسط دستوراتي از قبيل FileExists كار درستي نباشد.
ويندوز براي شما يك دستور تدارك ديده كه توسط آن مي توانيد وارد و خارج شدن
CD از CD-Rom را تشخيص دهيد.
زماني كه شما يك CD را وارد CD-Rom مي كنيد آن به عنوان يك Device جديد
براي ويندوز شناخته مي شود. پس از اين روش مي توان وارد و خارج كردن آن را
در هنگام اجراي برنامه تشخيص داد.
به كد زير توجه فرماييد :
type
TForm1 = class(TForm)
private
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
// اين قسمت فراموش نشود
public
end;
{...}
implementation
{$R *.DFM}
procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
var
myMsg: string;
begin
inherited;
case Msg.wParam of
DBT_DEVICEARRIVAL: myMsg := 'CD inserted!';
DBT_DEVICEREMOVECOMPLETE: myMsg := 'CD removed!';
end;
ShowMessage(myMsg);
end;
به همين سادگي مي توان اين عمل را تشخيص داد.
البته راههاي ديگري نيز براي تشخيص اين اعمال وجود دارند اما بهترين
و راحت ترين راه ممكن ، همان راهي است كه من براي شما نوشته ام.
از اين كد در برنامه هاي خود استفاده كنيد و جلوي Error هاي برنامه را در
صورت عدم وجود CD در CD-Rom بگيريد.
برنامه را اجرا كنيد ، سپس يك CD در درايو قرار دهيد ، بار ديگر CD را از
درايو خارج نماييد و نتيجه آن را مشاهده كنيد.
موفق باشيد
-
*** دو کد زير در دلفي 7 تحت ويندوزهاي 98، 2K و XP تست شده اند ***
يک روش ساده براي نمايش فايلهاي داخل يک folder همراه با Icon آنها و اعلام نوع فايل (استفاده از API)
يک ListView، يک ImageList و يک Buttonروي فرم قرار دهيد.
کد از نايتي
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ImgList, ShellAPI;
type
TForm1 = class(TForm)
ImageList1: TImageList;
Button1: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure InsertFilesInList( strPath: String; ListView: TListView; ImageList: TImageList);
var
pFile: Integer;
Icon: TIcon;
SearchRec: TSearchRec;
ListItem: TListItem;
FileInfo: SHFILEINFO;
begin
// Create a temporary TIcon
Icon := TIcon.Create;
ListView.Items.BeginUpdate;
try
// search for the first file
pFile := FindFirst(strPath + '*.*', faAnyFile, SearchRec);
while pFile = 0 do
begin
with ListView do
begin
// On directories and volumes
if ((SearchRec.Attr and FaDirectory <> FaDirectory) and
(SearchRec.Attr and FaVolumeId <> FaVolumeID)) then
begin
ListItem := ListView.Items.Add;
//Get The DisplayName
SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
SizeOf(FileInfo), SHGFI_DISPLAYNAME);
Listitem.Caption := FileInfo.szDisplayName;
// Get The TypeName
SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
SizeOf(FileInfo), SHGFI_TYPENAME);
ListItem.SubItems.Add(FileInfo.szTypeName);
//Get The Icon That Represents The File
SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
Icon.Handle := FileInfo.hIcon;
ListItem.ImageIndex := ImageList.AddIcon(Icon);
// Destroy the Icon
DestroyIcon(FileInfo.hIcon);
end;
end;
pFile := FindNext(SearchRec);
end;
finally
Icon.Free;
ListView.Items.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Assign a Imagelist to the ListView
ListView1.SmallImages := ImageList1;
// Show Listview in Report Style and add 2 Columns
ListView1.ViewStyle := vsReport;
ListView1.Columns.Add;
ListView1.Columns.Add;
InsertFilesInList('C:\', ListView1, ImageList1);
end;
end.
گاهي بد نيست براي انجام بعضي کارها از خود سيستم کمک بگيريم. کد زير اندازه فايلي که انتخاب ميشود را بر ميگرداند. بد نيست، به درد Text-fileها ميخوره .
يک Button، يک Label، يک OpenDialog روي فرم قرار دهيد.
کد از کريس بري
procedure TForm1.Button1Click(Sender: TObject);
var
SearchRec: TSearchRec;
begin
if OpenDialog1.Execute then
if FindFirst(OpenDialog1.FileName, faAnyFile, SearchRec) = 0 then
Label1.Caption := FloatToStrF(SearchRec.Size/1048576, ffFixed, 7, 2)+' MB';
FindClose(SearchRec);
end;
-
تبديل خصوصيات فونتها به يك رشته و برعكس
بعضى اوقات ضرورى است كه خصوصيات يك Object خاص را به شكل string يا رشته داشته باشيم. به عنوان مثال، اگر يك برنامه به كاربر اجازه تغيير فونت را بدهد، برنامه شما بايد اين تغييرات را در Registry ضبط كند؛ در آن صورت شما بايد اين تنظيمات را به عنوان رشته ذخيره كنيد. دو تابع زير به شما اجازه مىدهد كه خصوصيات يك Object فونت را به رشته تبديل كنيد و آنگاه آن راشته را به يك Object فونت تبديل نماييد.
const
csfsBold = '|Bold';
csfsItalic = '|Italic';
csfsUnderline = '|Underline';
csfsStrikeout = '|Strikeout';
//
// Expected format:
// "Arial", 9, [Bold], [clRed]
//
procedure StringToFont(
sFont : string; Font : TFont );
var
p : integer;
sStyle : string;
begin
with Font do
begin
// get font name
p := Pos( ',', sFont );
Name :=
Copy( sFont, 2, p-3 );
Delete( sFont, 1, p );
// get font size
p := Pos( ',', sFont );
Size :=
StrToInt( Copy( sFont, 2, p-2 ) );
Delete( sFont, 1, p );
// get font style
p := Pos( ',', sFont );
sStyle :=
'|' + Copy( sFont, 3, p-4 );
Delete( sFont, 1, p );
// get font color
Color :=
StringToColor(
Copy( sFont, 3,
Length( sFont ) - 3 ) );
// convert str font style to
// font style
Style := [];
if( Pos( csfsBold,
sStyle ) > 0 )then
Style := Style + [ fsBold ];
if( Pos( csfsItalic,
sStyle ) > 0 )then
Style := Style + [ fsItalic ];
if( Pos( csfsUnderline,
sStyle ) > 0 )then
Style := Style + [ fsUnderline ];
if( Pos( csfsStrikeout,
sStyle ) > 0 )then
Style := Style + [ fsStrikeout ];
end;
end;
//
// Output format:
// "Aril", 9, [Bold|Italic], [clAqua]
//
function FontToString(
Font : TFont ) : string;
var
sStyle : string;
begin
with Font do
begin
// convert font style to string
sStyle := '';
if( fsBold in Style )then
sStyle := sStyle + csfsBold;
if( fsItalic in Style )then
sStyle := sStyle + csfsItalic;
if( fsUnderline in Style )then
sStyle := sStyle + csfsUnderline;
if( fsStrikeout in Style )then
sStyle := sStyle + csfsStrikeout;
if( ( Length( sStyle ) > 0 ) and
( '|' = sStyle[ 1 ] ) )then
begin
sStyle :=
Copy( sStyle, 2,
Length( sStyle ) - 1 );
end;
Result := Format(
'"%s", %d, [%s], [%s]',
[ Name,
Size,
sStyle,
ColorToString( Color ) ] );
end;
end;
-
با سلام
كسانيكه با اينترنت كار ميكنند مطمنا براي يكبار هم شده از فايلهاي real استفاده كرده اند فايلهايي كه
با پسوند هاي rm,ra,ram,... مي باشند و فرمتهاي صوتي و تصويري را پشتيباني ميكنند .با اين توضيح به نكات
ذيل توجه كنيد!
اين نرم افزار توانايي دارد يك فايل mpeg با حجم 15 مگابايت را به فايل تصويري به حجم
1 مگابايت تبديل كند.البته لازم به توضيح است كه كيفيت تصوير چندان مطلوب نمي باشد و در مواردي مي توان از آن استفاده كرد.
همچنين فايلهاي صوتي حتيMP3 با كيفيت مطلوب توسط اين سيستم به مقدار قابل توجهي كم حجم ميشوند.
نرم افزاري هايي از قبيل REAL PRODUCER قابليت تبديل فايلها را با هر فرمتي به REAL دارا مي باشند واحتياجي به سخت افزار نمي باشد
چگونگي استفاده از اين امكانات در دلفي:
ابتدا بايد نرم افزار REAL بر روي رايانه شما نصب شود سپس در دلفي به :
را انتخاب كنيد.import activex control\commponent
در پنجره جديد real player activeX control library(version X,x) را انتخاب كرده و دكمه install را بزنيد.
حال در قسمت activex ايكوني آبي رنگ با علامت play داريد.آن را به فرم اضافه كنيد!
يك حستجو گر صوتي بر روي فرم شما ايجاد ميشود كه تصوير آن بستگي به نسخه نصب شده REAL بر روي سيستم شمادارد.
براي پخش يك فايل شما ميتوانيد نام آن را در source وارد كرده و برنامه را اجرا كنيد ويا براي كنترل فايل توسط
برنامه ميتوانيد از دستورات زير استفاده كنيد.
raelaudio1.source =:('path\filename');
realaudio1.doplay;
براي استفاده يك كايد جهت play/pause مانند دستگاههاي video cd نيز ميتوانيد از دستور زير استفاده كنيد.
real audio1.doplaypause;
و
realaudio1.dostop;جهت پايان دادن به پخش
realaudio1.getitle;مشخصات فايل كه در زمان ساخت به آن معرفي ميگردد
realaudio1.setmute:=true/false;جهت قطع صدا
realaudio1.autostart:=true/false;جهت شروع خودكار در زمان اجراي برنامه
همچنين دستوراتي نيز براي كنترل فريم هاي فايل (ff,rew,...) وجود دارد كه در مقاله بعدي به همراه چگونگي استفاده از قابليت تصويري اين كنترل كه بسيار جالب مي باشد شرح خواهم داد. ان شا الله
با تشكر
-
طريقه بدست آوردن اطلاعات مربوط به هارد ديسک - سي دي رام - فلاپي ديسک
اطلاعاتي که روالهاي زير برمي گرداند عبارتست از شماره سريال - نوع سيستم فايل -
پشتيباني از نام فايلهاي طولاني و نام درايو
From The Windows.Pas
--------------------
--------------------
function GetVolumeInformationA(lpRootPathName: PAnsiChar;
lpVolumeNameBuffer: PAnsiChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PAnsiChar; nFileSystemNameSize: DWORD): BOOL; stdcall;
function GetVolumeInformationW(lpRootPathName: PWideChar;
lpVolumeNameBuffer: PWideChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PWideChar; nFileSystemNameSize: DWORD): BOOL; stdcall;
function GetVolumeInformation(lpRootPathName: PChar;
lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL; stdcall;
Example
-------
-------
Used Variables
--------------
Path : PChar;
--> String that contains the root directory of the volume to
be described.
VolumeName : PChar;
--> Points to a buffer that receives the name of the specified
volume.
VolumeNameSize : DWord;
--> Specifies the lenght in characters of the buffer that
receives the volume name.
SerialNumber : DWord;
--> Points to a variable that receives the volume's serial
number.
MaxLength : DWord;
--> Receives the maximum length in characters of a filename
supported by the specified file system.
(to indicate if long file names are supported)
- long file names --> value : 255
Flags : DWord;
- FS_CASE_IS_PRESERVED
- FS_CASE_SENSITIVE
- FS_UNICODE_STORED_ON_DISK
- FS_PERSISTENT_ACLS
- FS_FILE_COMPRESSION
- FS_VOL_IS_COMPRESSED
(for more info on the flags look in the help file)
FileSystem : PChar;
--> Points to a buffer that receives the name of the specified
file system.
FileSystemNameSize: DWord;
--> Specifies the lenght in characters of the buffer that
receives the filesytem name.
Code
----
Path := 'C:\';
VolumeNameSize := 256;
FileSystemNameSize := 256;
GetVolumeInformation(Path,VolumeName,VolumeNameSiz e,
@SerialNumber,MaxLength,Flags,FileSystem,FileSyste mNameSize);
-
بالاترين 9 بسته Installساز
اگر به دنبال ابزارى ميگرديد كه برنامه خود را منتشر كرده و تحويل دهيد بيش از اين نگرديد! اين گزارش را بخوانيد.
DeployMaster
اگر به دنبال يك ابزار مناسب براى توزيع انتشار برنامه ويندوزى خود يا فايلهاى كامپيوترى خودتان مىگرديد و به علاوه ساير Installسازها شما را خسته كردهاند آنگاه JGsoft DeployMaster راه حلى است كه شما لازم داريد.
Emma Setup
نسخه 3 Emma Setup يك Installساز 32 بيتي است. لازم نيست كه يك برنامهنويس باشيد تا بتوانيد يك Install شخصى و حرفهاى بسازيد. در حالى كه خصوصيات حرفهاى خيلى زيادى دارد قيمت آن بسيار پايين و كار كردن با آن بسيار ساده است. اين برنامه براي بسيارى از موارد بهترين انتخاب است.
gInstall
فقط تصور كنيد كه يك Installer قابل Skin گذارى چقدر مىتواند مفيد باشد. مشتريان شما برنامه شما را از همان آغاز دوست خواهند داشت. اجازه دهيد مشتريانتان با استفاده از شركت يا برنامه شما خودشان را بشناسند. آيا دوست نداريد Setup برنامه شما دقيقا به شكل و تيپ برنامه خودتان باشد.
Install Shield
Install Shield قابليت كنترل كامل بر روى Installer ويندوز را به شما مي دهد و خصوصيات جديد و قدرتمند Installer ويندوز را در اختيار شما قرار ميگذارد. برنامه نويسان بدون نوشتن حتي يك خط كد مي توانند از تمامي قابليتهاي Installer ويندوز استفاده كنند.
Wise Solutions
Wise انقلاب بعدي در زمينه ساخت Installer براي ويندوز است كه كاربران را كاملا در سيكل زماني ساخت Setup قرار مي دهد. شما قابليتهايي از قبلي ساخت Installهاي حرفهاي و قابل اطمينان را خواهيد داشت.
Inno Setup
Inno Setup يك Setup ساز رايگان براي ويندوز است كه تمامي نسخه هاي 32بيتي ويندوز را پيشتيباني مي كند. اگرچه رايگان است ولي بسيار بسيار قدرتمند است و سورس آن به زبان دلفي نيز مهيا مي باشد.
ICE (Install Creation Environment)
يك Installساز قوي كه به شما اجازه مي دهد Setup برنامه هاي خود را كه با دلفي يا C++ Builder نوشته ايد بسازيد. احتياج به يادگرفتن يك زبان scripting نيست. كار كردن با اين نرم افزار بسيار ساده است و اصولا براي ساخت Install براي دلفي و C++ Builder ساخته شده است.
GP-Install
GP-Install يك Setup ساز است كه خصوصيات "ساده بودن" و "قابل درك بودن" را با هم تركيب كرده است. Setup ساخته شده بسيار فشرده است. و به شما اجازه مي دهد كه Setup خود را هر گونه كه دوست داريد بياراييد. جالبتر از همه اين كه آن رايگان است.
Instyler
اگر به دنبال يك Installer ارزان قيمت و آسان ميگرديد تا برنامه هاي خود را انتشار دهيد SmartSetup را آزمايش كنيد. اين برنامه قابليت هايي همچون: مديريت پروژه، انوع مختلف Setup، سازگاري با Registry/Ini، شكل قابل تغيير Setup، پشتيباني از uninstallat، امكان upgrade، امكان حفاظت با استفاده از رمز، استفاده ار shortcutها و بسياري خصوصيات استاندارد و حرفه اي ديگر.
-
در اين مقاله طريقه اجرا يا باز کردن نرم افزار هاي خارج از محيط دلفي را با استفاده از تابع API ويندوز ShellExecute را ياد خواهيد گرفت.
چرا بايد برنامه ها را از دلفي اجرا کرد؟
شايد اين سوال براي شما پيش بيايد چرا بايد نرم افزارها را خارج از دلفي اجرا کرد. شما در يکي از موارد ذيل ممکن است نياز به اجراي يک نرم افزار خارج از دلفي داشته باشيد
• برنامه هاي نصب و عزل
• برنامه هاي سيستمي
• برنامه هاي اپليکيشن سرور
• برنامه هاي گزارش گيري
• و ....
موارد بسياري است که ممکن است شما بخواهيد از اين دستور استفاده کنيد که به چندي از آنها اشاره شد.
دستور ShellExecure
اين دستور به ما اجازه ميدهد که برنامه هاي ديگر را اجرا کنيم. نحو اين دستور به شکل ذيل مي باشد.
HINSTANCE ShellExecute(HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
جدول زير پارامترهاي اين دستور را شرح ميدهد.
پارامتر ورودي/خروجي توضيحات
hwnd
ورودي
دستگيره يا هندل پنجره اصلي - براي گزارش خطاها حتما نياز است
lpOperation
ورودي
اشاره گر - اين پارامتر به نوع عمليات اشاره مي کند
lpFile
ورودي
اشاره گر به نام فايل اجرايي شما
lpParameters
ورودي
اشاره گر به پارامترهاي ارسالي به نرم افزار شما - در صورتي که پارامتر نباشد به صورت تهي بماند
lpDirectory
ورودي
دايرکتوري پيش فرض براي اجراي نرم افزار
nShowCmd
ورودي
اشاره گر تنظيم حالت نمايش برنامه بعد از اجرا
د ر صورتي که دستور shellexcute به درستي اجرا نشود يک کد خطا برمي گرداند شما مي توانيد با استفاده از تابع GetLastError خطا رخ داده را متوجه شويد. در صورتي که دستور Shellexecute به درستي اجرا شود کد خطاي بازگشتي بزرگتر از 32 مي باشد . در صورتي که کد خطا بازگشتي کمتر يا برابر با 32 باشد يک خطا رخ داده است. براي دريافت اطلاعات بيشتر در مورد کدهاي خطا اين دستور به MSDN مراجعه کنيد.
در دلفي شما به راحتي با استفاده از دستور SysErrorMessage مي توانيد آخرين خطا را بدست آوريد.نمونه کد زير روش استفاده از اين دستور را نشان داده است.
if ShellExecute(Handle, 'print', PChar('c:\log.txt'), nil, nil, SW_SHOWNORMAL) <= 32 then
ShowMessage(SysErrorMessage(GetLastError));
پارامتر lpOperation
با استفاده از دستور ShellExecute مي توان نرم افزارها و آبجکتهاي مختلف را اجرا کرد . مقادير قابل قبول براي پارامتر دوم اين دستور lpOperation به شرح جدول ذيل مي باشد.
lpOperation مقدار پارامتر
شرح
edit
باز کردن يک سند براي ويرايش در يک ويرايشگر
explore
مرورگر فايلهاي ويندوز براي مرور دايرکتوري خاص ...
find
جستجو به دنبال يک فايل در دايرکتوري خاص...
open
باز کردن يک فايل يا برنامه
print
چاپ يک سند
NULL
اطلاعات بيشتر در پايين ...
در صورتي که مقدار پارامتر lpOperation برابر با null قرار بگيرد براي باز کردن فايل يا برنامه از رجيستري ويندوز و از قسمت تخصيص فايلهاي اجرايي به پسوند فايلها براي اجراي دستور فوق استفاده مي گردد.
پارامتر nShowCmd
اين پارامتر به دستور ShellExecute مي گويد که بعد از اجراي يک برنامه آن را به چه حالتي نمايش بدهد. انواع حالات مختلف در جدول ذيل آمده است.
nShowCmd مقدار پارامتر
شرح
SW_HIDE
مخفي کردن پنجره
SW_MAXIMIZE
بزرگ کردن پنجره
SW_MINIMIZE
به حداقل رساندن پنجره
SW_RESTORE
فعال کردن يک پنجره در صورتي که به حالت حداقل يا حداکثر باشد
SW_SHOW
نمايش پنجره در حالت و موقعيت پيش فرض
SW_SHOWDEFAULT
نمايش پنجره به حالت پيش فرض در برنامه
SW_SHOWMAXIMIZED
فعال و به حداکثر رساندن پنجره
SW_SHOWMINIMIZED
فعال و به حداقل رساندن يک پنجره
SW_SHOWMINNOACTIVE
نمايش يک پنجره در حالت غير فعال و حداقل
SW_SHOWNA
نمايش يک پنجره در وضعيت فعلي
SW_SHOWNOACTIVATE
نمايش و فعال کردن يک پنجره - ويندوز اين پنجره را در حالت پيش فرض خود نمايش مي دهد.
SW_SHOWNORMAL
نمايش و فعال کردن پنجره به حالت عادي
وقتي که شما براي اولين بار يک برنامه را اجرا مي کنيد بايد از مقدار SW_SHOWNORMAL استفاده کنيد.
استفاده از دستور ShellExecute
درقسمت پايين چند نمونه از حالتهاي استفاده از اين دستور آورده شده است. شما مي توانيد اين دستورات را براي کار خود تغيير دهيد. در دلفي براي استفاده از اين دستور بايد دو يونيت Windows و ShellAPI در قسمت Uses قرار گرفته باشد.
اجراي برنامه Demo.exe از دايرکتوري C:\app
ShellExecute(Handle,NIL,PChar('C:\apps\demo.exe'), nil,nil,SW_SHOWNORMAL);
باز کردن فايل log.txt
ShellExecute(Handle,'open',PChar('c:\log.txt'), nil,nil,SW_SHOWNORMAL);
پخش فايل ending.mp3
ShellExecute(Handle,'play',PChar('c:\ending.mp3'), nil,nil,SW_SHOWNORMAL);
چاپ فايل log.txt
ShellExecute(Handle,'print',PChar('c:\log.txt'), nil,nil,SW_SHOWNORMAL);
باز کردن مروگر فايل ويندوز از C:\
ShellExecute(Handle,'explore',PChar('c:\'), nil,nil,SW_SHOWNORMAL);
ساخت يک نامه الکترونيکي جديد به واسطه Outlook Express
Procedure CreateEmail(Const EmailAddr, Subject, Body: String);
var
ConcatEmailStr: String;
Begin
ConcatEmailStr := EmailAddr + '?subject=' + Subject + '&body=' + Body;
ShellExecute(Handle,'open',PChar(ConcatEmailStr), nil, nil, SW_SHOWNORMAL);
end;
براي کسب اطلاعات بيشتر به آدرس ميکروسافت
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مراجعه فرماييد.