Добрый день. Читаю книгу Пола Дейтела - Полное руководство по 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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я хочу изменить содержимое label с клавиатуры, причем иных компонентов у меня нет, исключительно один label1Вот что я имею:
Получаю процессы так:
Добрый день, подскажите как можно задать кол-во элементов массива из TextBox?
Поле Customer допускает значение nullПри попытке его устновить в null, оно остается прежним