Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.03.2010, 22:28
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию передать данные между двумя процедурами и запустить одну из другой

К сожалению поиском не нашел ничего дельного.
Делаю проект под .NET
Нужно чтобы программа рассчитывала некоторые значения, заносила их в массив и по этому массиву строила график.
написал так:
Код HTML:
..... procedure TWinForm.ris_graf(sender: System.Object; e: System.Windows.Forms.PaintEventArgs); Begin //процедура рисует график прямо на форме по рассчитанным данным End; procedure TWinForm.calulate(sender: System.Object; e: System.EventArgs); Begin //процедура делает расчет и формирует массив из результатов расчета //и тут должна вызываться процедура ris_graf с передачей ей массива результатов End; .....

В форме по нажатию на кнопку процедура calculate делает расчет и формирует массив данных.
Другая процедура--ris_graf для события Paint содержит код для рисования графика.
Вопрос:
Как из процедуры calculate вызвать процедуру ris_graf и при этом передать ей массив данных (и еще парочку значений)? Т.е. чтобы при нажатии на кнопку "calculate" строился график.
Или тут нужно реализовывать как-то по другому? Может быть рисовать график в новом окне? но вопрос остается неизменным: как передать данные между процедурами и вызвать процедуру рисования графика?

Последний раз редактировалось lifant, 18.03.2010 в 22:31.
Ответить с цитированием
  #2  
Старый 18.03.2010, 22:36
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

массив и другие сделать полями формы и после расчета вызвать перерисовку - для VCL это Refresh или Update.
Ответить с цитированием
  #3  
Старый 19.03.2010, 11:15
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию

а можно пример?
Ответить с цитированием
  #4  
Старый 20.03.2010, 17:38
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

В ДотНете пишу в СиШарп, на делфи в 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  
Старый 20.03.2010, 17:46
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

ПРИМЕЧАНИЕ: Насколько я знаю OnClick и OnPaint выполняются в одном потоке - значит можно не бояться, что отрисуется в процессе вычислений.
Ответить с цитированием
  #6  
Старый 22.03.2010, 23:48
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от s0Creator
В ДотНете пишу в СиШарп, на делфи в 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.
Сделал так, правда что-то на SetLength(myGrafArr, 10); ругается, но я эту строку пока закомментировал и указал размер массива, там где его объявил--в разделе private.
Только теперь компилятор выдает ошибку: "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  
Старый 23.03.2010, 00:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, подозреваю, что в процессе вычисления его, вычисления, результат превысил максимально допустимое значение для указанного типа данных. Например, ты попытался запихнуть в переменную типа byte значение больше 255.
Ответить с цитированием
  #8  
Старый 24.03.2010, 00:02
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию

Методом исключения я выяснил из-за чего возникает эта ошибка. Там в процедуре рисования графика получается деление на ноль и еще кое-какие косяки, а все из-за того, что не вызывается процедура рисования графика из процедуры OnClick, поэтому туда (в процедуру рисования) попадают еще пока не расчитаные данные--все нули ( проверку на заполненность массива я пока пропустил). Т.е. Form1.Invalidate(); не работает.
Подскажите еще какой-нибудь метод кроме Invalidate пожалуйста. Show и Refresh тоже не помогают.

PS. Где можно взять справочник по объектам для программировани на Delphi под .NET ?
Ответить с цитированием
  #9  
Старый 24.03.2010, 08:27
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Работают.
Только событие OnPaint вызывается не только ними.
Как только форма начинает появлятся на экране, начинается ее рисование и соответственно вызывается событие OnPaint. Также оно будет вызываться при изменении размеров, если ее часть заслоняла другая форма и небыло буферизации и т.д.
Можно сообщить системе программно ( Invalidate() Refresh ... ), что требуется перерисовка. и система опять вызовит OnPaint.
Попробуй убрать рисование графика в отдельный метод и вызывать при необходимости.
Введи приватное поле типа Boolean и выставляй его после расчета - тогда проверять будет легче.

По поводу литературы. Когда то скачивал А.Я.Архангельский - Delphi 2006. Но потом перешел на C# идеология языка практически такая же, только синтаксис другой.

Вот несколько книжек книга Delphi .Net
Ответить с цитированием
  #10  
Старый 26.03.2010, 16:55
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию

Что-то у меня мозг уже совсем в узел завязался.
Попытаюсь упростить все.
Исходные данные такие же: есть процедура OnClick1 для вычисления и процедура OnPaint рисования на форме.
Делаю еще одну кнопку--для нее процедура OnClick2, в которой должна быть одна строка (ну или не одна), вызывающая процедуру OnPaint или перерисовку другими способами (тогда, как я понимаю, процедура OnPaint запустится автоматически... правильно?)
Что в этой строке должно быть написано?

Если тупо вызвать процедуру таким образом:

Код:
Имя_Класса.Имя_Процедуры_OnPaint(параметр1, параметр2);
//например, в моем случае TWinForm.ris_graf(параметр1, параметр2);

то что нужно писать в качестве "параметр1" и "параметр2" ?

PS а кстати, форма может иметь две и более процедур OnPaint ?
Ответить с цитированием
  #11  
Старый 27.03.2010, 09:04
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Похоже я тоже уже не совсем понимаю, что тебе нужно.
Попробуй так. Кроме процедур обработки событий можно еще и свои писать. Например пишешь
Код:
  private
 { Private declarations }
 myGrafArr: array of integer;
 procedure PaintMyGraf();
В этой строке нажимаеш "<Ctrl><Shift><C>" или выбираешь что то типа "Complete class at cursor" во всплывающем меню.
Должна создаться заготовка
Код:
WinFopm.PaintMyGraf();
begin

end;
В ней пишешь рисование графика и в любом методе формы вызываешь
Код:
PaintMyGraf();
По поводу
Цитата:
Имя_Класса.Имя_Процедуры_OnPaint(параметр1, параметр2);
Если ты передаваемые параметры не используешь в нутри процедуры, то при вызове можешь передавть nil
Ответить с цитированием
  #12  
Старый 27.03.2010, 10:16
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от s0Creator
Похоже я тоже уже не совсем понимаю, что тебе нужно.
Попробуй так. Кроме процедур обработки событий можно еще и свои писать. Например пишешь
Код:
  private
 { Private declarations }
 myGrafArr: array of integer;
 procedure PaintMyGraf();
В этой строке нажимаеш "<Ctrl><Shift><C>" или выбираешь что то типа "Complete class at cursor" во всплывающем меню.
Должна создаться заготовка
Код:
WinFopm.PaintMyGraf();
begin

end;
В ней пишешь рисование графика и в любом методе формы вызываешь
Код:
PaintMyGraf();
Спасибо. Что-то подобное пробовал. Сейчас еще раз попробую внимательно.


Цитата:
Сообщение от s0Creator
По поводу
Если ты передаваемые параметры не используешь внутри процедуры, то при вызове можешь передавть nil

Заготовка описания процедуры OnPaint выглядит так
Код:
procedure ris_graf(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);
begin

end;
и вопрос в том, что при вызове этой процедуры нужно написать в качестве "sender" и "e" ?
И можно ли где-то подсмотреть как вызывается эта процедура при первом загрузке формы? или это происходит как-то автоматически?
Ответить с цитированием
  #13  
Старый 27.03.2010, 12:08
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

попробуй здесь посмотреть.
К сожалению Delphi с .Net у меня нет поэтому четких примеров на ней не могу привести.
Ответить с цитированием
  #14  
Старый 17.04.2010, 11:48
lifant lifant вне форума
Прохожий
 
Регистрация: 18.03.2010
Сообщения: 13
Репутация: 10
По умолчанию

Получилось!
Через пару недель вернулся к своему вопросу.
Сделал новый проект с пустой формой. Набросал простейший пример с invalidate -- все заработало.
Вставил туда свои куски кода и случилось чудо )

В общем у меня где-то грабли были зарыты, но я их так и не нашел...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025