Форум: "Основная";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
ВнизПоток&Mdi Найти похожие ветки
← →
hooky-mars (2002-05-10 19:19) [0]Saluer!
Уменя есть програ мостроеная на MDI. Порожденая форма создаёт поток. Это поток помимо его действий должен обращаться к тому окну, которое его порадило, но вот задача как это сделать?!
Создаю поток так:
....
uses...,Unit3:
...
private
{ Private declarations }
Sin:TSintaks;
...
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if p then
begin
sin.Terminate;
sin.Free;
end;
Action:=caFree;
end;
procedure TForm2.RichEdit1Change(Sender: TObject);
begin
sin:=TSintaks.Create(true);
sin.Resume;
sin.Priority:=tpLower;
p:=true;
end;
Поток должен творить так
...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls;
type
TSintaks = class(TThread)
private
{ Private declarations }
procedure Sintaks;
protected
procedure Execute; override;
end;
implementation
uses Unit2;
procedure TSintaks.Execute;
var
p:Pointer;
s,s1:String;
begin
s:=Form2.RichEdit1.Lines.Text;
p:=@S;
s1:=String(p^);
application.MessageBox(PChar(s1),"ss",MB_OK)
end;
Вот эта строчка: Form2.RichEdit1.Lines.Text;
неправильна т.к. за частую она не туда обращается.
Помагите!
← →
hooky-mars (2002-05-10 22:03) [1]Ну так что? Никто незнает?!
← →
MBo (2002-05-11 14:44) [2]слово Synchronize тебе ни о чем не говорит?
статью Кариха хоть почитай
← →
Cobalt (2002-05-11 15:16) [3]Присоединяюсь к MBo © (11.05.02 14:44)
Еще добавь следующее, потому что у тебя может создасться несколько потоков
sin:=TSintaks.Create(true);
sin.FreeOnTerminate:=true;
sin.Resume;
> s,s1:String;
> begin
> s:=Form2.RichEdit1.Lines.Text;
> p:=@S;
> s1:=String(p^);
> application.MessageBox(PChar(s1),"ss",MB_OK)
И зачем такой изврат? адрес то один и тот же.
← →
hooky-mars (2002-05-11 17:21) [4]
> MBo
Synchronize - это когда поток останавливается и управление передаётся главному потоку, который и произведёт обновление.
Но это же не значит, что поток обратиться к тому же дочернему окну, что его запустило? Или я в чём - то ошибаюсь?
← →
hooky-mars (2002-05-11 17:23) [5]
> И зачем такой изврат? адрес то один и тот же.
А потому что выскакивали ошибки вот я и извращался как мог.
← →
hooky-mars (2002-05-11 17:29) [6]Если я пишу так :
procedure TSintaks.Execute;
begin
Synchronize(Sintaks);
end;
procedure TSintaks.Sintaks;
var
p:Pointer;
s,s1:String;
begin
s:=Form2.RichEdit1.Lines.Text;
p:=@S;
s1:=String(p^);
application.MessageBox(PChar(s1),"ss",MB_OK);
end;
Но читает он не оттуда, как только я создаю другое окошко! Это же MDI.
← →
hooky-mars (2002-05-11 17:30) [7]Это Synchronize ничего не решает!
← →
MBo (2002-05-11 17:38) [8]решает, решает. Не игнорируй.
Заведи поле объекта thread типа tform и передавай в него вызвавшую форму после создания suspended потока, потом resume
← →
Cobalt (2002-05-11 18:02) [9]А что это за форма - Form2? Где она создаётся?
Или нигде, или только в начале(Application.CreateForm(...)), или каждым новым дочерним окном. Разберись.
> MBo © (11.05.02 17:38)
Заведи поле объекта thread типа tform и передавай в него вызвавшую форму после создания suspended потока, потом resume
По моему, лучше в конструкторе передавать ему индекс дочерней формы и из потока обращаться через главную форму к дочерним (Children) по индексу. Надеюсь, что окно послеTForm2.RichEdit1Change
хоть пару сек будет, тогдаSynchronyse
заблокирует основной поток, и успеет сделать свое дело.
← →
hooky-mars (2002-05-11 18:04) [10]Мне тут строчичку присоветовали
> sin.FreeOnTerminate:=true;
Только она недаёт созданный поток прикончить.
> MBo © (11.05.02 17:38)
> решает, решает. Не игнорируй.
>
> Заведи поле объекта thread типа tform и передавай в него
> вызвавшую форму после создания suspended потока, потом resume
Можно по подробнее? Я еще учусь."передавай в него
> вызвавшую форму " - это как?
← →
hooky-mars (2002-05-11 18:08) [11]
> Cobalt © (11.05.02 18:02)
> А что это за форма - Form2? Где она создаётся?
> Или нигде, или только в начале(Application.CreateForm(...)),
> или каждым новым дочерним окном. Разберись.
Form1.FormStyle:=fsMDIForm;
Form2.FormStyle:=fsMDIChild;
Из Form1 я могу создавать сколько мне надо Form2. Каждая форма может создавать поток, а дельше вы знаете.
← →
hooky-mars (2002-05-16 18:00) [12]
> По моему, лучше в конструкторе передавать ему индекс дочерней
> формы и из потока обращаться через главную форму к дочерним
> (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change
> хоть пару сек будет, тогда Synchronyse заблокирует основной
> поток, и успеет сделать свое дело.
Как с этими индексами работать?
← →
hooky-mars (2002-05-16 20:58) [13]
> hooky-mars © (16.05.02 18:00)
>
> > По моему, лучше в конструкторе передавать ему индекс дочерней
>
> > формы и из потока обращаться через главную форму к дочерним
>
> > (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change
>
> > хоть пару сек будет, тогда Synchronyse заблокирует основной
>
> > поток, и успеет сделать свое дело.
>
> Как с этими индексами работать?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c