Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие классов (форм,потоков) 
:(
    Опции темы
aldari
  Дата 29.11.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



 Добрый день!

 Задаю вопрос, на который давно не могу найти вопрос и из-за этого до сих пор программировал больше на C++.
 Но есть необходимость иногда программировать на Pascal.

 Как огранизовать взаимодействие двух классов?
 
 У меня есть класс, который полностью реализует функцианальность моей программы
(не обязательно форма).  Встает необходимость иногда использовать вспомагательные классы(вроде форм настройки или фоновых потоков).

 Например.
  
 Есть данные в классе A из модуля A.pas. Передаю в методе-процедуре из A.pas в форму из B.pas,
предварительно объявив B.pas в 
Код

interface uses
 и объявив в classA private переменную classB .

 Как мне изменить эти данные класса A  в процедуре из B.pas(допустим событие на нажатие кнопки) ?  
 
 
 В B.pas объявлять A.pas в uses не получается. Если делаю это в interface части будет взаимная рекурсия 
 при обявлении классов(Pascal однопроходный компилятор, в отличии от С++ компилятора).  
 Если сделаю это в implementation части, то компилятор пожалуется что данные не объявлены.

 До сих пор делал так:
 объявлял и описывал оба класса в одном файле(что не очень хорошо - не удобно) .

Код

unit TestImplementation;
interface
type
TMainType = class(  {........} ) 
 private
  {........}
  Data:integer; 
  {........}
  public
    // здесь создаем TMyThread и передаем в него данные
    procedure Configure; 
    // необходимо вызвать из TMyThread
    MakeSomething(i:integer);
end;

// фоновый поток
TMyThread = class(TThread)
  private
    // ссылка на TMainType
    myReference:TMainType;
    local_data:integer;
  ..
  public
    constructor Create(CreateSuspennded: Boolean; var _myReference: TMainType, i:integer);
 end;

implementation

// запустить фоновые вычисления
procedure TMainType.Configure;
var
 Thread:TMyThread;
begin
    Thread:=TMyThread.Create(false,self,Data);
    if Thread=nil then
      ShowMessage('Error: cannot create thread.')
end;

procedure TMainType.MakeSomething(i:integer);
begin
    {.......}
    Data:=Data+i;
    {.......}
end;

// конструктор потока
constructor TMyThread.Create(CreateSuspennded: Boolean; var _myReference:TMainType, i:integer);
begin
inherited Create(CreateSuspennded);
myReference:=_myReference;
local_data:=i;
end;

// действия потока
procedure TMyThread.Execute;
begin
 {.......}
 myReference.MakeSomething(3);
 {.......}
end;
end.


 Необходимо этот пример разбить на два файла с TMainType и TMyThread
PM MAIL   Вверх
Rennigth
Дата 29.11.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



aldari, увы, но единственный выход, это пересматривать архитертуру чтобы рекурсий небыло.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
aldari
Дата 29.11.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



 Я видел в каком-то дистрибутиве с Паскалем пример взаиодействия двух форм, в текущем отсутствует, назывался TwoForms.  
  Неужели нельзя вызвать метод одной формы из другой и наоборот, из другой формы вызвать метод текущей формы?
  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1165 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.