با سلام
من تو visual c++.net يه dll دارم و با add existing item چند تا (win form(.net به اون اضافه كردم . مي خوام بدونم چطور مي شه مشخص كرد كه با اجراي هر فرماني مثل كليك روي دكمه اي خاص كدوم فرم باز بشه . دستور نمايش فرم چيه؟
با سلام
من تو visual c++.net يه dll دارم و با add existing item چند تا (win form(.net به اون اضافه كردم . مي خوام بدونم چطور مي شه مشخص كرد كه با اجراي هر فرماني مثل كليك روي دكمه اي خاص كدوم فرم باز بشه . دستور نمايش فرم چيه؟
باید یه شئ از اون فرم new کنی و اونرو Show و یا ShowDialog کنی:
البته به c# نوشتم. ولی امیدوارم متوجه شده باشی.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ممنون از راهنماييتون
مشكله من اينه كه مي خوام تو 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 نمي دونم
سلام.
واقعا متاسفم از اینکه اینقدر جواب دادنم طول کشیده.
خب...
برای ایجاد یه 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 دارین از کلاس
هایی که مدیریت شده نیستن استفاده میکنین که اگه بخواین در موردشون صحبت کنیم.
امیدوارم مشکل حل شده باشه.
اگه مشکلی پیش اومد اطلاع بدین.
ممنون.
سلام
ممنون كه بلاخره جواب دادين ولي مشكل من حل نشد . مشكل اينه كه من وقتي شبيه كاري كه شما گفتيد با 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!");
; {
اونجاهايي كه ? گذاشتم خطا داره
مثال كه شما زديد استفاده از فرم در خود فايل 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.
دوباره سلام.
من مي خوام كه تو Dll خودم بتونم با استفاده از پارامترهاي ارسالي از استفاده كننده dll ، فرم هاي خاصي رو نمايش بدم(show) يعني مثلأ اگه 1 از فرستنده ارسال شده فرم اول dll و اگه 2 ارسال شد فرم دوم dll نمايان بشه و اين تعريف نمايش كدام فرم بايد در dll نوشته بشه.
ببینید شما میتونین یه متود public برای کلاس اصلی Dll تون بنویسین.
فرض کنین که دو فرم به Dll اضافه کردیم. با نامهای WinForm1 و WinForm2 .
میتونیم به این شکل عمل کنیم :
این متود به راحتی در خارج از Dll دردسترس هست. کافیه به آرگومان اون 1 یا 2 بدین تا فرمتون رو ببینین.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مورد MessageBox هم شما باید از namespace مناسب استفاده کنین :
با توجه به سوالتون فکر کنم جوابم مناسب باشه.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگه باز مشکل حل نشد اطلاع بدین.
سلام . خسته نباشيد از راهنماييتون ممنونم
مشكلم با نمايش فرم حل شد تنها اشكالي كه باعث مي شد كلاس ساخته شده براي فرمم تو 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 اميدوارم منظورمو متوجه شده باشيد و مثل هميشه راهنامييم كنيد
ممنون.
اول یه خواهش داشتم. برای نمایش کدهاتون از تگ کد استفاده کنین. (علامت # )
ممنون از توجهتون.
ببینین اول نکته ای که وجود داره اینه :
شما در 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 استفاده کنین و نمونه کدها رو به دقت بررسی کنین.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگه کدها ابهامی داشت یا نیاز به توضیح بیشتر بود و یا مشکلتون حل نشد اطلاع بدین.
ممنون از راهنمايي هاي كامل تون . حتمأ توصيه هاي شما رو در روند كارم اجرا مي كنم
براي نمايش فرم هم تا حدودي مشكلم حل شده . همون طور كه گفتم حتما با يد تابع نمايش فرم هم خارج از dll باشه
به همين دليل براي هر كلاس فرمي كه مي سازم يك تابع showform هم بهش اضافه مي كنم كه اين تابع هدر هر كلاسي فقط شامل كد form1->show ودر dll هرجا لازم بود فرم خاصي رو نمايش بدم يك متغير از جنس كلاس مربوطه مي سازم و تغييرات مورد نظرمو روش اعمل مي كنم سپس اين متغير رو به صورت پارامتري از جنس اون كلاس به تابع showformمي فرستم.
و در dll هم فراخواني به صورت زير را دارم :کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
براي هر class كه مي سازم هم شامل فرم است و هم تابع showform و در dll تنها فرقي كه در هر فراخواني اين تابع داريم تغيير نام كلاس (در كد بالا winform) چون نام namespaceدر تمام كلاس هاي اضافه شده به پروژه يكسان است.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
به نظر شما من روش درستي رو به كار مي برم ؟
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)