8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
1

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

03.12.2012, 18:02. Показов 1404. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2012, 18:02
Ответы с готовыми решениями:

Что-то я не понимаю.Вызов метода одного класса из другого класса
Есть два класса первый содержит атрибуты объекта описывающие кнопку: имя, позиция, размер и тд... А...

Вызов метода одного класса внутри другого класса
PHP передача метода, с класса, в другой класс Столкнулся с проблемой не могу передать метод или...

Обеспечить видимость переменных в теле одного метода
Компилятор (Visual Studio 2010) выдает ошибку &quot;Use of unassigned local variable 'RightClass'&quot; на...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет...

13
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
03.12.2012, 18:41 2
Все правильно вызываете, только это не функции, это методы (так к слову).
А как Вы поняли, что метод не отрабатывает? Если часть кода отрабатывается (Ваш эллипс же отрисовывается?), значит, управление в метод передается, а следовательно, проблема не в вызове метода, а в самом его коде
0
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
03.12.2012, 19:51  [ТС] 3
ну во первых при дебаге мне сообщается, что аргумент "e" не получает никакого значения.
во вторых, этот же код в С++ работает без проблем. я только лишь перевел его в C#. иначе говоря вместо "->" поставил точки. ну и заменил некоторые "неактуальные" методы из С++ "сишарповскими".
0
Эксперт Java
4077 / 3811 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
03.12.2012, 21:37 4
Цитата Сообщение от gregster Посмотреть сообщение
путем "дебага" обозначилась проблема, что в одной из моих функций "private void BuildButton_Click(object sender, EventArgs e)" не вызывается другая функция "private void repaint()".
А сам метод BuildButton_Click вызывается? К событию привязан?
0
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
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
8 / 3 / 0
Регистрация: 04.09.2011
Сообщений: 108
04.12.2012, 13:09  [ТС] 6
Цитата Сообщение от turbanoff Посмотреть сообщение
А сам метод BuildButton_Click вызывается? К событию привязан?
да. это нажатие на кнопку

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

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

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

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

моя проблема была решена, как описано было в предыдущем моем посте. видимо не создался конструктор на событие valuechanged
0
1 / 1 / 0
Регистрация: 01.07.2012
Сообщений: 24
11.12.2012, 20:36 13
Рад был помочь)
0
178 / 178 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2012, 08:24

Разместить экземпляры одного класса в теле другого
Всем здравствуйте. Есть внешний класс, содержащий массив экземпляров внутренних классов: class...

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

Может ли тело одного цикла частично содержаться в теле другого?
Помогите, пожалуйста, решить пару вопросов 1. .Имеются описания массивов: Type Wektor=array of...

Вызов переменной метода из другого метода
class A(): def m(self): number = x #переменный параметр - номер заявки,...


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

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

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