Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
1

Не работает вызов одного метода в теле другого

03.12.2012, 18:02. Просмотров 1096. Ответов 13
Метки нет (Все метки)

здравствуйте. занимаюсь переводом проекта с С++ на C#. путем "дебага" обозначилась проблема, что в одной из моих функций "private void BuildButton_Click(object sender, EventArgs e)" не вызывается другая функция "private void repaint()".
вот часть кода
C#
1
2
3
4
5
6
7
        private void BuildButton_Click(object sender, EventArgs e)
        {
        //подчистим код немного
        //тут много буков
                 
                repaint();
        }
функция repaint();
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        private void repaint() {
            Graphics g = pictureBox1.CreateGraphics();
                 int current = (int)viewSB.Value-1;
                 float l = (float)elementLengthSB.Value;
                 float x1=0, x2=0, y1=0, y2=0;
                 float a=0;
                 
                 //очистка
                 g.FillRectangle(new SolidBrush(Color.FromArgb(255, 255, 255, 255)), 0, 0, 500, 500);
 
                 //Оси координат
                 g.DrawLine(new Pen(Color.Gray), 0, 250, 500, 250);
                 g.DrawLine(new Pen(Color.Gray), 250, 0, 250, 500);
 
                 //Фигура
                 int xPos = (int)xPosSB.Value, yPos = (int)yPosSB.Value, size = (int)sizeSB.Value;
                 g.FillRectangle(new SolidBrush(Color.Red), 250 + (xPos-size/2), 250 - (yPos+size/2), size, size);
 
                 //Если нету корректных конфигураций, выход
                 if (current < 0) return;
                 //Рисуем манипулятор для выбранной конфигурации
                 for (int i=0; i<numElements; ++i) {
                     a += angles[current][i];
                     x1 = x2; y1 = y2;
                     x2 += l*(float)Math.Cos(a/180.0f*3.1415f);
                     y2 += l*(float)Math.Sin(a/180.0f*3.1415f);
                     g.FillEllipse(new SolidBrush(Color.Black), 250+x2-2, 250-y2-2, 4.0f, 4.0f);
                     g.DrawLine(new Pen(Color.Black), x1+250, 250-y1, 250+x2, 250-y2);
                 }
                 g.FillEllipse(new SolidBrush(Color.FromArgb(255, 0, 255, 0)), 250+x2-2, 250-y2-2, 4.0f, 4.0f);
             }
из репаинта работает точно этот код
C#
1
g.FillEllipse(new SolidBrush(Color.FromArgb(255, 0, 255, 0)), 250+x2-2, 250-y2-2, 4.0f, 4.0f);
т.к. прямоугольник он мне отрисовывает.
в общем: может я как то не правильно вызываю функцию в другой функции? в C# может как то по другому?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2012, 18:02
Ответы с готовыми решениями:

Вызов метода, ожидающего завершение другого метода
Имеется процедура Proc. Я её вызываю в Button. Только вот программа, не дожидаясь завершения...

Вызов метода из другого класса
Добрый день! Приложение спроектировано для почтовой службы и нужно рассчитать количество дней на...

Вызов метода из другого класса
Имеется проект TestEvents. В нём есть класс ClassCounter, содержащий в себе открытый метод Count()....

Вызов метода в классе формы из класса другого проекта
Есть проект Project1 и Project2 - оба ClassLibrary. В Project1 происходит вызов форми из Project2...

Вызов одного события из другого
Подскажите пожалуйста. Например имеются две кнопки. Кликая на 1-ю в лейбле выводит &quot;Hello world&quot;....

13
Besnywka
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
03.12.2012, 18:41 2
Все правильно вызываете, только это не функции, это методы (так к слову).
А как Вы поняли, что метод не отрабатывает? Если часть кода отрабатывается (Ваш эллипс же отрисовывается?), значит, управление в метод передается, а следовательно, проблема не в вызове метода, а в самом его коде
0
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
03.12.2012, 19:51  [ТС] 3
ну во первых при дебаге мне сообщается, что аргумент "e" не получает никакого значения.
во вторых, этот же код в С++ работает без проблем. я только лишь перевел его в C#. иначе говоря вместо "->" поставил точки. ну и заменил некоторые "неактуальные" методы из С++ "сишарповскими".
0
turbanoff
Эксперт Java
4048 / 3783 / 743
Регистрация: 18.05.2010
Сообщений: 9,330
Записей в блоге: 11
Завершенные тесты: 1
03.12.2012, 21:37 4
Цитата Сообщение от gregster Посмотреть сообщение
путем "дебага" обозначилась проблема, что в одной из моих функций "private void BuildButton_Click(object sender, EventArgs e)" не вызывается другая функция "private void repaint()".
А сам метод BuildButton_Click вызывается? К событию привязан?
0
03.12.2012, 21:37
Spectral-Owl
590 / 565 / 157
Регистрация: 29.06.2010
Сообщений: 1,610
Завершенные тесты: 1
04.12.2012, 11:38 5
Цитата Сообщение от gregster Посмотреть сообщение
из репаинта работает точно этот код
C#
1
g.FillEllipse(new SolidBrush(Color.FromArgb(255, 0, 255, 0)), 250+x2-2, 250-y2-2, 4.0f, 4.0f);
т.к. прямоугольник он мне отрисовывает.
а ничего что это отрисовка эллипса а не прямоугольника?
Проверил работу метода при фиксированных значениях непонятных мне переменных, работает от начала до конца
вижу некоторые возможности возникновения проблеммы:

0) у тебя всегда срабатывает условие if (current < 0) return;
1) "неотрисовывающиеся" у тебя объекты имеют банально тот же цвет, что и задний фон.
2) значения тех странных переменных такие, что отрисовываемые объекты либо рисуются где-то за границей изображения (что врятли, скорее всего это вызвало бы Exception), либо настолько малы что их и не видно.
3)вызов метода repaint происходил внутри обработчика try{} catch{}, что прервало его выполнение сразу после:
3.1) Индекса вне предела диапазона (были в коде индексаторы)
3.2) математических ексепшенов (попытка привести в int бесконечность, NaN)
3.3) отрисовки недопустимого (рисование фигур с координатами превышающими размер картинки, попытка отрисовать координату бесконечность и пр.)

могу посоветовать пройтись пошаговой отладкой по всему телу метода:
-ставишь точку остановы на 1ой строке метода (F9)
-жмакаешь F11 пока работа метода не прервётся
-что-бы вернуться к нормальной работе приложения - F5
0
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
04.12.2012, 13:09  [ТС] 6
Цитата Сообщение от turbanoff Посмотреть сообщение
А сам метод BuildButton_Click вызывается? К событию привязан?
да. это нажатие на кнопку

Цитата Сообщение от Spectral-Owl Посмотреть сообщение
а ничего что это отрисовка эллипса а не прямоугольника?
эм.. действительно. но прямоугольник у меня всегда отрисовывается.

на счет ошибок (возможных):
1) ну как они могут иметь цвета фона, если он белый, а у объектов все цвета заданы? при переносе на С# не менял ни цветов, ничего, в общем.
2) мне тоже кажется недостаточным, чтобы принять его за дейсвительную "угрозу"
0
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
04.12.2012, 13:30  [ТС] 7
в общем подправил у себя код. нашел ошибочку, почему он не хотел рисовать. там чутка условие кривое было. теперь не в этом суть. вот теперь у меня схожесть максимальная с оригиналом на С++. только теперь не хочет "repaint'ить" мои конфигурации, которые вычислил. иначе говоря, не перерисовывает "звенья". отрисовывает первую и "единственную" из найденных конфигураций
0
Миниатюры
Не работает вызов одного метода в теле другого   Не работает вызов одного метода в теле другого  
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
11.12.2012, 17:55  [ТС] 8
подскажите, что еще не так?
0
Shadowgun
1 / 1 / 0
Регистрация: 01.07.2012
Сообщений: 24
11.12.2012, 19:29 9
Проблема 1 - у тебя .Value - нет такого, точней я такой не знаю, либо у тебя какой то особый клас, я переписал данный код, подставив вместо *.VAlue свои рандомные числа и все зароботало, кину тебе программу, ивент на маус клик будет отрисовка происходить, в качестве подложки использовал panel, как то привычней с панелькой роботать. вообщем дерзай, я тебе указал где ошибка.
1
Вложения
Тип файла: rar WindowsFormsApplication1.rar (38.0 Кб, 4 просмотров)
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
11.12.2012, 19:48  [ТС] 10
.Value у меня берется из комбобоксов, в которых пользователь выбирает значения. на скринах выше их можно увидеть.
так, пока что дали пищу для размышлений. буду тестить.

