سلام.
آقای عشایری ببخشیدا فکر میکنم if های مثالتون تکراری هستن و از نظر منطقی بعضیاشون هیچ موقع اجرا نمیشن ولی فرض میگیریم تکراری نباشه ، اگه من باشم به دو روش زیر این کار رو تو دلفی انجام می دم (مثال خودتون با اندکی تغییر تو حالت های ممکن) :
var
bi1, bi2, bj1, bj2, bj3, bj4, ed_txt_hello : Boolean;
s : string;
begin
s := cboMainAct.Text;
bi1 := s = 'test 1';
bi1 := s = 'test 2';
if bi1 then
begin
s := cboSubAct;
bj1 := s = 'test 1-d';
bj2 := s = 'test 1-2';
bj3 := s = 'test 2-d';
bj4 := s = 'test 2-2';
ed_txt_hello := edt1.text = 'hello';
if ed_txt_hello then
begin
if (bj1) then
;
if (bj2) then
;
if (bj3) then
;
if (bj4) then
;
end else begin
if (bj1) then
;
if (bj2) then
;
if (bj3) then
;
if (bj4) then
;
end;
end;
if bi2 then
begin
end else begin
end;
end;
توضیح اینکه شرط هایی که دو حالت بیشتر ندارن در اولویت قرار می دم بعد تو بلاک های بعدی شرط هایی که حالت های بیشتری دارن. و اینکه برای تغییر شرایط if ها کافیه تو یک جا در ابتدا اون رو تغییر بدین و لازم نیست تو کل کد دنبالش بگردین.
و یا با cese .. of :
const
CBO_MAIN_1 = 1; // cboMainAct.Text = 'test 1'
CBO_MAIN_2 = 1 shl 1; // cboMainAct.Text = 'test 2';
CBO_SUB_1 = 1 shl 2; // cboSubAct = 'test 1-d'
CBO_SUB_2 = 1 shl 3; // ??????
CBO_SUB_3 = 1 shl 4; // ?????
CBO_SUB_4 = 1 shl 5;
var
ui64 : UInt64;
begin
ui64 := (CBO_MAIN_1 * UInt64(cboMainAct.Text = 'test 1')) or
(CBO_MAIN_1 * UInt64(cboMainAct.Text = 'test 2')) or
(CBO_SUB_1 * UInt64(cboSubAct = 'test1')) or
(CBO_SUB_2 * UInt64(cboSubAct = 'test2')) or
(CBO_SUB_3 * UInt64(cboSubAct = 'test3')) or
(CBO_SUB_4 * UInt64(cboSubAct = 'test4'));
case ui64 of
CBO_MAIN_1 or CBO_SUB_1 :
begin
end;
CBO_MAIN_1 or CBO_SUB_2 :
begin
end;
CBO_MAIN_1 or CBO_SUB_3 :
begin
end;
CBO_MAIN_1 or CBO_SUB_4 :
begin
end;
CBO_MAIN_2 or CBO_SUB_1 :
begin
end;
CBO_MAIN_2 or CBO_SUB_2 :
begin
end;
CBO_MAIN_2 or CBO_SUB_3 :
begin
end;
CBO_MAIN_2 or CBO_SUB_4 :
begin
end;
end;
end;
خوبی این روش اینه که اگه دو یا چند تا حالت باشن که تو بلاک های متفاوتی هستن ولی دستوری که قراره در صورت درست بودنشون اجرا بشه، یکی هستن، رو می تونم خیلی راحت با هم or کنم. مثلا تو case ... of ای که بالا نوشتم اگه دستور مورد 5 و مورد 8 قراره یکی باشه کافیه اونها رو با هم or کنم.
-------------------------------------------------
و اگه تو C++ باشه شاید از مکرو استفاده کنم.