تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 2 از 17 اولاول 12345612 ... آخرآخر
نمايش نتايج 11 به 20 از 162

نام تاپيک: زبان Delphi : تمامی مباحث و مسائل

  1. #11
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

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


    ( شكل شماره – 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 به صورت يك
    تصوير نقشه بيتي مي باشد كه همان تصوير چرخانده شده است.

    به خاطر داشته باشيد كه تمامي دستورات مربوط به گرافيك و سرعت
    عملكرد آنها بستگي كامل به سرعت كامپيوتر كاربر دارد.

    موفق باشيد

  2. #12
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    محيط دلفي براي برنامه نويسي يكي از بهترين محيطهاي برنامه نويسي است گذشته از كاركرد داخلي و كمپايلر آن كه بسيار قوي و سريع است، محيط آن يعني 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 را بزنيد. در اينحالت اگر روي كد تابع باشيد به قسمت تعريف آن خواهيد رفت.



    خوب اين هم قسمت اول اين مقاله كه اميدوارم مفيد بوده باشد.

    من منتظر شنيدن نظرات و تجربيات شما هستم.

    استفاده از اين مقاله در سايتها و ديگر رسانه ها بشرط ذكر نام و نشاني نويسنده بلامانع مي باشد.

  3. #13
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    كمي تاريخچه
    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 آشنا كنه

  4. #14
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    برخي مواقع بعضي از برنامه هاي شما احتياج به خواندن اطلاعات از روي
    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 را از
    درايو خارج نماييد و نتيجه آن را مشاهده كنيد.

    موفق باشيد

  5. #15
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    *** دو کد زير در دلفي 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;

  6. #16
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    تبديل خصوصيات فونتها به يك رشته و برعكس

    بعضى اوقات ضرورى است كه خصوصيات يك 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;

  7. #17
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    با سلام
    كسانيكه با اينترنت كار ميكنند مطمنا براي يكبار هم شده از فايلهاي 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,...) وجود دارد كه در مقاله بعدي به همراه چگونگي استفاده از قابليت تصويري اين كنترل كه بسيار جالب مي باشد شرح خواهم داد. ان شا الله
    با تشكر

  8. #18
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    طريقه بدست آوردن اطلاعات مربوط به هارد ديسک - سي دي رام - فلاپي ديسک
    اطلاعاتي که روالهاي زير برمي گرداند عبارتست از شماره سريال - نوع سيستم فايل -
    پشتيباني از نام فايلهاي طولاني و نام درايو


    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. #19
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    بالاترين 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ها و بسياري خصوصيات استاندارد و حرفه اي ديگر.

  10. #20
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    در اين مقاله طريقه اجرا يا باز کردن نرم افزار هاي خارج از محيط دلفي را با استفاده از تابع 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;

    براي کسب اطلاعات بيشتر به آدرس ميکروسافت
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    مراجعه فرماييد.

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •