نمایش نتایج 1 تا 40 از 54

نام تاپیک: معرفی و آموزش C++‎‎‎/Qt به صورت گام به گام

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله نوزدهم : معرفی و کار با TreeWidget

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

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

    در رابطه با این شیئ باید اینمطور توضیح داد که خاصیت والد و فرزند رو در خودش تخصیص داده است برای مثال من نمونه زیر رو بخوام روی این لیست نمایش بدم به صورت زیر :

    کتاب C++‎‎‎‎‎ 11
    • فصل اول
    • فصل دوم
    • و ....


    کلا یک والد یا زیر شاخه داریم و بقیه موارد زیر شاخه یا همان فرزند هستند در اصل همون Parent و Child

    حالا روشی که من میخوام برای این بکار ببرم به صورت زیر خواهد بود ابتدا برای دسترسی و راحتی کار 2 تا تابع تعریف میکنم برای parent و child

    در قسمت mainwindow.h پایینتر از Q_OBJECT


    void AddRoot(QString name, QString Discreption);
    void AddChild(QTreeWidgetItem * parent, QString name, QString Discreption);


    خب اینجا من متد ها و همچنین نام و نوع تابع رو مشخص کردم که برای AddRoot یا همان والد نام و توضیحلات رو در نظر میگیرم و برای AddChild یا همان فرزند علاوه بر نام و توضیحات هر یک شناسه تعیین کننده برای شناساندن ایتم مورد نظر برای سر شاخه هستش و اونم از نوع QTreeWidgetItem قرار میدم.

    مرحله بعد در فایل اصلیمون mainwindow.cpp توابع رو صدا زده و بدنه توابع رو میسازم به صورت زیر :


    void MainWindow::AddRoot(QString name, QString Discreption)
    {




    }


    void MainWindow::AddChild(QTreeWidgetItem* parent, QString name, QString Discreption)
    {






    }


    حالا من به کد های زیر در داخل هریک از این دو تابع نیاز دارم به صورت زیر :


    void MainWindow::AddRoot(QString name, QString Discreption)
    {


    QTreeWidgetItem * MyItem = new QTreeWidgetItem(ui->MyTreeWidget);


    MyItem->setText(0, name);
    MyItem->setText(1, Discreption);
    ui->MyTreeWidget->addTopLevelItem(MyItem);


    AddChild(MyItem, "C++‎‎‎‎‎", "Native / Objective");
    AddChild(MyItem, "Java", "Objective");


    }


    void MainWindow::AddChild(QTreeWidgetItem* parent, QString name, QString Discreption)
    {


    QTreeWidgetItem * MyItem = new QTreeWidgetItem();
    MyItem->setText(0, name);
    MyItem->setText(1, Discreption);
    parent->addChild(MyItem);






    }


    در تابع اول AddRoot ابتدا یک کپی از QTreeWidgetItem میسازم تا به عنوان آیتم های درختی برام کار کنه و در مرحله بعدی گفتم که در ایندکس اول یعنی 0 متنی رو که تابع میگیره رو ست کن و در خط بعدیش دقیقا مثل این گفتم توضیحات رو در ایندکس 1 یعنی دوم این رو ست کن و بعد از این گفتم لیست درختی من این دو گزینه رو از نوع آیتم های سر شاخه قرار بده با کد : addTopLevelItem این کار رو انجام میدم.
    در خط بعدش اومدم گفتم ایتم های AddChild برابر باشه از آیتم های تعریف شده به صورت بالا که از تابع AddChild فراخوانی میشوند به صورت زیر ...

    سه خط اول در تابع AddChild مثل تابع قبلی برای عنوان و شناسایی اینهاست و در خط آخر گفتم که آقا آیتم های والد من زیر مجموعشون برابر باشه با آیتم های فرزندی که ایجاد میشوند.

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


    ui->MyTreeWidget->setColumnCount(2);
    AddRoot("Language", "Features");


    مشخصه که گفتم دو ستون از نوع زبان و ویژگی های زبان درج کن و بعد از این تابع Addroot فراخوانی شده و تابع AddChild همینطور و نتیجه میشه به صورت زیر...

    این مثال رو حتما از روی فایل ضمیمه شده بررسی کنید تا بهتر متوجه بشید.
    فایل های ضمیمه فایل های ضمیمه

  2. #2

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیستم : معرفی و کار با Action ها

    در رابطه با اکشن ها میتونم بگم همون منوهای برنامه هستش که توسط هر اکشن ایجاد شده یک منو با مشخصه خاص تعریف و قابلیت ها و همچنین Event های خاص خودش رو ایجاد میکنه برای مثال من برای اینکه روی فرمم منو های زیر رو ایجاد میکنم به صورت زیر :

    چکار باید انجام بدم ... خیلی راحت روی فرمم قسمت منو روی Type Here کلیک میکنم و اسم منورو مینویسم مثل تصویر زیر...

    توجه کنید که هر والد میتونه زیر شاخه های خودش رو داشته باشه همچنین میتونید با کلیک روی Add Separator خط فاصلخ بین منوها به عنوان جدا کننده ایجاد کنید.

    هریک از منو هایی که ایجاد میشه به عنوان یک Action هستش مثل دیگر کنترل های دارای Event ها و Slot های خاص خودشون هستند. حالا برای اینکه مثلا با کلیک کردن رو دکمه Exit یا همون منوی ساخته شده با نام Exit یه کاری انجام بدیم چکار باید کنیم ؟ خب باید در رخداد کلیک شدن یا انتخاب شدن این Action که در اینجا با شناسه actionExit در دسترس هستش وارد بشم و کدهای مورد نظر رو برای انجام کار مورد نظر بنویسیم به صورت زیر قسمت اکش ها و استلات ها مشخص هست :



    در ادامه خیلی راحت با وارد شدن به اسلات مورد نظر و ایجاد تابع رخداد triggered مراحل زیر رو ادامه میدیم...


    void MainWindow::on_actionExit_triggered()
    {


    }




    بین تابع شما میتونید هر کدی رو که لازمه بنویسید حالا در این مثال من کد ساده ای برای خروج از برنامه رو مینویسم و تمام ! به صورت زیر...


    QApplication::exit();


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

  3. #3

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و یکم : معرفی و کار با Progress و Slider ها

    در رابطه با کنترل های progress و Slider چون پراپرتی های تقریبا مشابهی دارند این دو رو باهم ادغام میکنیم به صورت زیر روی فرمم یک Progressbar و یک Slider ایجاد میکنم.


    خب قبل از هر چیزی توضیحی در رابطه با این بدم که آبجکت Progressbar همیشه بر اساس پراپرتی value مقداردهی میشه یعنی اگر ما برای این کنترل Maximum value رو برابر 100 قرار بدیم و پراپرتی value این برابر باشه با 24 اونوقت از 100 درصد 24 درصد مقدار این کنترل ارزش دهی میشود.

    به صورت زیر میتونید تنظیماتش رو اختصاص بدین ...

    حالا میاییم سراغ کد نویسی... قبل از هر چیز شناسه Progresbar من هستش MyprogressBar و شناسه Slider من هستش MyhorizontalSlider
    میخوام دقیقا وقتی مقدار Sliderbar تغییر میکنه مقدار Progressbar هم بر اساس اون تغییر کنه به چه روشی میشه این کار رو انجام داد ؟!

    در Qt ما بحث Signal و Slot هارو داریم که به طور خلاصه بخوام خیلی ساده توضیح بدم این خواهد بود : فرض کنید من یه یک شخصی ایمیل میزنم و در قبال اون ایمیل انتظار دریافت جوابش رو دارم حالا من اینجا به عنوان Signal و شخص دریافت کننده ایمیل من هستش Slot و ارتباط بین این دو مورد توسط چه چیزی انجام پذیره ؟ تابعی داریم به نام connect که وظیفه این تابع برقراری ارتباط باین Signal و Slot هستش به صورت زیر عمل خواهیم کرد :

    این کد من هست :


    connect(ui->MyhorizontalSlider, SIGNAL(valueChanged(int)), ui->MyprogressBar, SLOT(setValue(int)));


    در این کد من تابع connect رو فراخوانی کردم این تابع ابتدا Signal رو میگیره ور بعد Slot رو برای سیگنالی که ارسال کرده ستش میکنه خیلی راحت بخواه ساده تر بگم وظیفش همینیه که میبینید سیگنال رو ارسال میکنه و اسلات رو برای سیگنال ارسال شده دریافت میکنه حالا اینجا مقدار ارزشی که ما ارسال میکنیم و دریافت میکنیم از نوع int هستش که در هر دو شیئ ما مقدار value ارسال و دریافت میشه.

    حالا بعد از اجرا کردن برنامه هر بار من مقدار Slider رو تغییر بدم مقدار Progressbar هم تغییر خواهد یافت به صورت زیر :


    خب این یه خلاصه ای از مفهوم سیگنال و اسلات بین این دو کنترل یکم توضیح بدم در رابطه با ست کردن جداگانه مقدار در کنترل Progressbar
    برای این کار از پراپرتی setValue باید استفاده کنیم من برای مثال چهار مقدار متفاورت رو با استفاده از کنترل Button ایجاد و ارسال میکنم به صورت زیر :


    ui->MyprogressBar->setValue(75);


    این کد مقدار 75 رو از 100 درصد ظرفیت progressbar ارسال میکنه.


    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله کامبیز اسدزاده : چهارشنبه 24 اردیبهشت 1393 در 14:32 عصر

  4. #4

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و دوم : معرفی و کار با Statusbar ها

    یکی از امکانات دیگه در نرم افزار ها که در طراحی ازش میشه استفاده کرد ایجاد نوار وضعیت هستش که خود نوار وضعیت میتونه شامل هر نوع کنترلی باشه برای مثال به صورت زیر نرم افزار TeamViewer رو مثال میزنم زیرش در قسمت پایین که به رنگ قرمز مشخص کردم متن و وضعیت برنامه رو مشخص میکنه که اصولا در این موارد از StatusBar استفاده میکنند.


    خب حالا چطور این کار رو میشه انجام داد اینطور باید بگم که خیلی راحتر از کار در دات نت هست ! واقعا راحته اولا خود Qt چهارچوب استانداردی رو داره که اصولا همه Widget ها به صورت پیشفرض از این امکانات پشتیبانی میکنند حالا من میخوام یک نوع برچسب به عنوان خوش آمد گویی روی ویجتم درست کنم به صورت زیر ...

    ابتدا یک نوع label میسازم :


    QLabel *Mylbl = new QLabel();
    Mylbl->setText("Welcome to C++‎ Qt Designer tutorial");


    خب حالا برای اینکه این برچسب ایجاد شده رو روی Statusbar نمایش بدم باید به صورت زیر عمل کنم :


    ui->statusBar->addWidget(Mylbl);


    خیلی ساده و راحت با یه دستور addWidget از Statusbar آبجکت Label رو بهش اصافه میکنم و نتیجه میشه به صورت زیر :

    فایل های ضمیمه فایل های ضمیمه

  5. #5

    نقل قول: معرفی و آموزش C++‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و سوم: معرفی و کار با MessageBox

    خب یکی از مواردی که خیلی پر کاربرد هستش مخصوصا برای نمایش پیغام های خاص مثل (اخطار / اطلاعات / سوال و جواب و ...) استفاده از MessageBox هستش که در C++‎ در حالت های مختلفی میشه ازش استفاده کرد و من در این آموزش برای Qt این مثال رو تقریبا سعی میکنم کامل بزنم تا بهتر و مفیدتر باشه.

    برای اینکه در برنامتون از MessageBox استفاده کنید ابتدای فایلتون بایت این کلاس رو فراخوانی کنید : QMessageBox

    به صورت زیر :


    #include "QMessageBox"


    خب حالا من میتونم از این کلاس استفاده کنم ابتدا ازش یه شیئ جدید میسازم :


    QMessageBox MyMSG;
    MyMSG.setText("Welcome to C++‎ Tutorial :)");
    MyMSG.exec();



    در خط اول از کلاس QMessageBox یک نمونه ساختم و در خط دوم متنی رو درون این آبجکت وارد کردم و در خط بعدی از متد exec برای نمایش Dialog برای پیغام استفاده کردم که نتیجش باید باشه به صورت زیر :


    خب حالا من قصد دارم یکمی پیشرفته تر کار کنم با مواردی که میشه در این کلاس ازشون بهرهمند شد آشنا میشیم ... برای مثال من میخوام از این قابلیت برای پرسش سوال استفاده کنم و نتیجش رو با استفاده از Yes یا No مشخص کنم به صورت زیر کد رو مینویسم :


    QMessageBox msgBox;
    msgBox.setText("Welcome to C++‎ Tutorial");
    msgBox.setInformativeText("Do you want to save your changes?");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();


    خب خط اول و دوم که مشخصه و در خط سوم متنی رو برای نمایش به عنوان سوال پرسی توسط پراپرتی setInformativeText ارسال میکنم در خط بعدیش توسط پراپرتی setStandardButtons دکمه هایی رو که میخوام کاربر هنگام سوال پرسی ببینه رو مشخص میکنم که در اینجا سه گزینه Save / Cancel / Discard رو من انتخاب میکنم و در خط بعد مشخص کردم که دکمه Save به عنوان دکمه پیشفرض در حالت انتخاب شده قرار بگیره.
    و در نهایت پیغام رو نمایش میدم و مقدار بازگشتی حاصل از انتخاب کاربر رو به متغیر ret که از نوع int هستش ارسال میکنم.

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

    خب حالا سوالی این وسط هستش که اگه کاربر هر کلیدی که انتخاب کرد رو و مقدارش رو بازگشت داد بگیره و یه کاری انجام بده مثلا اگه Save رو زد یه کاری و اگه بقیه رو زد کارهای متفاوت دیگری رو انجام بده ... برای این کار به روش زیر عمل میکنم :


    switch (ret) {
    case QMessageBox::Save:
    // Save was clicked
    break;
    case QMessageBox::Discard:
    // Don't Save was clicked
    break;
    case QMessageBox::Cancel:
    // Cancel was clicked
    break;
    default:
    // should never be reached
    break;
    }


    دستور Switch یکی از دستورات معروفی هست که در مواقع پیچیده تر و چند گزینه ای تر بهتر جواب میده.
    طرز کارش چطوریه ؟ خب متغیر ret که داشتیم اون بالا هر دکمه ای رو که ما انتخاب کنیم توسط دستور switch ارزیابی میشه و نتیجه بر اساس سلیقه مشخص خواهد شد.

    مثلا من در مثالی که زدم به صورت زیر هر انتخابی پیغامش رو ارسال خواهد کرد به یک Label که روی فرمم هست.


    switch (ret) {
    case QMessageBox::Save:
    // Save was clicked
    ui->MyLabel->setText("Save");
    break;
    case QMessageBox::Discard:
    // Don't Save was clicked
    ui->MyLabel->setText("Discard");


    break;
    case QMessageBox::Cancel:
    // Cancel was clicked
    ui->MyLabel->setText("Cancel");


    break;
    default:
    // should never be reached
    break;
    }


    یه Property مهم دیگه ای هم داریم به عنوان ICON که برای این کار هم به صورت زیر عمل کنید :


    msgBox.setIcon(QMessageBox::Question);


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

  6. #6

    نقل قول: معرفی و آموزش C++‎‎‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و چهارم: معرفی و کار با Timer / QTimer

    در باره Timer هم همونطور که میدونید یکی از مواردی هستش که در ساده ترین حالت میشه ازش ساعت کنونی سیستم رو گرفت و تغییر ساعت / دقیقه / ثانیه رو به صورت Update نمایش داد. برای این کار ما میتونیم کلاس کامل و جامعی رو برای یک Timer اختصاصی در برنامه بنویسیم که بر اساس Signal و Slot های تعریف شده ازش استفاده کرد.

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

    ابتدا کلاس QTimer رو صدا میزنم :


    #include <QTimer>


    در فرم لود کد زیر رو مینویسم :


    //Start to get System time.


    QTimer *timer = new QTimer(this);
    timer->setInterval(1000);
    timer->start();
    connect(timer, SIGNAL(timeout()),
    SLOT(updateClock()));



    در این کد من ابتدا یک نوع کپی از تایمر یعنی QTimer ایجاد میکنم در خط بعدی مقدار 1000 میلی ثانیه یا همون 1 ثانیه رو بهش میدم در خط سوم استارت میزنم و در خط بعدی از تابع connect برای ارسال Signal و دریافت جواب از طرف Slot رو مینویسم که برای ایجاد اسلات نیاز دارم یه تابعی به نام updateClock که زمان سیستم رو برای من بگیره و برگشت بده.

    در فایل mainwindow.h اسلات (Slot) مربوط به این تابع رو معرفی میکنم به صورت زیر :


    //System Clock update
    private slots:
    void updateClock();


    نوع تابع رو از نوع تابع با دسترسی private به عنوان Slot در نظر میگیرم.

    حالا بر میگردم فایل mainwindow.cpp و تابع رو مینویسم به صورت زیر :


    void MainWindow::updateClock()
    {
    QString timeString = QTime::currentTime().toString("hh:mm:ss");
    ui->LCurrenTtime->setText(timeString);
    }


    خب اینجا من بدنه تابع رو تشکیل میدم و یک متغیری از نوع رشته QString ایجاد کرده و بعد توسط تابع موجود در کلاس QTime دقت کنید این QTime هستش با QTimer فرق میکنه به این r توجه کنید !!! وظیفه این کلاس برگشت دادن زمان جاری سیستم هست که توسط مقدار بازگشتی ثابت (Static) به صورت currentTime رو وارد متغیرم از نوع رشته میکنم البته قبلش تبدیل به رشته میشه و توسط الگوی : hh:mm:ss ساعت : دقیقه : ثانیه ارسال میشه به داخل متغیر.

    در خط بعدی هم که مشخصه مقدار متن label موجود روی فرمم رو که اسمش رو LCurrenTtime گذاشتم برابر میکنم با متغیری که زمان جاری سیستم در اون ذخیره میشه.
    فقط یه نکته که باید برای استفاده از QTime هم کلاسش رو وارد فایل مکنید به صورت زیر و نتیجه نهایی...


    #include "QTime"


    به همین راحتی و شیرینی...
    فایل های ضمیمه فایل های ضمیمه

  7. #7

    نقل قول: معرفی و آموزش C++‎‎‎‎/Qt به صورت گام به گام

    مرحله بیست و پنجم : معرفی و کار با Thread ها

    Thread چیست و چه کارهای انجام میده ؟ در کل به چه دردی میخوره و چرا باید ازش استفاده کنیم ؟
    توضیح رو خیلی مختصر و خیلی ساده به زبون خودمون میگم تا کسایی که تاحالا این موضوع رو درک نکردن شفافتر و روشنتر درکش کنند.

    به طور کلی در نظر بگیرید یک دستگاه های صوتی یا نوار های ویدئویی قدیمی رو که از فناوری Caset استفاده میکنند در این حالت شما وقتی موزیک یا فیلمی رو تماشا میکنید اگه بین فیلم کنونی نیاز داشته باشید تا چند ترک از اون رو به جلو بدین و چند فیلم دیگه رو ببینید مجبور هستید تا اون فیلم رو بیخیال بشید و حالت Seek رو انجام بدین یعنی بکشیدش جلو تا به فیلم مورد نظرتون برسید در این حالت عمل ترتیبی برای رسیدن به هدف صورت گرفته یجور جستجوی ترتیبی برای رسیدن به هدف و اجرای اون هستش حالا ما وقتی پشت کامپیوتر میشینیم و انتطار داریم وارد سیستم عامل که شدیم چندین کار رو هم زمان انجام بدیم برای مثال من مایلم یه طرف برنامه کامپایل کنم یه طرف موزیکمو گوش بدم یه طرفم برنامه های Messenger آنلاین کنم و ... دیگه اینجا هیچ کس حال و حوصله اینو نداره بیاد بشینه دونه دونه کار کنه مثلا اول پیغام بده منتظر بشه تموم شه و بعد بره برنامشو کامپایل کنه و بعد از اون هم تازه بیاد موزیک مورد علاقشو Play کنه و گوش بده ! این ک نشد زندگی عزیز من برای همینم ما بحث Thread رو میاریم وسط که تمام این وظایف رو توسط این مورد حلش میکنیم.

    حالا برای شروع کار من در مثالی که آموزش خواهم داد دقیقا توضیح میدم که چی به چیه ولی سرعت کامپیوتر ها انقدر زیاده که این پروسه ها در background صورت میگیرند و شما احساس نخواهید کرد که کدوم Thread کی و چه زمانی اجرا شد ! ولی نتیجه ای که خواهید دید اینه که مواردی که درخواست پردازش فرستادیم به CPU همشون در حال اجرا هستند چون در کل CPU بر اساس Thread ها برنامه هارو اولویت بندی میکنه برای مثال به پروسه های زیر دقت کنید :

    طبق تصویر اگه دقت کنید کلی برنامه در حال اجرا هستند که هر کدومشون کلی بندو بساط برای خودشون پهن کردن سر CPU که اگه چنین موارد رو توسط Thread ها مدیریت نکنیم CPU قادر به پردازش هریک از درخواست های متفاوت و مختص همه این برنامه های در حال اجرا به صورت هم زمان رو نخواهد داشت در حین اجرا پروسه شما برنامتون هنگ خواهد کرد‌ ! بنابراین استفاده از Thread ها در برنامه ها خیلی واجبه در کل یعنی برنامه ای که مینویسید اگه Thread توش بکار برده نشده باشه یک ریال هم ارزش نداره البته این نظر شخصی من هست !


    خب حالا یه بحث دیگه برای روشنتر کردن یکی دیگه از فواید Thread ها ... به طور کلی هرکدوم از برنامه های در حال اجرا بر اساس اولویت بندی Thread اون برنامه در اختیار CPU قرار میگیره یعنی اگر اولویت برنامه Visual Studio من بیشتر از برنامه مثلا Qt Creator من باشه و در این صورت اگر همزمان روی هر دوتای اینها برنامه ای رو کامپایل کنم اونی که اولویت پردازش روش بالاتر هست سریعتر و ابتدا در اختیار پردازش برای CPU ارسال میشود که اینم یکی دیگه از فواید Thread هستش پس ببینید خیلی مهمه در برنامه هایی که پر از شرایط تو در تو و توابع اجرایی دائما در حال اجرا هستن از Thread ها استفاده کنیم.

    به طور کلی هر زمانیکه بخواهیم در بیش از یک کار را به طور هم زمان پیش ببریم بهتر است استفاده از Thread ها رو فراموش نکنیم.

    ادامه در پست بعدی...
    آخرین ویرایش به وسیله کامبیز اسدزاده : پنج شنبه 25 اردیبهشت 1393 در 11:53 صبح

