Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];
ВнизAV при Synchronize в модальной форме. Найти похожие ветки
← →
tytus (2008-06-09 17:25) [0]Доброго дня всем.
Показываю одальную форму:MForm:=TMForm.Create(Application);
try
MForm.ShowModal;
finally
FreeAndNil(MForm);
end;
В этой форме создаю поток.
Из потока вызываю Synchronize(UpdateRE);procedure TMyThread.UpdateRE;
begin
with MForm.RE1 do
begin
Lines.Add("какой-то текст");
PostMessage(Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;
end;
Ругается на строкеwith MForm.RE1 do
.
В чем тут дело? Ведь в случае сглавной формой никаких проблем нет.
← →
Поросенок Винни-Пух © (2008-06-09 17:27) [1]в переменной MForm мусор
← →
tytus (2008-06-09 17:31) [2]>Поросенок Винни-Пух © (09.06.08 17:27) [1]
вы имеете ввиду что переменная MForm ниначто не ссылается?
Но в юните потока стоит uses MForm;
← →
Поросенок Винни-Пух © (2008-06-09 17:35) [3]И чего?
← →
Поросенок Винни-Пух © (2008-06-09 17:37) [4]Кроме того, вот этого делать нельзя
procedure TMyThread.UpdateRE;
begin
with MForm.RE1 do
begin
Lines.Add("какой-то текст");
← →
tytus (2008-06-09 17:38) [5]>Поросенок Винни-Пух © (09.06.08 17:35) [3]
а то, что с Главной формой приложения метод потока Synchronize работает нормально, а с модальной - нет!
Поясните, что значит в переменной MForm мусор
← →
tytus (2008-06-09 17:39) [6]>Поросенок Винни-Пух © (09.06.08 17:37) [4]
тысчю раз делал - работает атлична.
← →
Поросенок Винни-Пух © (2008-06-09 17:39) [7]это значит в ней нет валидной ссылки на экземпляр класса формы
← →
Поросенок Винни-Пух © (2008-06-09 17:40) [8]тысчю раз делал - работает атлична.
Я просто не обратил внимание что там вызов идет через syncronize
остается версия с мусором.
← →
Loginov Dmitry © (2008-06-09 17:46) [9]> В этой форме создаю поток.
> Из потока вызываю Synchronize(UpdateRE);
В какой момент создается поток? Если по OnCreate модальной формы, то в этом момент MForm не определено (особенно высока вероятность AV, если после создания треда происходит длительная задержка). Еще - откуда вызывается Synchronize(UpdateRE)?
← →
tytus (2008-06-09 17:46) [10]>Поросенок Винни-Пух © (09.06.08 17:39) [7]
дак мне что - передавать ссылку в поток?
{TMyThread}private
FForm:TObject;
public
constructor Create(AForm: TObject);
...
constructor TMyThread.Create(AForm: TObject);
begin
FForm:=AForm;
end;
procedure TMyThread.UpdateRE;
begin
with TMForm(FForm).RE1 do
begin
Lines.Add("какой-то текст");
PostMessage(Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;
end;
счаз так попробую... а как по-другому?
← →
tytus (2008-06-09 17:50) [11]>Loginov Dmitry © (09.06.08 17:46) [9]
поток создается в модальной форме при клике на кнопке.
откуда вызывается Synchronize(UpdateRE)? - я думаю большой разницы в этом нет. Что из метода Execute потока, что из какой-нибудь другой процедуры потока - все равно работает. Делал много раз, но только с главной фомой.
← →
Поросенок Винни-Пух © (2008-06-09 17:52) [12]чудес-то не бывает.
главная или заглавная форма, ав он и в африке ав.
← →
tytus (2008-06-09 17:57) [13]>Поросенок Винни-Пух © (09.06.08 17:52) [12]
однако чудеса случаются.
Делал я сей поток с главной формой (для тестирования). Все работает отлично.
Перенес код потока в другое приложение, с модальной формой (думал - какая разница где поток вызывать?) - и вот вам - AV!
← →
Поросенок Винни-Пух © (2008-06-09 17:59) [14]чудес не бывает.
← →
tytus (2008-06-09 18:01) [15]>tytus (09.06.08 17:46) [10]
заработало!
Всем спасибо!
← →
Тын-Дын © (2008-06-09 20:21) [16]Ссылку на форму-то зачем передавать?
Разве не достаточно ссылки на Re1?
← →
Loginov Dmitry © (2008-06-09 20:33) [17]> однако чудеса случаются.
случаются. Раз в 100 лет.
Но уж точно не в этом случае ))
← →
Anatoly Podgoretsky © (2008-06-09 21:09) [18]> Loginov Dmitry (09.06.2008 20:33:17) [17]
Но в этом случае чудо сработало.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c