2015-06-03 2 views
1

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

if Sender = reduceOrderBTN then 
begin 
J:=1; 
reduceOrderBTN.Caption:= 'Show all'; 
qryReduceOrders.Close; 
qryReduceOrders.Open; 
end; 

advOrderGrid.RowCount:= qryReduceOrders.RecordCount + 1; 

while NOT qryReduceOrders.Eof do 
begin 

advOrderGrid.Cells[0, qryReduceOrders.RecNo] := IntToStr(qryReduceOrders.RecNo); 
advOrderGrid.Cells[1, qryReduceOrders.RecNo] := qryReduceOrdersProductName.AsString; 
advOrderGrid.Cells[2, qryReduceOrders.RecNo] := qryReduceOrdersSpecialWish.AsString; 
advOrderGrid.Cells[3, qryReduceOrders.RecNo] := qryReduceOrdersQuantity.AsString; 
advOrderGrid.Cells[4, qryReduceOrders.RecNo] := qryReduceOrdersprepTime.AsString; 
advOrderGrid.Repaint; 
qryReduceOrders.next; 

end; 
if (Sender = reduceOrderBTN) and (J = 1) then 
formShow(nil); 
//trying to get back to old state but this doesnt work 
end; 
+2

Возьмем [действие] (http://docwiki.embarcadero.com/RADStudio/XE8/en/What_Is_an_Action) и флаг, содержащий состояние, в котором находится сетка. В этом обработчике событий выполнения действия запрашивают этот флаг и действуют соответствующим образом. Затем переведите флаг в другое состояние. – TLama

+2

Вот и все. Вам нужно понятие ** state **. –

+1

@Juuri Вы приняли ответ, предполагающий, что вы используете 'Tag'. Это будет работать, но с точки зрения разработки программного обеспечения это ужасная идея. Вы можете делать все, что захотите, но я вынужден сообщить вам, что использование «тега» таким образом - очень плохая практика. –

ответ

1

Вы можете просто использовать свойство тега кнопки для отслеживания состояния.

If reduceOrderBTN.tag = 0 then begin 
    // Sum orders code here 
    reduceOrderBTN.tag := 1; 
end 
else begin 
    // Set Previous state code here 
    reduceOrderBTN.tag := 0; 
end; 
+3

Ну, вы могли бы, но это вряд ли рекомендуется. Имя 'Tag' не является информативным. Используйте частный член данных класса и дайте ему разумное имя. –

+0

Это взлом, который может быть приемлемым в программах с выбросом, но в противном случае вы просто просите о неприятностях. –

+1

По крайней мере, вы можете использовать константу вместо цифр для более подробного уточнения. – user3197381

5

Возможно, наиболее читаемым способом является создание двух процедур TNotifyEvent.

procedure TMyForm.OnClickNormal(Sender: TObject); 
begin 
    DoNormalAction; 
    MyButton.Caption := 'Reverse Action'; 
    MyButton.OnClick := OnClickReverse; 
end; 

procedure TMyForm.OnClickReverse(Sender: TObject); 
begin 
    DoReverseAction; 
    MyButton.Caption := 'Normal Action'; 
    MyButton.OnClick := OnClickNormal; 
end; 

Затем вы устанавливаете действие по умолчанию и подпись в редакторе проекта.

+0

Я не знаю, является ли это наиболее читаемым, но, конечно, более правильным. –

+0

@ LeonardoHerrera: Я не думаю, что это более или менее правильно. Это просто альтернатива, которая может быть более подходящей в некоторых случаях, а в других - менее. Несмотря на то, что в другом ответе используется свойство, которое может быть неприемлемым для маркировки, это не отменяет или уменьшает идею, которую он предлагает. –

Смежные вопросы