![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() К сожалению поиском не нашел ничего дельного.
Делаю проект под .NET Нужно чтобы программа рассчитывала некоторые значения, заносила их в массив и по этому массиву строила график. написал так: Код HTML:
В форме по нажатию на кнопку процедура calculate делает расчет и формирует массив данных. Другая процедура--ris_graf для события Paint содержит код для рисования графика. Вопрос: Как из процедуры calculate вызвать процедуру ris_graf и при этом передать ей массив данных (и еще парочку значений)? Т.е. чтобы при нажатии на кнопку "calculate" строился график. Или тут нужно реализовывать как-то по другому? Может быть рисовать график в новом окне? но вопрос остается неизменным: как передать данные между процедурами и вызвать процедуру рисования графика? Последний раз редактировалось lifant, 18.03.2010 в 22:31. |
#2
|
||||
|
||||
![]() массив и другие сделать полями формы и после расчета вызвать перерисовку - для VCL это Refresh или Update.
|
#3
|
|||
|
|||
![]() а можно пример?
|
#4
|
||||
|
||||
![]() В ДотНете пишу в СиШарп, на делфи в VCL, но должно быть похоже
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } myGrafArr: array of integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SetLength(myGrafArr, 10); // заполняем Form1.Invalidate(); end; procedure TForm1.FormPaint(Sender: TObject); begin // очищаем график if Length(myGrafArr) > 0 then begin // чтото делаем end; end; end. |
#5
|
||||
|
||||
![]() ПРИМЕЧАНИЕ: Насколько я знаю OnClick и OnPaint выполняются в одном потоке - значит можно не бояться, что отрисуется в процессе вычислений.
|
#6
|
|||
|
|||
![]() Цитата:
Только теперь компилятор выдает ошибку: "First chance exception at @($3,$60005F4,$EE). Exception class System.OverflowException with message 'Arithmetic operation resulted in an overflow.'. Process Tpole.exe (944)" и выделяет последнюю строку со словом "end." в основном файле проекта, тот который начинается со слова program Это как понимать? Последний раз редактировалось lifant, 22.03.2010 в 23:52. |
#7
|
|||
|
|||
![]() Ну, подозреваю, что в процессе вычисления его, вычисления, результат превысил максимально допустимое значение для указанного типа данных. Например, ты попытался запихнуть в переменную типа byte значение больше 255.
|
#8
|
|||
|
|||
![]() Методом исключения я выяснил из-за чего возникает эта ошибка. Там в процедуре рисования графика получается деление на ноль и еще кое-какие косяки, а все из-за того, что не вызывается процедура рисования графика из процедуры OnClick, поэтому туда (в процедуру рисования) попадают еще пока не расчитаные данные--все нули ( проверку на заполненность массива я пока пропустил). Т.е. Form1.Invalidate(); не работает.
Подскажите еще какой-нибудь метод кроме Invalidate пожалуйста. Show и Refresh тоже не помогают. PS. Где можно взять справочник по объектам для программировани на Delphi под .NET ? |
#9
|
||||
|
||||
![]() Работают.
Только событие OnPaint вызывается не только ними. Как только форма начинает появлятся на экране, начинается ее рисование и соответственно вызывается событие OnPaint. Также оно будет вызываться при изменении размеров, если ее часть заслоняла другая форма и небыло буферизации и т.д. Можно сообщить системе программно ( Invalidate() Refresh ... ), что требуется перерисовка. и система опять вызовит OnPaint. Попробуй убрать рисование графика в отдельный метод и вызывать при необходимости. Введи приватное поле типа Boolean и выставляй его после расчета - тогда проверять будет легче. По поводу литературы. Когда то скачивал А.Я.Архангельский - Delphi 2006. Но потом перешел на C# идеология языка практически такая же, только синтаксис другой. Вот несколько книжек книга Delphi .Net |
#10
|
|||
|
|||
![]() Что-то у меня мозг уже совсем в узел завязался.
Попытаюсь упростить все. Исходные данные такие же: есть процедура OnClick1 для вычисления и процедура OnPaint рисования на форме. Делаю еще одну кнопку--для нее процедура OnClick2, в которой должна быть одна строка (ну или не одна), вызывающая процедуру OnPaint или перерисовку другими способами (тогда, как я понимаю, процедура OnPaint запустится автоматически... правильно?) Что в этой строке должно быть написано? Если тупо вызвать процедуру таким образом: Код:
Имя_Класса.Имя_Процедуры_OnPaint(параметр1, параметр2); //например, в моем случае TWinForm.ris_graf(параметр1, параметр2); то что нужно писать в качестве "параметр1" и "параметр2" ? PS а кстати, форма может иметь две и более процедур OnPaint ? |
#11
|
||||
|
||||
![]() Похоже я тоже уже не совсем понимаю, что тебе нужно.
Попробуй так. Кроме процедур обработки событий можно еще и свои писать. Например пишешь Код:
private { Private declarations } myGrafArr: array of integer; procedure PaintMyGraf(); Должна создаться заготовка Код:
WinFopm.PaintMyGraf(); begin end; Код:
PaintMyGraf(); Цитата:
|
#12
|
|||
|
|||
![]() Цитата:
Цитата:
Заготовка описания процедуры OnPaint выглядит так Код:
procedure ris_graf(sender: System.Object; e: System.Windows.Forms.PaintEventArgs); begin end; И можно ли где-то подсмотреть как вызывается эта процедура при первом загрузке формы? или это происходит как-то автоматически? |
#14
|
|||
|
|||
![]() Получилось!
Через пару недель вернулся к своему вопросу. Сделал новый проект с пустой формой. Набросал простейший пример с invalidate -- все заработало. Вставил туда свои куски кода и случилось чудо ![]() В общем у меня где-то грабли были зарыты, но я их так и не нашел... |