PDA

View Full Version : راهنمایی: نشناختن Richtext در یک تابع از نوع static



mohammad1415
دوشنبه 02 دی 1392, 19:47 عصر
سلام میخواستم راهنمایی کنید . من یک کد نوشتم در یک تابع از نوع استاتیک توی دستورات تابع Richtext تعریف نمی شود (شناسایی نیست)
موقعی که تابع public void میکنم جواب می دهد (میشناسد Richtext)
ولی حتماتابع باید از نوع استاتیک باشد . خواهشا کمک کنید

static void ReadComplete(IAsyncResult ar)
{
int count = nt.EndRead(ar);
if (count > 0)
{
string str = System.Text.Encoding.ASCII.GetString(buffer, 0, count);
// می خوام مقدار str در richtext ریخته شود و مشاهده گردد
//اینجا rich نمیشناسه

}
AsyncCallback rc = new AsyncCallback(ReadComplete);
nt.BeginRead(buffer, 0, buffer.Length, rc, null);
}

fmehrvarzi
دوشنبه 02 دی 1392, 20:43 عصر
اولاً نگفتید تابعتون توی یک کلاس تعریف شده یا نه
اگر تابعتون از نوع استاتیک نباشه وی توی یک کلاس تعریف شده برا استفاده از آن باید یک شی از کلاس بسازید بعدش فراخوانی کنید
اگر استاتیک باشه باید با فراخوانی نام کلاس ، از آن استفاده کنید

به نظرم باید بری مفاهیم استاتیک و کلاس را یه نگاه بندازی
msdn.microsoft.com/en-us/library/98f28cdx.aspx
سوال دیگه ای ؟

mohammad1415
سه شنبه 03 دی 1392, 05:45 صبح
اولاً نگفتید تابعتون توی یک کلاس تعریف شده یا نه
اگر تابعتون از نوع استاتیک نباشه وی توی یک کلاس تعریف شده برا استفاده از آن باید یک شی از کلاس بسازید بعدش فراخوانی کنید
اگر استاتیک باشه باید با فراخوانی نام کلاس ، از آن استفاده کنید

به نظرم باید بری مفاهیم استاتیک و کلاس را یه نگاه بندازی
msdn.microsoft.com/en-us/library/98f28cdx.aspx
سوال دیگه ای ؟

تابع توی کلاس تعریف نشده و احتیاجی به کلاس هم نیست ...
اصلا بحث کلاس و تعریف شی از کلاس نیست دوست عزیز .
مطلب اینه چرا ووقتی یک تابع از نوع استاتیک باشه چرا ابزار های tools هیچکدام نمیشناسه توی تابع استاتیک . ولی اگه کلمه استاتیک از اول تابع حذف بشه تمامی اونا را میشناسه .
من یه راه حل میخوام که ابجکت richtextbox بتونم تو این تابع بشناسونم

fmehrvarzi
سه شنبه 03 دی 1392, 06:36 صبح
تابع توی کلاس تعریف نشده و احتیاجی به کلاس هم نیست ...
اصلا بحث کلاس و تعریف شی از کلاس نیست دوست عزیز .
مطلب اینه چرا ووقتی یک تابع از نوع استاتیک باشه چرا ابزار های tools هیچکدام نمیشناسه توی تابع استاتیک . ولی اگه کلمه استاتیک از اول تابع حذف بشه تمامی اونا را میشناسه .
من یه راه حل میخوام که ابجکت richtextbox بتونم تو این تابع بشناسونم

بهتر بود یه نگاه به لینک میکردی
Static Classes and Static Class Members (C# Programming Guide) (http://msdn.microsoft.com/en-us/library/79b3xss3.aspx)
Static methods and properties cannot access non-static fields and events in their containing type, and they cannot access an instance variable of any object unless it is explicitly passed in a method parameter.
که میگه شما نمیتونید داخل متد ها و پراپرتی های متود استاتیک، به اشیاء غیر استاتیک دسترسی پیداکنید مگر اینکه آن شی را به عنوان پارمتر از متد عبور دهید که یعنی
تابعتون را به صورت زیر تعریف کنید

static void ReadComplete(IAsyncResult ar, RichTextBox rtb)
{
int count = nt.EndRead(ar);
if (count > 0)
{
string str = System.Text.Encoding.ASCII.GetString(buffer, 0, count);
//حالا دیگه میشناسه
rtb.Text="Hi buddy!";
}
AsyncCallback rc = new AsyncCallback(ReadComplete);
nt.BeginRead(buffer, 0, buffer.Length, rc, null);
}

fmehrvarzi
سه شنبه 03 دی 1392, 06:39 صبح
این هم یک مثال ساده دیگه براتون نوشتم
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

private void button1_Click(object sender, EventArgs e)
{
ShowHello(this.richTextBox1);
}
static void ShowHello(RichTextBox rtb)
{
rtb.Text = "Hello";
}
}
}
با تشکر
سوال دیگه ای؟

mohammad1415
سه شنبه 03 دی 1392, 17:14 عصر
این هم یک مثال ساده دیگه براتون نوشتم
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

private void button1_Click(object sender, EventArgs e)
{
ShowHello(this.richTextBox1);
}
static void ShowHello(RichTextBox rtb)
{
rtb.Text = "Hello";
}
}
}
با تشکر
سوال دیگه ای؟

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;

