PDA

View Full Version : جابه جا کردن دینامیک کنترل ها روی فرم



احمد سامعی
سه شنبه 17 بهمن 1385, 16:49 عصر
درود و صد بدرود بر مردمان ایران زمین

چطور می تونم به صورت دینامیک کنترل های مختلف رو از داخل برنامه رو فرم جابه جا کنم مثلا یک تکس باکس رو تو فرم بالا پایین چپ و راست کنم ؟
تو Vb ظاهرا با تابع می شه اگر کد خواصی داره بزارین منون می شم ؟

پایدار باشید.

iman_s52
سه شنبه 17 بهمن 1385, 17:35 عصر
با خواص Drag & Dropo کنترل

PC2st
سه شنبه 17 بهمن 1385, 18:02 عصر
میتونی یک متغیر از نوع Boolean تعریف کنی و البته یکی هم از نوع Point یعنی:

private Point _Last;
bool Selected = false;

برای متغیر Selected در صورتی که کاربر کلیک مووس رو روی کنترل نگه داشته بود، مقدارش درست و در صورتی که کاربر کلیک مووس رو رها کرد، مقدارش غلط میشه. و متغیر _Last هم مکان مووس را در خود ذخیره میکند برای لحظه ای که کلیک مووس روی کنترل پائین می رود.
برای این منظور، باید توی رویداد MouseDown مربوط به کنترل کد زیر رو قرار بدی:

_Last = new Point(e.X, e.Y);
Selected = true;

توسط کد فوق، متغیر ما (که اینجا اسمش Selected هست) مقدارش True شده، پس یعنی روی کنترل کلیک پائین نگه داشته شده و آماده تغییر مکان هست. در ضمن، مقدار فعلی مکان مووس در _Last ذخیره خواهد شد. (این مکان فعلی مووس به نسبت خود کنترل است نه فرم اصلی برنامه!)

سپس توی رویداد MouseMove هم کد زیر رو میگذاری:

if(Selected)
{
textBox1.Top += e.Y - _Last.Y;
textBox1.Left += e.X - _Last.X;
}

که کد فوق به این معنی هست که در صورتی که کلیک مووس پائین نگه داشته شده باشد (یعنی مقدار Selected برابر True باشد) مکان کنترل با توجه به تغییر مکان مووس، جابجا خواهد شد.

سپس توی رویداد MouseUp هم کد زیر رو قرار میدی:

Selected = false;

که باعث میشه مقدار متغیر ما (Selected) مقدارش غلط بشه و به این معنی هست که دیگه کلیک مووس رها شده و کاربر نمیخواد کنترل رو تکان بدهد.

در کل، کد شما باید چیزی شبیه به زیر باشد، (گنترل مورد نظر TextBox است):



publicpartialclassForm1 : Form
{
private Point _Last;
bool Selected = false;

public Form1()
{
InitializeComponent();
}

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
_Last = new Point(e.X, e.Y);
Selected = true;
}

private void textBox1_MouseUp(object sender, MouseEventArgs e)
{
Selected = false;
}

private void textBox1_MouseMove(object sender, MouseEventArgs e)
{
if(Selected)
{
textBox1.Top += e.Y - _Last.Y;
textBox1.Left += e.X - _Last.X;
}
}
}

احمد سامعی
چهارشنبه 18 بهمن 1385, 13:59 عصر
میتونی یک متغیر از نوع Boolean تعریف کنی و البته یکی هم از نوع Point یعنی:}
[/code]

آقا یک دنیا منون کد شما کاملا درست بود و مشکلم حل شد.:قلب: :قلب: :قلب:

احمد سامعی
یک شنبه 22 بهمن 1385, 23:50 عصر
میتونی یک متغیر از نوع Boolean تعریف کنی و البته یکی هم از نوع Point یعنی:



منون استاد این کد کار می کنه خیلی خوب اما یک مشکلی هست !
وقتی فرم رو راست به چپ می کنم کنترلی که این کد رو براش تعریف کردم تا می خوای جایه جاش کنی غیب می شه !!؟

چه کار باید کرد ؟؟؟

PC2st
دوشنبه 23 بهمن 1385, 18:22 عصر
راستی کد قبل رو میشه به شکل زیر بهینه تر کرد:


public partial class Form1 : Form
{
private Point _Last;

public Form1()
{
InitializeComponent();
}

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
_Last = new Point(e.X, e.Y);
}

private void textBox1_MouseMove(object sender, MouseEventArgs e)
{
if(e.Button==MouseButtons.Left)
{
textBox1.Top += e.Y - _Last.Y;
textBox1.Left += e.X - _Last.X;
}
}
}

راستش همین کد رو برای فرمی از راست به چپ (RightToLeft = Yes) امتحان کردم و مشکلی نداشت... اما برای فرمی که Layout آن راست به چپ بود (RightToLeftLayout = True)، با مشکل مواجه شد!
پیشنهاد میکنم که اگر خواستید نوشته های فرم از راست به چپ نمایش داده شوند، فقط خاصیت RightToLeft را تنظیم کنید و RightToLeftLayout همچنان Flase باقی بماند.
زیرا در اینحالت مکان مووس از راست و بالای فرم سنجید میشود (نه از چپ و بالا!) در حالی که همچنان کنترلهای قرار گرفته روی فرم، مکان مووس قرار گرفته روی کنترل را از چپ و بالای کنترل می سنجند (برای اینحالت خودمان باید مکان مووس نسبت به راست کنترل را بدست آوریم)! در ادامه، کدی که برای اینجور فرمها میتوان نوشت، نوشته شده است...

برای اینکه کنترلی رو برای فرمهائی که Layout آنها راست به چپ است، میتوان کد زیر را استفاده کرد:


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void textBox1_MouseMove(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
textBox1.Top += e.Y;
textBox1.Left += textBox1.Width - e.X;
}
}
}

linux
دوشنبه 23 بهمن 1385, 19:18 عصر
http://msdn.microsoft.com/msdnmag/issues/04/12/CustomFormsDesigner/default.aspx

یاسر مددیان
سه شنبه 24 بهمن 1385, 18:38 عصر
عالی بود استاد .


ممنون

Alireza_Salehi
سه شنبه 24 بهمن 1385, 19:50 عصر
با اجازه
این مثال رو هم ببینید:

فقط کافیه کنترل را روی فرم قرار دهید!
با قابلیت ذخیره سازی تغییرات!

linux
سه شنبه 24 بهمن 1385, 19:50 عصر
http://download.microsoft.com/download/d/3/1/d31fff33-fd97-488f-9bbd-4b7402905716/CustomFormsDesigner.exe
برای .نت 1.1
و این یکی برای .نت 2
http://www.divil.co.uk/net/articles/designers/hosting.zip
این برنامه ها را ببنید.

با این کار تقریبا یک چیزی شبیه خود ویژوال استدیو می تونید بسازید

ali_kolahdoozan
سه شنبه 24 بهمن 1385, 20:10 عصر
این جالبترین سورسی بود که تا حالا دیدم . حتی righttoleft و... رو هم داره