Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1129875112
Ega23
2005-10-21 10:11
2005.11.13
Как вы только живёте в Москве???


2-1129617492
TruthMan
2005-10-18 10:38
2005.11.13
Запись в таблицу через сервер Word


4-1126431827
Edelweis
2005-09-11 13:43
2005.11.13
Изменить права NTFS


2-1129702622
Phoenix
2005-10-19 10:17
2005.11.13
Закрашивание строк в ListView


2-1129772183
UzJack
2005-10-20 05:36
2005.11.13
Проблема с DBGrid.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский