Добрый день. Читаю книгу Пола Дейтела - Полное руководство по C# за 2006 год. Дошёл до раздела с делегатами. После прочтения главы, мне на минутку показалось, что я понял тему, поскольку смог реализовать простой код, который считает до 10:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace consoledemo
{
public delegate void TopMessage(string message); //объявление делегата. Делегат - это тип данных по ссылке.
class Program
{
static void Main(string[] args)
{
TopMessage method = Show; // Тут объявлена ссылка на метод с совпадающей сигнатурой (Show)
ShowMessage(10, method); //method передаётся сюда вторым параметром
}
static void ShowMessage(int second, TopMessage method)//TopMessage передаёт ссылку на метод совпадающей сигнатурой. method является переменной, в которой хранится ссылка
{
for (int i = 0; i < second; i++)
{
Thread.Sleep(1000);
method(string.Format("How long before closing the console: " + i)); //method транслирует свои сообщения в другой метод
}
}
static void Show (string message) // данный метод имеет сигнатуру точно такую же, как объявлено в делегате (TopMessage)
{
Console.WriteLine(message);
}
}
}
Но поскольку Дейтел в своей книге большую часть примеров демонстрирует в консоли, я решил немного усложнить себе задачу. Я добавляю кнопку и метку. По нажатию на кнопку, в метку должно было транслироваться сообщение How long before closing the console: после чего, метка должна была становится невидимой. Если проблема с исчезновением метки вполне решаема, то реализация отображения сообщения является для меня проблемой. Если в метод Main я добавлю: label1.Text = method.ToString(); то получу заморозку окна на 10 секунд (поскольку не вывел это дело в отдельный поток), а по завершению, метка будет отображать текст Win32Demo.TopMessage. Максимум, что я смог сделать, это подключить класс MessageBox.Show.
Как мне заставить метод Show транслировать свои сообщения в свойства Button1.text , Label1.text и так далее.
Спасибо за ответы, Любитель.
В label1 отображается неправильный текст, потому что в ее свойство Text присваивается результат вызова метода ToString у объекта, являющегося делегатом метода. А на самом деле, в переменную текст следует поместить результат выполнения делегата: label1.Text = method();
Для этого необходимо изменить и сам делегат, и реализацию соответствующего метода.
public delegate string TopMessage(int seconds);
static string Show (int seconds)
{
return string.Format("How long before closing the console: " + seconds);
}
Для того, чтобы не замораживать UI во время ожидания одной секунды, следует вместо метода ThreadSleep использовать компонент Timer.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости