Работает ли это:
$msgid = Работает ли это:
[110]GET['msgid'];
$oldMessage = "";
$deletedFormat = "";
//read the entire string
$str=file_get_contents('msghistory.txt');
//replace something in the file string - this is a VERY simple example
$str=str_replace("$oldMessage", "$deletedFormat",$str);
//write the entire string
file_put_contents('msghistory.txt', $str);
Статический метод не имеет доступа к таким членам, как txtDisplayMessages, потому что он не является частью этого экземпляра. Я предлагаю вам почитать о концепциях статических методов и прочего, потому что это концепция, не зависящая от языка. Этот метод лучше всего обслуживать, удалив модификатор static, потому что он не обязательно должен быть static - похоже, что его нужно будет вызывать конкретным экземпляром этого объекта.
Чтобы продолжить, как вы это делали, ваш « TheIncomingDataClass
» должен иметь ссылку на объект MainForm
, с которым он должен взаимодействовать . Когда вы создаете экземпляр этого класса (предположительно из метода экземпляра MainForm
), вам нужно будет передать ссылку на этот объект MainForm
.
class TheIncomingDataClass{
MainForm form;
public TheIncomingDataClass(MainForm form){
this.form = form;
}
}
class MainForm : Form{
MainForm(){
new TheIncomingDataClass(this);
}
}
Однако, как предлагается by Bugs , вам, вероятно, будет лучше сделать это событие на TheIncomingDataClass
и подписаться на него из MainForm
.
class IncomingMessageEventArgs : EventArgs{
IncomingMessageType message;
public IncomingMessageType Message{get{return message;}}
public IncomingMessageEventArgs(IncomingMessageType message){
this.message = message;
}
}
class TheIncomingDataClass{
public event EventHandler<IncomingMessageEventArgs> MessageReceived;
protected virtual void OnMessageReceived(IncomingMessageEventArgs e){
if(MessageReceived != null)
MessageReceived(this, e);
}
public void IncomingMessage(IncomingMessageType message){
OnMessageReceived(new IncomingMessageEventArgs(message));
}
}
class MainForm : Form{
MainForm(){
new TheIncomingDataClass().MessageReceived +=
(s, e)=>txtDisplayMessages.AppendText(e.Message.ToString());
}
}
Можно передать ссылку на текущую форму следующим образом:
public static void ReceiveMSG(string message, MainForm mainform)
{
mainform.txtDisplayMessages.AppendText(message);
}
Хотя, как предполагалось, событие, вероятно, лучший способ сделать это.
вызвать событие из класса, на который форма может подписаться.
Просто удалите модификатор static, он вам не нужен. О статике читайте здесь .
Я думаю, вы можете ошибиться в этом вопросе. Похоже, вы пытаетесь отправить сообщение клиенту из внешнего процесса. Есть способы сделать это, но это будет сложно. Я предлагаю клиенту периодически опрашивать любой процесс, у которого есть данные, возможно, каждые 10 секунд, в зависимости от ваших потребностей. Это будет намного проще, чем переход от сервера к клиенту.
Вы можете решить эту проблему, удалив ключевое слово static.
Когда вы видите "static", подумайте: без экземпляра этого типа.
Когда вы вызываете нестатический метод, вы должны явно использовать некоторый экземпляр. Метод может обращаться к этому экземпляру с помощью ключевого слова this.
Когда вы вызываете статический метод, экземпляра нет - вы вышли за границы объектно-ориентированного программирования и теперь находитесь в контексте структурного или функционального программирования. Если вам нужен экземпляр чего-либо, вам нужно ввести его в качестве параметра.
Хорошо, поехали. Статические методы могут обращаться только к статическим членам. Ваш метод ReceiveMSG является статическим. txtDisplayMessages нет, и поэтому вы не можете получить к нему доступ. Почему ваш метод должен быть статическим? Излишне говорить, что если вы удалите ключевое слово static, которое решит вашу проблему.
Просто сделайте ReceiveMSG частью класса, создайте экземпляр класса и затем вызовите метод этого экземпляра.
Я думаю, вам следует опубликовать именно такое решение вы ожидаете.
Поскольку вы новичок в C #, я постараюсь сделать это как можно проще. У вас должен быть файл Program.cs с единственным методом Main (он был бы сгенерирован Visual Studio). Вам нужно будет сделать так, чтобы он выглядел следующим образом:
class Program
{
public static readonly MainForm MainForm;
static void Main()
{
Application.EnableVisualStyles();
MainForm = new MainForm(); // These two lines
Application.Run(MainForm); // are the important ones.
}
}
Теперь во входящем сообщении у вас будет способ получить доступ к этой форме.
public void IncomingMessage(IncomingMessageType message)
{
Program.MainForm.RecieveMSG(message);
}
Этот метод в форме будет тогда экземпляром (не статическим) методом. Например,
public void RecieveMSG(IncomingMessageType message) // NB: No static
{
txtDisplayMessages.Text = message.Text; // Or whatever.
}
Есть способы сделать это лучше, но как новичок я думаю, что это будет лучший подход.
Разница между статическим и экземпляром (экземпляр - это когда вы не говорите статический) огромна. Чтобы получить доступ к методу, полю или свойству экземпляра (которые в C # все вместе называются членами), вам необходимо иметь содержащий его экземпляр. Итак:
Person p = new Person(); // You now have an instance.
p.Name = "Fred"; // You are using an instance property.
Статика противоположна, они одинаковы в любом месте вашего приложения (более технически в пределах одного и того же AppDomain - но если вы новичок, вам не нужно беспокоиться об этом некоторое время). Вам не нужен экземпляр для доступа к ним (свойства виджетов кода «Статические методы могут обращаться только к статическим членам»). Например:
// Where Planet is a class and People is a static property.
// Somewhat confusingly the Add method is an instance - best left for the student :).
Planet.People.Add(new Person("Fred"));
Надеюсь, это даст вам хорошее представление о том, что такое static и instance и где их использовать. Однако самое важное - постараться как можно лучше избегать статических членов - они могут вызвать кошмары обслуживания.
Microsoft опубликовала полную статью о важных концепциях, касающихся этого.