Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.19;
Скачать: CL | DM;

Вниз

помогите организовать проверку   Найти похожие ветки 

 
rodionov_uv   (2011-03-10 23:21) [0]

имеем динамически созданные компоненты 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;
.......................................................//далее идут обнуление переменных


 
clickmaker ©   (2011-03-10 23:29) [1]

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

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


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

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


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

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


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

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


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) [5]

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


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 00:40) [6]

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


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

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


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


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

На WM_USER +101


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

вот так, типа
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;


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


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

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


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

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


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

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


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


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


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


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

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


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

если делаю как писал 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 02:32) [16]

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

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:34) [17]

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


 
KilkennyCat ©   (2011-03-11 02:46) [18]

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


 
sniknik ©   (2011-03-11 07:52) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2011.06.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
11-1212932481
Psy
2008-06-08 17:41
2011.06.19
Баг Grush


2-1299926254
Сергей
2011-03-12 13:37
2011.06.19
Проблемы с запуском программы


2-1300038548
Тони
2011-03-13 20:49
2011.06.19
Firebird


15-1298803240
Дмитрий С
2011-02-27 13:40
2011.06.19
Помощь по дизайну


15-1298958622
Гость
2011-03-01 08:50
2011.06.19
Как саботировать работы?