Добрый день. Читаю книгу Пола Дейтела - Полное руководство по 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.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости