![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как получить доступ из одного объекта к элементам др. объекта [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]Надо передать в поток указатель на необходимую форму.