Вернуться   D3Scene.Ru Софт портал игр | Хаки | Проги | Статьи > Другое > Информационные технологии > Программирование > С++/C#
Присоединяйся к нам



Ответ
 
Опции темы Опции просмотра
Старый 15.03.2012, 00:09   #1
В инвизе

 
Аватар для R1k1maru
 
Регистрация: 10.12.2008
Адрес: Kzn
Сообщений: 210
Репутация: 83
Автор По умолчанию

Массив кнопок С#


Доброй ночи всем. Столкнулся с одной проблемой.

Решил попробовать программно создать массив кнопок. Прописал функцию инициализации, при запуске программы все кнопки прорисовываются как надо.
Но есть один нюанс. При нажатии на любую кнопку должно происходить одно и тоже действие.
Можно как нибудь сделать так, что бы это работало через одну функцию, а не надо было прописывать n одинаковых функций для каждой кнопки?

Для примера привожу часть кода:

Button [,] B = new Button[5,5];
void initB()
{
for(int i=0;i<5;i++)
{
for (int j = 0; j < 5; j++)
{
B[i, j] = new Button();
B[i, j].Location = new Point(i * 20, j * 20);
B[i, j].Size = new Size(20, 20);
B[i, j].Text = "true";
B[i, j].Click += new EventHandler(buttB_Click);
this.Controls.Add(B[i, j]);
}
}
}

//А это как раз та самая функция для всех кнопок (пусть она например
//меняет параметр Text на "false");
void buttB_Click(object sender, EventArgs e)
{

}
  Ответить с цитированием Наверх
Старый 15.03.2012, 00:27   #2
Lost


 
Аватар для N.e.o.
 
Регистрация: 20.08.2009
Адрес: Matrix
Сообщений: 1,028
Репутация: 802
По умолчанию

на клик по баттону поставить одну и ту ж ф-цию обработки клика по баттону
:poker_face2:
__________________

[Ссылки скрыты от гостей.]
[Ссылки скрыты от гостей.]
По женским представлениям, под покровом темноты мужчины могут думать только о сексе. Это неправда. Днем они тоже о нем думают.*face2*
  Ответить с цитированием Наверх
Старый 15.03.2012, 00:35   #3
В инвизе

 
Аватар для R1k1maru
 
Регистрация: 10.12.2008
Адрес: Kzn
Сообщений: 210
Репутация: 83
Автор По умолчанию

Цитата:
Сообщение от N.e.o. Посмотреть сообщение
на клик по баттону поставить одну и ту ж ф-цию обработки клика по баттону
void buttB_Click(object sender, EventArgs e)
{
}
Вот у меня эта функция, что мне надо написать внутри, чтобы она например изменила параметр кнопки Text на "false"? Как мне получить индексы кнопки? Или как вообще это делается?
  Ответить с цитированием Наверх
Старый 15.03.2012, 00:45   #4
Освоившийся

 
Аватар для FromShadow
 
Регистрация: 19.06.2009
Адрес: Киев
Сообщений: 322
Репутация: 336
По умолчанию

R1k1maru, ты определись, ты хочешь всеми кнопками запускать одну и ту же ф-цию, или одной ф-цией менять всем кнопкам какое то свойство? Или и то и другое?))
  Ответить с цитированием Наверх
Старый 15.03.2012, 00:52   #5
В инвизе

 
Аватар для R1k1maru
 
Регистрация: 10.12.2008
Адрес: Kzn
Сообщений: 210
Репутация: 83
Автор По умолчанию

Цитата:
Сообщение от FromShadow Посмотреть сообщение
R1k1maru, ты определись, ты хочешь всеми кнопками запускать одну и ту же ф-цию, или одной ф-цией менять всем кнопкам какое то свойство? Или и то и другое?))
Я не хочу писать 25 функций, таких, что при нажатии на кнопку у этой же кнопки менялся какой либо параметр. Я хочу одну функцию, которая распознавала бы по какой кнопки был щелчок и менял у этой кнопки параметр.

