![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите организовать проверку [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 и работать с ней