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

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




صفحه 1 از 5 12345 آخرآخر
نمايش نتايج 1 به 10 از 48

نام تاپيک: نمايش فرم در dll

  1. #1
    اگه نباشه جاش خالی می مونه sara_she's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    اهواز
    پست ها
    214

    14 نمايش فرم در dll

    با سلام
    من تو visual c++.net يه dll دارم و با add existing item چند تا (win form(.net به اون اضافه كردم . مي خوام بدونم چطور مي شه مشخص كرد كه با اجراي هر فرماني مثل كليك روي دكمه اي خاص كدوم فرم باز بشه . دستور نمايش فرم چيه؟

  2. #2
    آخر فروم باز hamidreza_buddy's Avatar
    تاريخ عضويت
    Sep 2004
    محل سكونت
    شریف
    پست ها
    1,167

    پيش فرض

    باید یه شئ از اون فرم new کنی و اونرو Show و یا ShowDialog کنی:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    البته به c# نوشتم. ولی امیدوارم متوجه شده باشی.

  3. #3
    اگه نباشه جاش خالی می مونه sara_she's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    اهواز
    پست ها
    214

    14

    ممنون از راهنماييتون
    مشكله من اينه كه مي خوام تو dll از فرم هام استفاده كنم و او نها رو show‌يا hide كنم
    وقتي با add existing item به dll فرم اضافه مي كنم كلاسي به صورت
    public __gc class winform : public System::Windows::Forms::Form

    ساخته مي شه ولي با اينكه هدر اين كلاس رو به dll اضافه مي كنم وقتي myform winform ‌يا myform.show رو تايپ مي كنم نه winform رو مي شناسه و نه my form‌ رو .در واقع من نحوه برقراري ارتباط بين فايل هاي مربوط به فرم (هدر و cpp و كلا سه اي آنها) رو با Dll نمي دونم

  4. #4
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

    سلام.
    واقعا متاسفم از اینکه اینقدر جواب دادنم طول کشیده.
    خب...
    برای ایجاد یه Dll در Net. و استفاده از اون مرحله به مرحله پیش میریم :
    نوع پروژه رو CLR و از Template گزینه ClassLibrary رو انتخاب میکنیم. تا اینجا که فکر نمیکنم
    مشکلی وجود داشته باشه. در حال حاضر یه کلاس به پروژه اضافه شده.
    میخوایم به این Dll یک Form اضافه کنیم که مثلا یه Button داشته باشه. به منوی project میریم و
    Add Class رو انتخاب و از Template گزینه WinForm رو در نظر میگیرم. اسمی براش میذاریم و اون رو به
    Dll اضافه می کنیم.
    formی به Dll اضافه میشه و برای اینکه form مون خالی نباشه یه Button به اون اضافه میکنیم که
    مثلا پیغامی رو نمایش بده. مثل همیشه عمل میکنیم. بعد از اضافه کردن کلید به form روی اون 2 بار
    کلیک میکنیم و در متود ایجاد شده کد زیر رو اضافه میکنیم :

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    کارمون با Dll تموم شده . برنامه رو Compile میکنیم و میریم به سراغ پروژه ی بعدی که یه Windows Form
    هست. دوباره مرحله اول رو تکرار میکنیم و به جای Class Library گزینه ی Windows Forms App رو انتخاب
    میکنیم. برای اینکه از Dll استفاده کنیم کافیه با استفاده از ماکروی using# اون رو به برنامه اضافه کنیم.
    همچنین باید namespace استفاده شده رو به برنامه اضافه کرد:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    به form این برنامه هم مثلا یه Button اضافه میکنیم که با کلیک کردن روی اون بشه Form ی که در Dll قرار
    داره رو اجرا کرد :

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    کافیه برنامه رو اجرا کنیم.
    فقط در اینجا نکته ای وجود داره که نمونه ای براتون گذاشتم در VC2005 نوشته شده و اگه از VC2003 استفاده
    میکنین چند تغییر کوچیک در اون باید ایجاد کنین.

    برای استفاده از Form ها در خود Dll هم کافیه از اسم Class فورمتون استفاده کنین. البته با استفاده از gcnew.
    مثل همین نمونه.
    اما در مورد استفاده از Form های MFC قضیه کمی فرق میکنه. چون شما در ManagedCode دارین از کلاس
    هایی که مدیریت شده نیستن استفاده میکنین که اگه بخواین در موردشون صحبت کنیم.

    امیدوارم مشکل حل شده باشه.
    اگه مشکلی پیش اومد اطلاع بدین.
    ممنون.

  5. #5
    اگه نباشه جاش خالی می مونه sara_she's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    اهواز
    پست ها
    214

    5

    سلام
    ممنون كه بلاخره جواب دادين ولي مشكل من حل نشد . مشكل اينه كه من وقتي شبيه كاري كه شما گفتيد با classlib يك dll‌مي سازم با masseagebox مشكلي نداره ولي من يك dll نوشته شده با vs.net دارم كه به صورت آماده است و بايد يه سري كار روش انجام بدم نمي دنم از چه نوعيه كه با massagebox خطاهاي زير رو مي د ه:

    error C2660: 'System::Windows::Forms::Control::Show' : function does not take 1 arguments

    error C2653: 'MessageBoxA' : is not a class or namespace name

    شايد به هدر خاصي احتياج داره اگه مي دونيد از كدوم هدر براي تعريف massagebox استفاده مي شه منو راهنمايي كنيد.
    دوم اينكه من به اين dll‌آماده همون طور كه گفتيد با addclass‌ چندفرم .net اضافه كردم ولي نمي تونم ازشون تو فايل cpp تعريف شده براي dll‌ ام استفاده كنم چون وقتي مي نويسم(تو cpp نه هدر كلاس)
    winform *form1 = new winform();

    form1->Show();

    در زمان build نه كلاس winform‌رو مي شناسه نه متد show رو .هرچند من هدر كلاس رو بهش اضافه كردم . اصلا نمي دونم چه طور مي شه از كلاس ها و فرم هاي تعريف شده و اضافه شده به dll در اون استفاده كرد . در ضمن من نمي خوام از اين dll تو همين محيط استفاده كنم استفاده من از اين dll‌در اتوكد است كه اونجت چند فرم دارم و مي خوام با صدور هر فرمان يا كليك دكمه اي در فرم اتوكد يكي از فرم هاي تعريف شده در dll‌فعال بشه . لطفا با توجه به سوال و روشي كه كار كردم پاسخ بدين

    كد فايل cpp براي dll:
    #include "stdafx.h"
    #include "winform.h"


    void showform()
    }
    ? winform *form1 =new winform;
    ? forml->Show();

    {

    و هدر كلاس winform اضافه شده به dll :

    public __gc class winform : public System::Windows::Forms::Form
    {
    public:
    winform(void)
    {
    InitializeComponent();
    }
    .
    .
    .
    private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
    {
    label1->Text="شما روي دكمه اي كليك كرديد";

    }

    public:

    void examfunc(void)
    }

    ? MessageBox ::Show("test!");


    ; {
    اونجاهايي كه ? گذاشتم خطا داره

  6. #6
    اگه نباشه جاش خالی می مونه sara_she's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    اهواز
    پست ها
    214

    پيش فرض

    مثال كه شما زديد استفاده از فرم در خود فايل cpp يك dll‌رو در بر نداشت .بلكه تو هدر كلاس روال كليك رو گذاشتين

    private: System::Void ShowHello_Click(System::Object^ sender, System::EventArgs^ e)
    {
    MessageBox::Show("Hello!!!!");
    }

    در ضمن نحوه كار با استفاده كننده dll و چگونگي استفاده از dll در آن برام فعلأ مهم نيست استفاده كننده اتوكد است كه بحثشو اينجا مطرح نمي كنم
    من مي خوام كه تو Dll خودم بتونم با استفاده از پارامترهاي ارسالي از استفاده كننده dll ، فرم هاي خاصي رو نمايش بدم(show) يعني مثلأ اگه 1 از فرستنده ارسال شده فرم اول dll و اگه 2 ارسال شد فرم دوم dll‌ نمايان بشه و اين تعريف نمايش كدام فرم بايد در dll نوشته بشه. اميدوارم با سوال هاي مكرر من و توضيحات نه چندان كامل متوجه منظورم شده با شيد.نتيجه گيري و پاسخ تون رو بر اساس اين دو پست انتهايي من قرار بدين لطفأ
    Last edited by sara_she; 09-05-2007 at 11:36.

  7. #7
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

    دوباره سلام.
    من مي خوام كه تو Dll خودم بتونم با استفاده از پارامترهاي ارسالي از استفاده كننده dll ، فرم هاي خاصي رو نمايش بدم(show) يعني مثلأ اگه 1 از فرستنده ارسال شده فرم اول dll و اگه 2 ارسال شد فرم دوم dll‌ نمايان بشه و اين تعريف نمايش كدام فرم بايد در dll نوشته بشه.

    ببینید شما میتونین یه متود public برای کلاس اصلی Dll تون بنویسین.
    فرض کنین که دو فرم به Dll اضافه کردیم. با نامهای WinForm1 و WinForm2 .
    میتونیم به این شکل عمل کنیم :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    این متود به راحتی در خارج از Dll دردسترس هست. کافیه به آرگومان اون 1 یا 2 بدین تا فرمتون رو ببینین.

    در مورد MessageBox هم شما باید از namespace مناسب استفاده کنین :

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

  8. #8
    اگه نباشه جاش خالی می مونه sara_she's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    اهواز
    پست ها
    214

    6

    سلام . خسته نباشيد از راهنماييتون ممنونم

    مشكلم با نمايش فرم حل شد تنها اشكالي كه باعث مي شد كلاس ساخته شده براي فرمم تو Dll تعريف نشده باشه اين بود كه قبل از نوشتن نام كلاس بايد اسم namespace ي كه كلاس در اون قرار داشت رو بيارم

    مثلا اگه در هدر كلاس winform.h داشته باشيم:




    #using<System.Windows.Forms.dll>



    namespace Step01

    {



    public __gc class winform : public System::Windows::Forms::Form

    {

    public:

    winform(void)

    {

    InitializeComponent();

    }

    .

    .

    .





    public:

    void examfunc(void)

    {

    winform *form1 = new winform();

    form1->Show();

    // MessageBox ::Show("test!");



    };


    كه massagebox ‌رو نمي شناسه عليرغم وجود using

    فايل dll برنامه:


    #include "stdafx.h"

    #include "winform.h"

    .

    .

    .

    void helloWorld()

    {

    acutPrintf("\nHello World!");

    Step01::winform *myclass=new Step01::winform *****

    myclass->label1->Text="sssss";

    myclass->examfunc() ;


    }


    حالا مشكلي كه برام ايجاد شده اينه كه با اين كد هربار كه متد examfunc در dll‌فراخواني مي شه يه فرم جديد از نوع كلاس winform ساخته ميشه (تعريف examfunc در winform.h) در صورتي كه من مي خوام همون كلاسي كه تغييرات خودمو روش دادم show‌بشه (myclass در dll) و متد show هم حتما بايد در يك روال فرعي خارج از dll باشه يعني همين طوري كه در كد نوشتم . الان با اينكه من text مربوط به label1 رو در dll تغيير دادم چون با فراخواني examfunc اين تابع در هدر فعال مي شه چيزي كه show‌مي شه form1 است نه myclass‌ اميدوارم منظورمو متوجه شده باشيد و مثل هميشه راهنامييم كنيد

  9. #9
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

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

    ببینین اول نکته ای که وجود داره اینه :
    شما در Dll تون (بهتره گفته شه ClassLibrary ) یه Form دارین که در نتیجه اش یه کلاس از این Form.
    وقتی شما به کلاس ّForm تون یه Control اضافه میکنین به صورت Private به کلاس اضافه میشه.
    و اینکه در خارج از این کلاس و در کلاس دیگه ای (مثلا کلاس اصلی Dll ) بتونین از اون استفاده کنین
    باید توسط یه متود یا property دسترسی به اون رو public کنین. اگه نظر من رو بخواین استفاده از
    propery بهتر از یه متود public هست. گرچه در ظاهر فرقی با یه متود نداره.
    برای استفاده از این keyword در 2003 از property__ استفاده کنین.
    میتونین به این شکل عمل کنین :
    (این property رو باید در کلاس Form بنویسین)

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    الان به راحتی میتونین از این property در کلاس مورد نظرتون استفاده کنین :
    (باز مثلا در کلاس اصلی Dll)

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    در کد بالا یه روش از فراخوانی MessageBox وجود داره.
    برای استفاده از یه namespace به این شکل عمل کنین :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    از این کد به جای ماکروی using# استفاده کنین. using و using# با هم تفاوت دارن.
    (به جای خط اول کدتون)

    در مورد سوال دومتون شما باید از کلاس مورد نظرتون نمونه (reference ) بسازین.
    اگه شما از کلاس Form چند نمونه ایجاد کنین طبیعی هست که از این From چند نمونه ایجاد بشه.

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

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    مشخه که از کلاس winform یه نمونه ساختین. ( myclass )
    اما مشکلی که براتون پیش اومد به این دلیل هست :
    متود examfunc یه نمونه ی دیگه از کلاس ایجاد میکنه. (form1 ) بنابراین منطقا شما نباید تغییری در form تون ببینین.
    (بنابراین بعد از اجرای کد پایین شما دونمونه از کلاس Form دارین نه یکی )
    شما متود examfunc رو در کلاس Form ساختین. در صورتی که میتونین به راحتی از کلاس Form تو کلاس اصلی Dll
    استفاده کنین. همین کاری که من انجام دادم. هم در کدهای بالا و هم نمونه ی ساده ای از اون در پایین.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    البته در کد بالا خط زیر جا مونده :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    سعی کنین از property استفاده کنین و نمونه کدها رو به دقت بررسی کنین.
    اگه کدها ابهامی داشت یا نیاز به توضیح بیشتر بود و یا مشکلتون حل نشد اطلاع بدین.

  10. #10
    اگه نباشه جاش خالی می مونه sara_she's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    اهواز
    پست ها
    214

    14

    ممنون از راهنمايي هاي كامل تون . حتمأ توصيه هاي شما رو در روند كارم اجرا مي كنم
    براي نمايش فرم هم تا حدودي مشكلم حل شده . همون طور كه گفتم حتما با يد تابع نمايش فرم هم خارج از dll‌ باشه
    به همين دليل براي هر كلاس فرمي كه مي سازم يك تابع showform هم بهش اضافه مي كنم كه اين تابع هدر هر كلاسي فقط شامل كد form1->show ودر dll هرجا لازم بود فرم خاصي رو نمايش بدم يك متغير از جنس كلاس مربوطه مي سازم و تغييرات مورد نظرمو روش اعمل مي كنم سپس اين متغير رو به صورت پارامتري از جنس اون كلاس به تابع showform‌مي فرستم.

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    و در dll هم فراخواني به صورت زير را دارم :

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    براي هر class كه مي سازم هم شامل فرم است و هم تابع showform و در dll تنها فرقي كه در هر فراخواني اين تابع داريم تغيير نام كلاس (در كد بالا winform) چون نام namespace‌در تمام كلاس هاي اضافه شده به پروژه يكسان است.

    به نظر شما من روش درستي رو به كار مي برم ؟

Thread Information

Users Browsing this Thread

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

User Tag List

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

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