Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вызов функции при нажатии на кнопку


Автор: tereres 19.3.2006, 10:46
Язык C#. Имеется окно с TextBox-ом, Кнопкой (Button). Написана функция, которая по координатам, которые по замыслу должны вводится в TextBox-е и при нажатие на Кнопку(Button), должна в окне рисовать определённый рисунок(какой - не важно... там линни и всё такое...). Вопрос - как соединить координаты введённые в TextBox-e с Кнопкой и Функцией? И как сделать чтобы после ввода координат (координаты - цифры) и нажатии на Кнопку вызывалась Функция? В функции при этом должен заполнится массив из введёных координат... Спасибо...

Автор: mr.DUDA 19.3.2006, 11:29
Цитата(tereres @ 19.3.2006, 09:46 Найти цитируемый пост)
Язык C#. Имеется окно с TextBox-ом, Кнопкой (Button). Написана функция, которая по координатам, которые по замыслу должны вводится в TextBox-е и при нажатие на Кнопку(Button), должна в окне рисовать определённый рисунок(какой - не важно... там линни и всё такое...). Вопрос - как соединить координаты введённые в TextBox-e с Кнопкой и Функцией? И как сделать чтобы после ввода координат (координаты - цифры) и нажатии на Кнопку вызывалась Функция? В функции при этом должен заполнится массив из введёных координат... Спасибо...

Для начала, http://www.firststeps.ru/dotnet/dotnet1.html. После того, как освоили понятия "класс", "метод", "событие", "форма" и "элемент управления" пишем простейший код:
  • на форме находится TextBox, Button и Panel (на последней отрисовывается наша фигура)
  • на событие Click кнопки подписан обработчик button1_Click
  • на событие Paint панели подписан обработчик panel1_Paint
  • в обработчике события Click берём текст из TextBox и преобразуем в массив структур Point
  • в обработчике события Paint проверяем массив на null и если массив заполнен - рисуем линии по координатам
Пример, принимающий из TextBox массив чисел, разделённых точкой с запятой, и рисующий фигуру заданную введёнными координатами:
Код
using System;
using System.Drawing;
using System.Windows.Forms;

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

        // массив координат точек, по которым строится фигура
        Point[] points = null;

        // обработчик нажатия кнопки на форме
        private void button1_Click(object sender, EventArgs e)
        {
            // разбиваем текст из TextBox на массив подстрок, разделённых ';'
            string[] str_numbers = textBox1.Text.Split(';');

            // создаём массив координат точек, длина которого = количеству пар координат
            points = new Point[str_numbers.Length / 2];
            
            // проходим в цикле по строковым координатам, заполняем массив points
            int i = 0;
            for(int j = 0; j < points.Length; j++, i+=2)
                points[j] = new Point(int.Parse(str_numbers[i]), int.Parse(str_numbers[i + 1]));

            // обновляем панель
            panel1.Refresh();
        }

        // обработчик события Paint панели
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            // если массив координат задан, рисуем соединённые линии по координатам
            if(points != null)
                e.Graphics.DrawLines(Pens.Black, points);
        }
    }
}

Автор: tereres 19.3.2006, 12:12
Cпасибо! Принцип вроде понял, хотя твой код не откомпелировался... Вот только как сделать Refresh окна? Функция panel1.Refresh(); не идёт... может я не правельно её использую? Может место panel1 надо писать что-то другое? Я просто новечок в программировании под виндоус, второй день разбераю... Вроде уже всё написал - осталось функцию обновления окна написать - и вроде всё... Спасибо!

Автор: mr.DUDA 19.3.2006, 12:50
Цитата(tereres @ 19.3.2006, 11:12 Найти цитируемый пост)
Cпасибо! Принцип вроде понял, хотя твой код не откомпелировался... Вот только как сделать Refresh окна? Функция panel1.Refresh(); не идёт... может я не правельно её использую? Может место panel1 надо писать что-то другое? Я просто новечок в программировании под виндоус, второй день разбераю... Вроде уже всё написал - осталось функцию обновления окна написать - и вроде всё... Спасибо!

Не откомпилироваться мог по двум причинам: либо у тебя студия 2003 (код написан под второй .NET Framework и 2005-ю студию), либо ты не вытянул на форму элемент управления "Panel" (на это косвенно указывают твои вопросы). Вместо панели можно рисовать на чём угодно, хоть на форме напрямую, может так даже будет проще. Обновление окна выполняется методом Refresh, который есть у любого визуального элемента (у формы, у кнопки, у панели и т.д.). Метод Refresh очищает окно и генерирует событие Paint. Необходимо подписаться на событие Paint и в обработчике можно рисовать линии и др. примитивы на канве (e.Graphics). На всякий случай: подписаться на событие визуального элемента можно в дизайнере, выделив данный элемент и дважды кликнув по имени события в окне Properties на закладке Events.

Автор: tereres 19.3.2006, 15:32
Да, я не пользуюсь Studio2005... Я предпочетаю Sharp Developer... Тут у меня возникла другая проблемма - как мне из TextBox-а возратить массив int - если в TextBox-е числа различаются ","? Для расстояния... у меня каждая расстояние - число(а не пара чисел), а потом уже координаты сами вычесляются.. Т.е. фактический как преобразовать string в массив int? Спасибо.

Автор: VisualProgrammerNET 19.3.2006, 18:00
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            int len = textBox1.Text.Length;
            int[] mass = new int[len];
            for (int i = 0; i < len; i++)
            {
                mass[i] = Int32.Parse(textBox1.Text.Substring(i, 1));
            }

            foreach (int p in mass)
                label1.Text += p.ToString();
        }
    }
}

Автор: mr.DUDA 19.3.2006, 20:46
Цитата
int len = textBox1.Text.Length;
int[] mass = new int[len];
for (int i = 0; i < len; i++)

Честно говоря, смысла в этом коде нет. Вы заполняете массив int'ов значениями, каждое из которых равно цифре, полученной из строки, по соответствущей позиции

Автор: tereres 19.3.2006, 21:09
Mr.DUDA - ты в принципе прав... а как сделать так, чтобы нассив int-ов заполнялся числами которые определены через запятую в TextBox-е: "24,58,5,487,4,48"?

Автор: mr.DUDA 19.3.2006, 21:19
Цитата(tereres @ 19.3.2006, 20:09 Найти цитируемый пост)
Mr.DUDA - ты в принципе прав... а как сделать так, чтобы нассив int-ов заполнялся числами которые определены через запятую в TextBox-е: "24,58,5,487,4,48"?

Вместо
Код
string[] str_numbers = textBox1.Text.Split(';');

пишем
Код
string[] str_numbers = textBox1.Text.Split(',');


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)