То есть я могу написать:
butt1(аргументы)
{
B[0,0].Text="false";
}

butt2(аргументы)
{
B[0,1].Text="false";
}

и т.д еще кучу раз.
  Ответить с цитированием Наверх
Старый 15.03.2012, 01:02   #6
Освоившийся

 
Аватар для FromShadow
 
Регистрация: 19.06.2009
Адрес: Киев
Сообщений: 322
Репутация: 336
По умолчанию

R1k1maru, object sender отвечает за объект который вызывает событие.
По идее, вызывая ф-цию пишешь buttB_Click(B[i][j],[]);


Добавлено через 29 минут
Хотя, наверное, то, что выше не покатит...
Sender используется немного по другому:
Должен работать вариант, если ты в своем коде выше будешь давать имена кнопкам
Код:
...
B[i, j] = new Button();
B[i, j].Location = new Point(i * 20, j * 20);
B[i, j].Name = btn + Convert.ToString(i)+Convert.ToString(j);
...
,
а в процедуре по сендеру пробивать, что за кнопка:
Код:
 void button1_Click(object sender, System.EventArgs e)
{
   if( sender == btn00 )
   {
     btn00.text = True;
   }
   else if( sender == btn01 )
   {
     btn01.text = True;
   }
...
}
Но как по мне это почти то же, что и написать для каждой кнопки свою процедуру :)

Последний раз редактировалось FromShadow; 15.03.2012 в 01:32. Причина: Добавлено сообщение
  Ответить с цитированием Наверх
Старый 15.03.2012, 14:43   #7
Старожил


 
Аватар для gg.Groove
 
Регистрация: 21.08.2010
Адрес: Almaty
Сообщений: 1,054
Репутация: 212
По умолчанию

Гуглуй на MSDN
Вообще FromShadow правду говорит.
Object это объект в перегрузке, вызвавший событие
__________________

[Ссылки скрыты от гостей.]
  Ответить с цитированием Наверх
Старый 16.04.2012, 06:25   #8
Новичок
 
Аватар для apachai777
 
Регистрация: 16.04.2012
Сообщений: 2
Репутация: 2
По умолчанию

private void buttB_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;

if (btn.Name == "btn42")
{
//sender.text = "false";
}
}
Вот как бы Button btn = (Button)sender; бери ссылку и всё будет ок.
И лучше не используй if там где перебор,юзай switch он памяти меньше забирает и времени проца.
  Ответить с цитированием Наверх
Старый 16.04.2012, 18:58   #9
В инвизе

 
Аватар для R1k1maru
 
Регистрация: 10.12.2008
Адрес: Kzn
Сообщений: 210
Репутация: 83
Автор По умолчанию

Цитата:
Сообщение от apachai777 Посмотреть сообщение
private void buttB_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;

if (btn.Name == "btn42")
{
//sender.text = "false";
}
}
Вот как бы Button btn = (Button)sender; бери ссылку и всё будет ок.
И лучше не используй if там где перебор,юзай switch он памяти меньше забирает и времени проца.
С этим я уже давно разобрался. Теперь я застрял на моменте с нажатием правой клавиши мыши на кнопку. Когда левой жму все нормально, а когда прописываю нажатие правой/колесиком, то ничего не происходит. Друзья сказали, что кнопки не предназначены для клика пкм, может можно как нибудь это обойти?
  Ответить с цитированием Наверх
Старый 17.04.2012, 04:31   #10
Новичок
 
Аватар для apachai777
 
Регистрация: 16.04.2012
Сообщений: 2
Репутация: 2
По умолчанию

Ну это ты не обойдёшь, можешь тока обхетрить, моё предложение. Есть такая штука по крайне мере на плюсах делал как перехватчик клавиатурых нажатий ну и есть такое для мыши там уже пофигу правая левая скрол, ну сделай для кнопки обработчик по фокусу мыши, а в перехватчики по правому нажатию просто доставай глобальую ссылку на кнопку которую ты поймал по фокусу и делай там что хочешь.
Суть в том что ты должен найти в мсдне или в инете как забирать хенлд мыши ну и поставишь кулбак фунцию для обработки событий мыши, на скоко я помню я делал подобные вещи именно так. Самому щас рыться искать времени нету, а так рад помочь идеей. Хотя скоро может с этим тоже столкнусь в своих проэктах ну тогда уже выкину код, но не особо скоро.

Добавлено через 10 минут
Если хочешь можешь пообщаться со мной по скайпу, а то так я не совсем понимаю что ты знаешь, а что делаешь по шаблону скидывай в пм свой скайп я добавлю тебя.

Добавлено через 2 часа 59 минут
Я ещё вспомнил в очередь сообщений мышки приходит много чего, в том числе на что ты нажал, если нажал на кнопку там есть айди ну и можешь взять ссылку кнопки прям оттуда, тока надо проверку поставить что это именно кнопка, что бы если нажал правой кнопкой то брать ссылку унаследовавший от кнопки выполнить какой то код.

Добавлено через 3 часа 10 минут
Если стандартной функциональности режима разработки не хватает, можно напрямую обрабатывать очередь сообщений Windows, также как это делается компонентом в режиме выполнения. Отличие состоит в том, что дизайнер компонента (в отличие от самого компонента) будет получать сообщения только в режиме разработки.
Для обработки очереди сообщений нужно перекрыть метод wndproco класса ControiDesigner. Библиотека .NET Framework является мультиплатформен- ной, поэтому специальных констант, описывающих коды сообщений Windows, она не содержит. Приходится описывать их самостоятельно. В листинге 6.12 показан пример обработки щелчка кнопки мыши. Код сообщения в этом случае равен 0×201. В случае получения этого кода мы будем выводить небольшое сообщение. Для того чтобы отсечь нажатия вне границ компонента, нужно проверять координаты точки, в которой находится курсор мыши. Аналогично можно получать не только сообщения о действиях мыши, но и любые другие сообщения.
Листинг 6 12 Оьработка щелчка мыши
using System;
using System.Collections;
using System. Collections .Generic;
using System. Text;
using System.Windows.Forms.Design;
using System.Drawing;
using System.ComponentModel;
using System.Windows. Forms;
namespace MyControl
{
class GradientLabelDesigner : ControiDesigner {
protected const int WM_LBUTTONCLICK = 0×201;
protected override void WndProc(ref Message rn)
f
if (m.Msg == WM_LBUTTONCLICK)
{
point pt = Control.PointToClient(Cursor.Position);
if ((pt.X > 0) ss (pt.X < Control.Width)
&& (pt.Y > 0) && (pt.Y < Control.Height))
[
MessageBox.Show("Нажата левая кнопка мыши! " + pt.X);
}
)
base.WndProc(ref m) ,-
}
)
}
ТУТ много опечаток в коде на скоко я заметил, но суть та же копай в эту сторону.

Добавлено через 3 часа 12 минут
m.Msg == WM_LBUTTONCLICK- должно быть и что то типа m.Msg == WM_RBUTTONCLICK как то так

Последний раз редактировалось apachai777; 17.04.2012 в 07:43. Причина: Добавлено сообщение
  Ответить с цитированием Наверх
Пользователь сказал cпасибо:
R1k1maru (17.04.2012)
Старый 17.04.2012, 12:07   #11
В инвизе

 
Аватар для R1k1maru
 
Регистрация: 10.12.2008
Адрес: Kzn
Сообщений: 210
Репутация: 83
Автор По умолчанию

apachai777, я молится на тебя готов! Я еще не очень много знаю, но то что ты написал я все понял (некоторое на подсознательном уровне, с некоторым сталкивался сам). К сожалению, времени у меня пока нет - работа/учеба, но как только появится, я бы с огромным удовольствием пообщался с тобой в скайпе. Еще раз огромнейшее тебе спасибо!
  Ответить с цитированием Наверх
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Powered by vBulletin
Copyright © 2016 vBulletin Solutions, Inc.
Перевод: zCarot | Дизайн: G-A | Верстка: OldEr
Текущее время: 01:52. Часовой пояс GMT +4.