Добавлено через 10 минут
так, по ходу, нашел ошибку. попробовал создать событие, точно такое же, какое у меня привязано на viewSB, но создать через события. выбрал valuechanged. он мне создал новое событие. потом при его редактировании и копании, потребовалось удалить. удалил вручную, переключаюсь в форму и мне вываливается сообщение "Код метода "InitializeComponent" создан конструктором, и его нельзя изменять вручную. Отмените все изменения и попытайтесь открыть конструктор еще раз." выходит, что при создании первого метода у меня не было создано конструктора для его работы.
сейчас еще покопаюсь, чтобы с концами устранить проблему.
всем спасибо
0
Shadowgun
1 / 1 / 0
Регистрация: 01.07.2012
Сообщений: 24
11.12.2012, 19:49 11
ну посмотри, я выставил значения и все стало роботать, быть может проблемы была в пикчербоксе, не знаю, просто посмотри проэкт мой, и скажешь свой вердикт
0
gregster
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
11.12.2012, 19:57  [ТС] 12
Цитата Сообщение от Shadowgun Посмотреть сообщение
ну посмотри, я выставил значения и все стало роботать, быть может проблемы была в пикчербоксе, не знаю, просто посмотри проэкт мой, и скажешь свой вердикт
я уже высказал его)
я смотрел ваш проект, и он однозначно натолкнул меня на некоторые мысли. сначала я думал, что не инициализировал g. у вас он инициализирован так
C#
1
Graphics g = panel1.CreateGraphics();
как выяснил, у меня все с этим в порядке. т.к. не имеет значения панель это или что то иное. я тоже сначала пробовал с панели. просто мне один товарищ подсказал попробовать пикчебокс. разница почти никакой, кроме качества картинки.

на счет значений. они у меня брались нормально еще до того, как я обратился на форум. поэтому у меня с ними проблем не было. эти значения, повторюсь, брались из комбобоксов.

моя проблема была решена, как описано было в предыдущем моем посте. видимо не создался конструктор на событие valuechanged
0
Shadowgun
1 / 1 / 0
Регистрация: 01.07.2012
Сообщений: 24
11.12.2012, 20:36 13
Рад был помочь)
0
Doomer3D
175 / 175 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
12.12.2012, 08:24 14
Немного советов:

1. Не стоит рисовать в PictureBox извне, лучше пропишите событие PictureBox_Paint и рисуйте в нем (там объект Graphics уже создан).
2. Для повышения качества изображения, можно прописать такой код:

C#
1
2
3
4
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.SmoothingMode = SmoothingMode.AntiAlias;
0
12.12.2012, 08:24
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2012, 08:24

Вызов одного метода через другой
Здравствуйте ! У меня такая проблема: есть событие нажатия на кнопку: private void...

Вызов метода и передача данных из одного класса в другой
Есть два класса, основной(Form1) и дополнительный(Class1). В дополнительном классе находится метод,...

Не работает вызов метода
почему етот метод не выполняетса , ставлю там брейкпоинт и програма там не останавливаетса (и не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.