namespace Chat_Server
{

public partial class Form1 : Form
{
static byte[] buffer = new byte[1000];
static NetworkStream nt;
public Socket s;
public string str;
public Form1()
{
InitializeComponent();
}

private void btn_connect_Click(object sender, EventArgs e)
{
TcpListener listener = new TcpListener(6000);
listener.Start();
lbl_result.Text = "Server Start.....";
s = listener.AcceptSocket();
lbl_result.Text += "Client Connected";

}

private void btn_send_Click(object sender, EventArgs e)
{


if (s.Connected)
{
nt = new NetworkStream(s);
StreamWriter sw = new StreamWriter(nt);
AsyncCallback rc = new AsyncCallback(ReadComplete);
nt.BeginRead(buffer, 0, buffer.Length, rc, null);
str = rich_type.Text;
sw.WriteLine(str);
sw.Flush();

}
rich_type.Text = "";

}

static void ReadComplete(IAsyncResult ar)
{
int count = nt.EndRead(ar);
if (count > 0)
{
string str = System.Text.Encoding.ASCII.GetString(buffer, 0, count);

MessageBox.Show(str,"server");

/// می خواهم مقدار str
/// در rich_show.text چاپ شود
/// با سپاس فراوان


}
AsyncCallback rc = new AsyncCallback(ReadComplete);
nt.BeginRead(buffer, 0, buffer.Length, rc, null);
}


}
}

mohammad1415
سه شنبه 03 دی 1392, 17:17 عصر
ممنون میشم این کد برنامه کمکم کنید ..

abbas.oveissi
سه شنبه 03 دی 1392, 17:24 عصر
ممنون میشم این کد برنامه کمکم کنید ..

خیلی مطمئن نیستم اما این کلک شاید کار بکنه . توی constructor فرمتون این کد رو بنویسید :public static RichTextBox rch;
public Form1()
{
InitializeComponent();
Form1.rch= rich_type;
}حالا توی متد استاتیک از Form1.rch استفاده کنید.

mohammad1415
سه شنبه 03 دی 1392, 20:13 عصر
جواب نگرفتم !!! میتونم کل برنامه را ایمیل کنم واستون؟

abbas.oveissi
سه شنبه 03 دی 1392, 20:17 عصر
جواب نگرفتم !!! میتونم کل برنامه را ایمیل کنم واستون؟
همینجا ضمیمه کن اگر حساس نیستی،اگر بتونم کمک کنم خوشحال میشم.

mohammad1415
سه شنبه 03 دی 1392, 20:25 عصر
همینجا ضمیمه کن اگر حساس نیستی،اگر بتونم کمک کنم خوشحال میشم.

http://www.uplooder.net/cgi-bin/dl.cgi?key=2a82b524f4a70951295dff5fd36bb8ee

mohammad1415
سه شنبه 03 دی 1392, 20:30 عصر
این یه برنامه چت بین کلاین و سرور هست
هر دو برنامه باید باز بشود به صورت همزمان و run بشه
اول باید دکمه Conect فرم مربوط به chat server زده بشود و بلافاصله دکمه chat clinet که پیغام وصل شدن را میدهد .
و در آخر در Richtype پایین صفحه شروع به چت کردن میکند برای ارسال باید دکمه send بزنیم که پیغام در یک میسج باکس ظاهر میشود.
مشکل کلی من اینه نمیخوام در میسیج باکس ظاهر بشه میخوام در rich text بالا صفحه پیغام چاپ بشود با سپاس

abbas.oveissi
سه شنبه 03 دی 1392, 20:55 عصر
آها فهمیدم مشکل چیه ، خطای Cross-thread میده.الان میگم چیکاربکنی.

آپدیت : ببین من درست کردم،فقط کد فرم1 از پروژه سرور رو ضمیمه میکنم.خودت نگاه کن میفهمی کجاهاشو عوض کردم .

mohammad1415
سه شنبه 03 دی 1392, 22:04 عصر
وای به خدا نابغه ای دست گل ت درد نکننننننننننننننننننننننن ند
نجاتم دادی خیلی خوشحالم سپاس فقط اگه میشه
delegate void SetTextCallback(Control ctrl, string text);

private static void SetText(Control ctrl, string text)
{
if (ctrl.InvokeRequired)
{
ctrl.BeginInvoke(new SetTextCallback(SetText), ctrl, text);
}
else
{
ctrl.Text = text;
}
}

:تشویق:
واسم یه توضیحی بدی کارش بفهم .....
خیلی زحمت کشیدی

abbas.oveissi
سه شنبه 03 دی 1392, 22:37 عصر
روشی که تو استفاده کردی،میاد یه ترد جدید درست میکنه و متد دریافت پیام تورو توی اون ترد اجرا میکنه تا زمانی که مثلا Server منتظر دریافت پیام هست برنامه قفل نکنه .اما نکته ی کار اینجاست که وقتی متد تو توی ترد دیگه در حال اجرا هست،نمیتونی بصورت معمولی مقدار کنترل های فرمت رو عوض بکنی.
باید از طریق Invoke کردن مقدای کنترل های فرم رو عوض کنی.زمانی که توی SetText رو فرخوانی میکنی میاد به شرط ctrl.InvokeRequired ،چون کنترل توی فرم دیگه هست این خصوصیت True میباشد و میشه متد BeginInvoke کنترل رو اجرا میکنه.BeginInvoke دوباره خودش همین SetText رو فرخوانی میکنه اما اینبار چون از طریق BeginInvoke فرخوانی شده ctrl.InvokeRequired مقدارش False هست و خیلی معمولی مقدار Text کنترل رو برابر هر چی بخوای قرار میده.
یکم سخته اینجوری توضیحش ،ببخشید اگر بد توضیح دادم :لبخند:

mohammad1415
چهارشنبه 04 دی 1392, 20:14 عصر
هااااااان چه خبر خوبی؟:قهقهه:
دستت درد نکند باید برم یکم روش سرچ بزنم ببینم چی به چی ...
بازم ممنون