2013-10-24 2 views
-2

У меня проблема. Когда я нажимаю на кнопки, используемые интерфейсом работает правильно, я хочу сделать эту работу автоматически, используя xxx.click, но она не работает должным образом. В чем разница между?Есть ли разница между написанием «button.click» в коде и нажатием кнопки в Delphi?

if pos(hexFileVersion, currentFWVersion) = 0 then 
begin 
    Memo1.Lines.Add('Versions are different from each other, updating...'); 
    btnReset.Click; 
    sleep(500); 
    btnCaptureTarget.Click; 
    sleep(500); 
    BProgram.Click; 
    sleep(200); 
    BResetLIA.Click; 
end; 
+5

между ... ** и ** ...? –

+1

Невозможно сказать. Метод Click работает нормально. Вы не сказали, что пошло не так, что вы ожидаете и т. Д. Эти сны кажутся фиктивными. –

+0

между написанием «xxx.click» и одним нажатием кнопки ... – Muammer

ответ

0

Непонятно, что «не работает должным образом» в вашем случае.

btnReset.Click вызывает OnClick() или OnExecute(), если с этой кнопкой связано действие.

Но когда вы нажимаете мышь, то, например, также могут быть установлены onMouseDown и OnMouseUp, если они назначены.

procedure TControl.Click; 
begin 
    { Call OnClick if assigned and not equal to associated action's OnExecute. 
    If associated action's OnExecute assigned then call it, otherwise, call 
    OnClick. } 
    if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then 
    FOnClick(Self) 
    else if not (csDesigning in ComponentState) and (ActionLink <> nil) then 
    ActionLink.Execute(Self) 
    else if Assigned(FOnClick) then 
    FOnClick(Self); 
end; 

Также попробуйте вставить Application.ProcessMessages; после каждого .Click

btnReset.Click; 
Application.ProcessMessages; 

sleep(500); 

btnCaptureTarget.Click; 
Application.ProcessMessages; 

sleep(500); 

BProgram.Click; 
Application.ProcessMessages; 

sleep(200); 

BResetLIA.Click; 
+5

-1 для 'Application.ProcessMessages' –

+0

Но этот ответ содержит в себе множество хороших частей, таких как точка, сделанная о' OnMouseDown' и 'OnMouseUp'. –

+2

ProcessMessages делает этот метод вероятным реентерабельным. Особенно с фиктивным сном. –

7

Если у вас есть код в клике обработчике, который должен быть вызван в другом месте, то правильный подход был бы реорганизовать эту работу на отдельные методы. Программные нажатия кнопок в качестве средства для запуска обработчиков событий в качестве средства для выполнения кода - это просто плохая практика. Как отмечали другие, метод в вашем вопросе должен работать эквивалентно, но это стиль программирования, которого следует действительно избегать.

Например, если у вас есть:

procedure TForm1.btnResetClick(Sender: TObject); 
begin 
    // 
    // here some actions are taken 
    // 
    // 
end; 

вы можете реорганизовать в:

procedure TForm1.DoReset; 
begin 
    // 
    // here some actions are taken 
    // 
    // 
end; 

procedure TForm1.btnResetClick(Sender: TObject); 
begin 
    DoReset; 
end; 

таким образом, если вам нужно DoReset вне контекста обработчика щелчка вы можете просто написать:

if pos(hexFileVersion, currentFWVersion) = 0 then begin 
    Memo1.Lines.Add('Versions are different from each other, updating...'); 
    DoReset;  
    DoCaptureTarget;  
    DoBProgram; 
    DoBResetLIA;  
end; 

Обработчики событий пользовательского интерфейса, как правило, должны быть очень легкий - у них должен быть как можно меньше кода. Если бизнес-логика начинает проникать в них, это должно быть сильным признаком того, что вам нужно их убрать.

+0

Одной из важных причин, по которым перемещать логику обработчика в отдельные функции/классы, является модульное тестирование. Вы можете протестировать свою графическую логику без фактического использования GUI ... – whosrdaddy

+0

Хмм, я попробую. Спасибо. – Muammer