PDA

View Full Version : سوال: رفع یک مشکل



Hasibsoft
دوشنبه 09 مرداد 1391, 11:59 صبح
فرض کنيد يک يوزر که شامل يک خاصيت به نام ConnectionString هست را ايجاد کرديم.خود يوزر کنترل از چند کلاس مختلف استفاد ه مي کند که از همين خاصيت ConnectionString بايد استفاده کند.من يک متغير عمومي در يک ماژول به نام m_ConnectionString ايجاد کردم که ساير کلاسها از اين متغير استفاده مي کنندووقتي که خاصيت ConnectionString تغيير ميکند در واقع اين متغير تغيير ميکند.ضمنا از اين يوزر کنترل ممکن است در زمان اجرا چندتا ساخته شودو يا ازبين برود.حال مشکلي که من دارم اينه که وقتي خاصيت ConnectionString يکي از يوزر کنترلها را مقداري به آن ميدهيم در ساير يوزر کنترلها هم همان مقدار داده ميشود درصورتي که بايد هر يوزر کنترل بايد مقدار ConnectionString مربوط به خودرا داشته باشد.طبق بررسي هايي که من انجام دادم چون متغير m_ConnectionString در ماژول تعريف شده، اين متغير فقط يکبار ايجاد ميشه و هر تغييري روي آن براي کل يوزرکنترلها تاثير مي گذاره يعني مثل اينه که اين متغير براي همه يوزرکنترلها به اشتراک گذاشته شده.
حال من اين متغير را کجا تعريف کنم که اين مشکل برايم پيش نياد؟

مهرداد صفا
دوشنبه 09 مرداد 1391, 12:41 عصر
فکر میکنم اگر M_ConnectionString را به صورت یک خصوصیت در کلاس مورد نظر تعریف کنید و در بازنویسی متود New مقدار مورد نظرتون را بدهید این مشکل حل شود.

Hasibsoft
دوشنبه 09 مرداد 1391, 12:59 عصر
فکر میکنم اگر M_ConnectionString را به صورت یک خصوصیت در کلاس مورد نظر تعریف کنید و در بازنویسی متود New مقدار مورد نظرتون را بدهید این مشکل حل شود.

من می خواهم یکبار یک متغیر را تعریف کنم واز آن در همه کلاسهای مورد نظر استفاده کنم.با این وضعیت هر کلاس باید یک خاصیت ConnectionString مربوط به خود را داشته باشد.در واقع یک متغیر عمومی در یوزر کنترل را لازم دارم که همه کلاسهایی که در این یوزر کنترل تعریف می شوند از این متغیر استفاده کنند

pooya1072
دوشنبه 09 مرداد 1391, 14:13 عصر
سلام دوست عزیز
از سوالتون مشخص نیست که آیا منظور شما از ConnectionString همون رشته ارتباطی با بانک اطلاعاتیه یا اینکه یک متغیر دلخواه به این نام در برنامتون ایجاد کردید.اگه ممکنه این رو مشخص کنید.
من حالت دوم رو در نظر میگیرم.اگر شما یک متغیر توی یک ماجول تعریف کنید (به صورت عمومیpublic ) خوب مشخصه که در هر قسمت از برنامتون که اون رو تغییر بدید در تمامیه قسمتهای برنامه تغییر می کنه.پس اگه می خواید که هر قسمت برنامه به صورت مجزا از متغیری به این نام استفاده کنه 2 راه دارید: 1- اینکه توی هر کلاس به صورت جداگانه متغیری به این نام تعریف کنید که احتمالا مورد نظر شما نیست و کلا خوانایه برنامه رو کم می کنه . 2- این متغیر رو به صورت ارایه تعریف کنید و هر خونه اون رو توی یک قسمت استفاده کنید.
شما می خواهید که توی یک لیوان به طور همزمان هم اب بریزی هم شربت و انتظار داری که با هم مخلوط نشن و این کار اصولا شدنی نیست.
اگر برداشت من از سوال شما اشتباهه عذر خواهی می کنم.

Hasibsoft
دوشنبه 09 مرداد 1391, 14:47 عصر
منظورمن اینه که اگر در یک یوزر کنترل یک متغیر عمومی تعریف کنی و از اون یوزر کنترل چند تا بسازی با تغییر متغیر عمومی یکی از یوزر کنترل ها، روی متغیر عمومی سایر یوزر کنترل ها تاثیر می گذاره و من اینرا نمی خواهم. مثال میزنم
dim uc1,uc2 as new mycontrol
uc1.ConnectionString = "test1"

حالا اگر uc2.ConnectionString را بررسی کنیم همان مقدار uc1.ConnectionString را داره.علت اون هم اینه که من در یوزر کنترلم یک ماژول به صورت زیر درست کردم

Module Module1
Friend m_ConnectionString As String
End Module

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

Public Property ConnectionString() As String
Get
Return m_ConnectionString
End Get
Set(ByVal value As String)
m_ConnectionString = value
End Set
End Property


حالا من از m_ConnectionString در کل کلاسهای یوزر کنترلم استفاده می کنم.با این کار این مشکلی که دارم پیش میاد.حالا من متغیر m_ConnectionString را چه جوری تعریف کنم تا این مشکل ایجاد نشه؟

Hasibsoft
دوشنبه 09 مرداد 1391, 17:38 عصر
کسی نمی تونه مشکل من را حل کنه؟

مهرداد صفا
دوشنبه 09 مرداد 1391, 22:06 عصر
کسی نمی تونه مشکل من را حل کنه؟

سلام دوست عزیز.
توجه داشته باشید که متغیری که در ماجول تعریف میشود به صورت ایستا تعریف شده و در طول اجرای پروژه مقدار خود را حفظ میکند. شما در واقع با ساخت کنترل جدید در زمان اجرا یک شی جدید از کلاس مورد نظر خودتان میسازید و پروژه را ریست نمیکنید که مقدار متغیرهای موجود در ماجول به مقدار اولیه باز گردد. به زبان دیگر تمام متغیرها به مقدار پیشفرض خود باز میگردند اما مقدار موجود در ماجول آخرین وضعیت خود که احتمالا در Property set مربوط به ConnectionString تغییر کرده را حفظ میکند. شما در Property get M_connectionString را به عنوان مقدار خصوصیت بر میگردانید و در Property Set یک شی دیگر از همان کلاس مقدار M_ConnectionString را باز نویسی و مقدار آن را تغییر میدهید. پس این مقدار بین تمام کنترلها عمومی است و تغییر کرده. با بازخواهی مجدد خصوصیت مقدار جدید را بر میگردانید. شما میتوانید با چک کردن این مقدارها در زمان اجرا با debug کردن به صحت این موضوع پی ببرید.
این موضوع ناگزیر است شما باید برای هر کلاس یک M_connectionString داشته باشید که اگر فکر کنید بهترین راه قرار دادن این مقدار در خود کلاس است.
موفق باشید.