تاپیک های مشابه

  1. آموزش Crystal Report (به صورت حرفه ای کار کنید)
    نوشته شده توسط In_Chan_Nafar در بخش گزارش سازی با Crystal Report
    پاسخ: 27
    آخرین پست: جمعه 29 فروردین 1393, 10:54 صبح
  2. آموزش: آموزش برنامه نویسی به زبان اسمبلی به صورت گام به گام
    نوشته شده توسط JaVa در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 8
    آخرین پست: سه شنبه 08 بهمن 1392, 08:19 صبح
  3. سری آموزش ado.net به صورت فایل word
    نوشته شده توسط zarrin_306 در بخش VB.NET
    پاسخ: 7
    آخرین پست: چهارشنبه 06 آبان 1388, 16:35 عصر
  4. آموزش Intraweb به صورت گام به گام
    نوشته شده توسط حمیدرضاصادقیان در بخش توسعه نرم افزار تحت وب
    پاسخ: 3
    آخرین پست: دوشنبه 03 تیر 1387, 20:07 عصر
  5. آموزش گام به گام کار با پلت کامپوننتهای دلفی
    نوشته شده توسط nasr در بخش برنامه نویسی در Delphi
    پاسخ: 15
    آخرین پست: شنبه 30 خرداد 1383, 17:36 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •