Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];
Внизпомогите организовать проверку Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c