Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите организовать проверку [D7, XP]


rodionov_uv ©   (2011-03-10 23:21:00) 

имеем динамически созданные компоненты Edit с событиями OnEnter и OnExit и открытый документ Word или Exel в котором идёт поиск.
Надо организовать проверку при смене фокуса компонентов Edit на наличие открытого окна word или exel.
Делаю так, но вылетает с ошибкой при удалении компоннента с которого уходит фокус


procedure TMyForm.NewOnExit(Sender: TObject);//событие OnExit
begin
 if MyForm.Visible = True then
 proverkaPrint;
end;

procedure TMyForm.NewOnClick(Sender: TObject);//событие OnEnter
begin
  if MyForm.Visible = True then
 begin
 W.ActiveDocument.Range(0, 0).Select;
 W.Selection.Find.Execute(ReadList.Strings[ActiveControl.TabOrder]);
 end;
end;

procedure TMyForm.ProverkaPrint;
var
win:HWND;
begin
 win := FindWindow(nil,PChar(a));
 if win = 0 then
 begin
   ShowMessage(' Вы по ошибке закрыли приложение' + b +#13 + 'откройте документ заново и продолжите поиск');
   ExitDok;
   Abort;
 end;
end;

procedure TMyForm.ExitDok;
var
q:integer;
begin
 for q := 0 to EditList.Count-1 do
 begin
   TLabeledEdit(FindComponent(EditList.Strings[q])).Free;
 end;
.......................................................//далее идут обнуление переменных


sniknik   (2011-03-11 07:52:00) [1]

все проверки и удаления после, в событии формы... а посылаемое событие тогда будет не "удаление комтонента", а "удаление всего "не нужного"".


KilkennyCat   (2011-03-11 02:46:00) [2]

тебе же предложили сделать панель парентом для всех.
получил сендер? определи парента для сендера и удаляй его.
либо пиши дополнительный код: если сендер одного из таких компонентов то удалить еще и такой и такой и такой и т.д.


rodionov_uv   (2011-03-11 02:34:00) [3]

а мне надо чтобы удалил сразу все, если окно в котором идёт поиск случайно закрыто


rodionov_uv   (2011-03-11 02:32:00) [4]

а, если делаю так

procedure TMyForm.NewOnExit(Sender: TObject);
var
win:HWND;
begin
win := FindWindow(nil,PChar(a));
if win = 0 then
begin
  ShowMessage(' Вы по ошибке закрыли приложение' + b +#13 + 'откройте документ заново и продолжите поиск');
  PostMessage(Handle, WM_DEL_CMP, Integer(Sender), 0);
end;
end;

procedure TMyForm.NewOnClick(Sender: TObject);//событие OnEnter
var
win:HWND;
begin
 if MyForm.Visible = True then
 begin
   win := FindWindow(nil,PChar(a));
   if win <> 0 then
   begin
      W.ActiveDocument.Range(0, 0).Select;
      W.Selection.Find.Execute(ReadList.Strings[ActiveControl.TabOrder]);
   end;
 end;  
end;


то удаляет по одному компоненту


rodionov_uv   (2011-03-11 02:13:00) [5]

если делаю как писал sniknik ©
> и никаких проверок.

удаляет компонент даже если есть окно worda

если делаю так

procedure TMyForm.NewOnExit(Sender: TObject);
var
win:HWND;
begin
 win := FindWindow(nil,PChar(a));
 if win = 0 then
 begin
   ShowMessage(' Вы по ошибке закрыли приложение' + b +#13 + 'откройте документ заново и продолжите поиск');
   PostMessage(Handle, WM_DEL_CMP, Integer(Sender), 0);
 end;
end;

procedure TMyForm.NewOnClick(Sender: TObject);//событие OnEnter
begin
 if MyForm.Visible = True then
begin
W.ActiveDocument.Range(0, 0).Select;// Здесь ошибка
W.Selection.Find.Execute(ReadList.Strings[ActiveControl.TabOrder]);
end;
end;


или я чего не так делаю


rodionov_uv   (2011-03-11 01:09:00) [6]

спасибо буду разбираться


картман   (2011-03-11 01:07:00) [7]


> а с этого момента можно поподробней


http://lib.rus.ec/b/239298/read#t23


rodionov_uv   (2011-03-11 01:02:00) [8]

пока писал уже и пример дали


rodionov_uv   (2011-03-11 01:01:00) [9]

а с этого момента можно поподробней и желательно с примером


sniknik   (2011-03-11 00:54:00) [10]

блин, Comp onent конечно же... ;(


sniknik   (2011-03-11 00:52:00) [11]

вот так, типа
const
 WM_DEL_CMP = WM_USER + 101;

type
 TForm1 = class(TForm)
   ...
 private
   procedure DeleteCompanent(var Msg: TMessage); message WM_DEL_CMP;
 end;

procedure TForm1.DeleteCompanent(var Msg: TMessage);
begin
 TObject(Msg.WParam).Free;
end;

procedure TForm1.EditEnter(Sender: TObject);
begin
 with TEdit(Sender) do Text:= Name;
end;

procedure TForm1.EditExit(Sender: TObject);
begin
 with TEdit(Sender) do begin
   onEnter:= nil;
   onExit := nil;
 end;
 PostMessage(Handle, WM_DEL_CMP, Integer(Sender), 0);
end;


и никаких проверок.


Германн   (2011-03-11 00:49:00) [12]


> а на форме куда повесить
>

На WM_USER +101


rodionov_uv   (2011-03-11 00:43:00) [13]

а на форме куда повесить


sniknik   (2011-03-11 00:40:00) [14]

удаляй в событии формы, а вот событие посылай из обработчика компонента.


rodionov_uv   (2011-03-11 00:23:00) [15]

сама процедура


procedure TMyForm.ExitDok;
var
q:integer;
begin
for q := 0 to EditList.Count-1 do
begin
  TLabeledEdit(FindComponent(EditList.Strings[q])).Free;
end;
.......................................................//далее идут обнуление переменных


работает я её вызываю несколько раз, а вот в этом случае не хочет


rodionov_uv   (2011-03-11 00:23:00) [16]

сама процедура


procedure TMyForm.ExitDok;
var
q:integer;
begin
for q := 0 to EditList.Count-1 do
begin
  TLabeledEdit(FindComponent(EditList.Strings[q])).Free;
end;
.......................................................//далее идут обнуление переменных


работает я её вызываю несколько раз, а вот в этом случае не хочет


KilkennyCat   (2011-03-11 00:09:00) [17]

удалять также? только еще глубже? родителя?


rodionov_uv   (2011-03-10 23:59:00) [18]

попробовал при создании закидывать Editы сразу на панель, а при проверке сразу её удалять всё равно ошибка


clickmaker   (2011-03-10 23:29:00) [19]

> при удалении компоннента с которого уходит фокус

удалять компоненты из их же собственных обработчиков вообще чревато.
Да и зачем так сложно, в цикле? Можно же их сгруппировать на Panel или Frame и работать с ней


Наверх

Титульная страница Поиск, карта сайта Написать письмо