Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как получить доступ из одного объекта к элементам др. объекта [D6, WinXP]


kivadim ©   (2005-10-20 15:16:00) 

Вроде ничего сложного, но че-то я не догоняю...

Кодом TForm2.Create(self).Show;создается экземляр MDIChild формы, в котором создается объект класса TThread, код которого должен постоянно приращать значение Position компонента TProgressBar в этой MDIChild форме.

Как в объекте TThread обратиться к объектам MDIChild формы (в частности к объекту TProgressBar), если одновременно могут быть созданны несколько таких форм, каждая соответственно со своим потоком?


kivadim   (2005-10-20 18:11:00) [1]

Игорь Шевченко и Плохиш спасибо вам большое за выдержку и помощь.

p.s. Кстати ...Create(Self); я писал, но тогда объявление было
constructor TMyThread.Create(SForm: TForm); а не
constructor TMyThread.Create(SForm: TForm2)


Игорь Шевченко   (2005-10-20 17:56:00) [2]


> procedure TForm2.Button1Click(Sender: TObject);
> begin
> MyThread.Create(TButton(Sender).Parent as TForm2);
> end;


procedure TForm2.Button1Click(Sender: TObject);
begin
 TMyThread.Create(Self);
end;


> Вопрос почему?


Потому что Form2 равно nil


kivadim   (2005-10-20 17:52:00) [3]

упс конечно же TMyThread.Create...


kivadim   (2005-10-20 17:49:00) [4]

> Игорь Шевченко ©   (20.10.05 17:34) [13]
да Form2 и есть конкретный экземпляр.

ради проверки взял написал следуюющее:

procedure TForm2.Button1Click(Sender: TObject);
begin
MyThread.Create(TForm2);
end;

Таже ошибка на строке S_Form.ProgressBar1.Position := position;

А вот так заработало

procedure TForm2.Button1Click(Sender: TObject);
begin
MyThread.Create(TButton(Sender).Parent as TForm2);
end;


Вопрос почему?


Игорь Шевченко   (2005-10-20 17:43:00) [5]

Плохиш ©   (20.10.05 17:38) [14]


> С учётом [0] переменная Form2 у автора не используется :
> -)


Об чем автору собственно и толкуют :)


Плохиш   (2005-10-20 17:38:00) [6]


> Игорь Шевченко ©   (20.10.05 17:34) [13]

С учётом [0] переменная Form2 у автора не используется :-)


Игорь Шевченко   (2005-10-20 17:34:00) [7]


> Надо указьвать не абстрактную Form2, а конкретный указатель
> на экземпляр формы TForm2


Судя по всему, Form2 и есть указатель на конкретный экземпляр. Только он почему-то равен nil :)


Плохиш   (2005-10-20 17:09:00) [8]


> kivadim   (20.10.05 17:05) [10]
> Следовательно код  S_Form := SForm; в конструкторе не корректен,
>  а как тогда?

Этот-то как раз корректен.
А вот здесь

> MyThread := TMyThread.Create( Form2);

Надо указьвать не абстрактную Form2, а конкретный указатель на экземпляр формы TForm2.


Игорь Шевченко   (2005-10-20 17:07:00) [9]

kivadim   (20.10.05 17:05) [10]

В конструктор надо передавать ненулевое значение, очевидно ?


kivadim   (2005-10-20 17:05:00) [10]

Следовательно код  S_Form := SForm; в конструкторе не корректен, а как тогда?


Игорь Шевченко   (2005-10-20 17:02:00) [11]

kivadim   (20.10.05 17:00) [8]


> Что не так?


S_Form равно nil


kivadim   (2005-10-20 17:00:00) [12]

поставил TForm2 в объвлении конструктора потока и я так понял S_Form тоже объявил как TForm2. Скомпилировалось, но в потоке на строке
S_Form.ProgressBar1.Position := position;
выдается ошибка:

Project Reports.exe raised exception class EAccessViolation with message 'Access violation at address 0052D337 in module 'Reports.exe'. Read of address 00000328'. Process stopped. Use Step or Run to continue.


Что не так?


Игорь Шевченко   (2005-10-20 16:14:00) [13]


> constructor TMyThread.Create(SForm: TForm);


А ты поставь не TForm, а конкретный класс (судя по всему TForm2)


clickmaker   (2005-10-20 16:13:00) [14]


> kivadim   (20.10.05 16:01) [5]

а у класса TForm есть ProgressBar1?


kivadim   (2005-10-20 16:01:00) [15]

в чем проблема пока не пойму.
Передаю этот указатель в конструктор потока.
пробовал так MyThread := TMyThread.Create(Form2);

а в самом потоке так:

constructor TMyThread.Create(SForm: TForm);
begin
 inherited Create(true);
//объявленно как public S_Form : TForm;
 S_Form := SForm;  
 Priority := tpLower;
 Resume;
end;

procedure TMyThread.ShowProgress;
begin
S_Form.ProgressBar1.Position := position; //здесь ругается что не определен
                                                        //ProgressBar1
end;

procedure TMyThread.Execute;
begin
position:=0;
//Опред действия
Synchronize(ShowProgress);
end;


Плохиш   (2005-10-20 15:39:00) [16]


> Так что пока не знаю как именно его передать и главное как
> его разъименовать уже в потоке.

Сколько умных слов не к месту.

myForm: TMyMDIForm;

в чём проблема-то?


clickmaker   (2005-10-20 15:38:00) [17]


> что пока не знаю как именно его передать и главное как его
> разъименовать уже в потоке

ты ниче не путаешь? разыменование - это в сях.
А здесь просто

procedure Proc(F: TForm);
begin
 F.Caption := 'AAA';
end;

Proc(Application.MainForm);


kivadim   (2005-10-20 15:35:00) [18]

>>Плохиш ©   (20.10.05 15:27) [1]
Да я так и думал, но с указателями я не дружу. Так что пока не знаю как именно его передать и главное как его разъименовать уже в потоке.
Если  не сложно чиркни пример.


Плохиш   (2005-10-20 15:27:00) [19]

Надо передать в поток указатель на необходимую форму.


Наверх

Титульная страница Поиск, карта сайта Написать письмо