Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Внизкак получить доступ из одного объекта к элементам др. объекта Найти похожие ветки
← →
kivadim (2005-10-20 15:16) [0]Вроде ничего сложного, но че-то я не догоняю...
КодомTForm2.Create(self).Show;
создается экземляр MDIChild формы, в котором создается объект класса TThread, код которого должен постоянно приращать значение Position компонента TProgressBar в этой MDIChild форме.
Как в объекте TThread обратиться к объектам MDIChild формы (в частности к объекту TProgressBar), если одновременно могут быть созданны несколько таких форм, каждая соответственно со своим потоком?
← →
Плохиш © (2005-10-20 15:27) [1]Надо передать в поток указатель на необходимую форму.
← →
kivadim (2005-10-20 15:35) [2]>>Плохиш © (20.10.05 15:27) [1]
Да я так и думал, но с указателями я не дружу. Так что пока не знаю как именно его передать и главное как его разъименовать уже в потоке.
Если не сложно чиркни пример.
← →
clickmaker © (2005-10-20 15:38) [3]
> что пока не знаю как именно его передать и главное как его
> разъименовать уже в потоке
ты ниче не путаешь? разыменование - это в сях.
А здесь просто
procedure Proc(F: TForm);
begin
F.Caption := "AAA";
end;
Proc(Application.MainForm);
← →
Плохиш © (2005-10-20 15:39) [4]
> Так что пока не знаю как именно его передать и главное как
> его разъименовать уже в потоке.
Сколько умных слов не к месту.
myForm: TMyMDIForm;
в чём проблема-то?
← →
kivadim (2005-10-20 16:01) [5]в чем проблема пока не пойму.
Передаю этот указатель в конструктор потока.
пробовал так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;
← →
clickmaker © (2005-10-20 16:13) [6]
> kivadim (20.10.05 16:01) [5]
а у класса TForm есть ProgressBar1?
← →
Игорь Шевченко © (2005-10-20 16:14) [7]
> constructor TMyThread.Create(SForm: TForm);
А ты поставь не TForm, а конкретный класс (судя по всему TForm2)
← →
kivadim (2005-10-20 17:00) [8]поставил 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 17:02) [9]kivadim (20.10.05 17:00) [8]
> Что не так?
S_Form равно nil
← →
kivadim (2005-10-20 17:05) [10]Следовательно код S_Form := SForm; в конструкторе не корректен, а как тогда?
← →
Игорь Шевченко © (2005-10-20 17:07) [11]kivadim (20.10.05 17:05) [10]
В конструктор надо передавать ненулевое значение, очевидно ?
← →
Плохиш © (2005-10-20 17:09) [12]
> kivadim (20.10.05 17:05) [10]
> Следовательно код S_Form := SForm; в конструкторе не корректен,
> а как тогда?
Этот-то как раз корректен.
А вот здесь
> MyThread := TMyThread.Create(Form2);
Надо указьвать не абстрактную Form2, а конкретный указатель на экземпляр формы TForm2.
← →
Игорь Шевченко © (2005-10-20 17:34) [13]
> Надо указьвать не абстрактную Form2, а конкретный указатель
> на экземпляр формы TForm2
Судя по всему, Form2 и есть указатель на конкретный экземпляр. Только он почему-то равен nil :)
← →
Плохиш © (2005-10-20 17:38) [14]
> Игорь Шевченко © (20.10.05 17:34) [13]
С учётом [0] переменная Form2 у автора не используется :-)
← →
Игорь Шевченко © (2005-10-20 17:43) [15]Плохиш © (20.10.05 17:38) [14]
> С учётом [0] переменная Form2 у автора не используется :
> -)
Об чем автору собственно и толкуют :)
← →
kivadim (2005-10-20 17:49) [16]> Игорь Шевченко © (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;
Вопрос почему?
← →
kivadim (2005-10-20 17:52) [17]упс конечно же TMyThread.Create...
← →
Игорь Шевченко © (2005-10-20 17:56) [18]
> 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 18:11) [19]Игорь Шевченко и Плохиш спасибо вам большое за выдержку и помощь.
p.s. Кстати ...Create(Self); я писал, но тогда объявление было
constructor TMyThread.Create(SForm: TForm); а не
constructor TMyThread.Create(SForm: TForm2)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c