![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 -- все заработало. Вставил туда свои куски кода и случилось чудо )В общем у меня где-то грабли были зарыты, но я их так и не нашел... |