برنامه های قدرت، چند روش برای ساخت ماشین حساب
LowCode گاهی اوقات ساده و قابل تکرار در نظر گرفته می شود. بلوک های ساختمانی کمتری وجود دارد، بنابراین تنها یک راه برای حل یک مشکل وجود دارد. و اگرچه این به نوعی درست است، اما کاملاً درست نیست. 9 بار از 10 مورد، یک راه حل خارج از جعبه وجود خواهد داشت که پیاده سازی آن سریع و آسان است، اما زمان ها و راه هایی برای خلاقیت بیشتر وجود دارد. و این جایی است که بیشتر لذت از آنجا ناشی می شود
یکی از معدود راهحلهای موجود در Power Apps، ماشینحسابها هستند، بنابراین فکر کردم همه راههای مختلفی را که میتوانیم یک ماشینحساب ایجاد کنیم، و چیزهایی که میتوانم یاد بگیرم، بررسی کنم.
بنابراین به چند روش می توانید یک ماشین حساب بسازید، خوب من حداقل 5 راه پیدا کردم:
- دکمه های استاندارد
- آلبوم عکس
- کد
- تایمر
چرتکه 🧮
1. استاندارد
ایده بسیار ساده است، هر عدد و اپراتور جزء دکمه مخصوص به خود است. ما 5 متغیر داریم:#
- vsOne = شماره اول
- vsTwo = عدد دوم (بر روی 99999999999999999999 تنظیم کنید تا بدانیم استفاده نشده است)
- vsCalc = اپراتور
- vsEquals = نمایش نتیجه
- viValue = نتیجه
در یک پوسته مهره، مقدار اول را در vsOne نگه می داریم و در اپراتور اپراتور را ذخیره می کنیم و vsTwo را روی “” تنظیم می کنیم و اعداد بعدی را در آنجا ذخیره می کنیم. سپس روی مساوی از سوئیچ مبتنی بر عملگر برای تکمیل عمل استفاده می کنیم.
دکمه تنظیم مجدد
Set(vsOne,"0");
Set(vsTwo,"99999999999999999999");
Set(vsCalc,"");
Set(vbEquals,false);
Set(viValue,0);
دکمه شماره
If(vsTwo="99999999999999999999",
Set(vsOne,Value(vsOne& Self.Text)&"")
,
Set(vsTwo,Value(vsTwo& Self.Text)&"")
)
دکمه اپراتور (+)
Set(vsCalc,Self.Text);
If(vsTwo="99999999999999999999",
Set(vsTwo,"0");
,
Set(viValue,Value(vsOne) + Value(vsTwo));
Set(vsOne,viValue&"");
Set(vsTwo,"0");
)
دکمه برابر است
Switch(vsCalc,
"+",Set(viValue,Value(vsOne) + Value(vsTwo)),
"-",Set(viValue,Value(vsOne) - Value(vsTwo)),
"*",Set(viValue,Value(vsOne) * Value(vsTwo)),
"https://dev.to/",Set(viValue,Value(vsOne) / Value(vsTwo))
);
Set(vsOne,viValue&"");
Set(vsTwo,"99999999999999999999");
2. گالری
رویکرد گالری شبیه دکمهها است، اما این مزیت را دارد که همه دکمهها را بهطور خودکار قرار میدهند.
گالری به مجموعه موارد زیر نیاز دارد:
[“1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”0″,”+”,”-“,”https://dev.to/”,”*”,”=”,”C”]
سپس همه کد OnSelect را رول می کنیم زیرا همه دکمه ها از یک کد استفاده می کنند.
همه دکمه ها
If(IsNumeric(Self.Text),
If(vsTwo="99999999999999999999",
Set(vsOne,Value(vsOne& Self.Text)&"")
,
Set(vsTwo,Value(vsTwo& Self.Text)&"")
)
,
If(Self.Text="=",
Switch(vsCalc,
"+",Set(viValue,Value(vsOne) + Value(vsTwo)),
"-",Set(viValue,Value(vsOne) - Value(vsTwo)),
"*",Set(viValue,Value(vsOne) * Value(vsTwo)),
"https://dev.to/",Set(viValue,Value(vsOne) / Value(vsTwo))
);
Set(vsOne,viValue&"");
Set(vsTwo,"99999999999999999999");
,
If(Self.Text="C",
Set(vsOne,"0");
Set(vsTwo,"99999999999999999999");
Set(vsCalc,"");
Set(vbEquals,false);
Set(viValue,0);
Set(sPrint,"");
,
Set(vsCalc,Self.Text);
If(vsTwo="99999999999999999999",
Set(vsTwo,"0");
,
Switch(Self.Text,
"+",Set(viValue,Value(vsOne) + Value(vsTwo)),
"-",Set(viValue,Value(vsOne) - Value(vsTwo)),
"*",Set(viValue,Value(vsOne) * Value(vsTwo)),
"https://dev.to/",Set(viValue,Value(vsOne) / Value(vsTwo))
);
Set(vsOne,viValue&"");
Set(vsTwo,"0");
)
)
)
)
3. کد
این یکی که شخصا فکر می کنم بسیار جالب است، به جای استفاده از دکمه ها، چرا از صفحه کلید استفاده نکنید.
ما رویکرد مشابهی داریم اما این بار در متغیرها ذخیره نمیکنیم، بلکه در یک ردیف در یک مجموعه ذخیره میکنیم
متأسفانه هیچ راه آسانی برای استفاده از Regex وجود نداشت (من توانستم آن را پیدا کنم) بنابراین رویکرد من این بود که ورودی را به یک آرایه تقسیم کنم و سپس روی هر کاراکتر حلقه بزنم و به آرایه ردیفی (که ما به عنوان یک شی استفاده می کنیم) ذخیره یا اضافه کنیم. برای ذخیره متغیرها همانطور که نمی توانید در یک حلقه ForAll تنظیم کنید). منطق این است
- اگر عدد است و هیچ اپراتور ذخیره نشده است به کلید یک اضافه کنید (زیرا این اولین عدد در فرمول است)
- اگر عدد است اما عملگر ذخیره شده است به کلید دو اضافه می شود (زیرا این دومین عدد در فرمول است)
- Else روی عملگر تنظیم شود (همانطور که می دانیم عددی نیست)
- پس از اتمام ForAll از عملگر برای انتخاب فرمول و نمایش نتایج استفاده کنید
دکمه برابر است
ClearCollect(colInput,Split(inCalcCode.Text,""));
Set(viValue,0);
ClearCollect(colResult,{one:"",operator:"",two:"",value:0,id:1});
ForAll(colInput,
If(IsNumeric(ThisRecord.Value)&&Index(colResult,1).operator="",
Patch(colResult,{id:1},{
one:Index(colResult,1).one&ThisRecord.Value}
)
,
If(IsNumeric(ThisRecord.Value),
Patch(colResult,{id:1},{
two:Index(colResult,1).two&ThisRecord.Value}
)
,
Patch(colResult,{id:1},{
operator:ThisRecord.Value}
)
)
)
);
Switch(Index(colResult,1).operator,
"+",Set(viValue,Value(Index(colResult,1).one) + Value(Index(colResult,1).two)),
"-",Set(viValue,Value(Index(colResult,1).one) - Value(Index(colResult,1).two)),
"*",Set(viValue,Value(Index(colResult,1).one) * Value(Index(colResult,1).two)),
"https://dev.to/",Set(viValue,Value(Index(colResult,1).one) / Value(Index(colResult,1).two))
);
Set(vbResult,true);
4.تایمر
همانطور که قبلاً اشاره کردم، تایمرها روش انعطافپذیر دیگری برای انجام حلقهها در Power Apps هستند.
این رویکرد مشابه رویکرد کد (حلقه ForAll) با چند تفاوت کوچک است.
از آنجایی که این بیشتر یک حلقه For است، ما روی هر آیتم افزایش نمیدهیم، بلکه میشماریم و مقایسه شاخص انجام میدهیم. و همانطور که اکنون میتوانیم متغیرها را تنظیم کنیم، به مجموعه تک ردیفی خود نیاز نداریم.
دکمه برابر است
ClearCollect(colInput,Split(inCalcTimer.Text,""));
Set(vsOne,"");
Set(vsNumber,"");
Set(viValue,0);
Set(i,1);
Set(vbResult,false);
Set(vsCalc,"");
Set(vbCalc,true);
این بار قصد داریم به:
- بر روی هر آیتم از رشته تقسیم می شود. وقتی به طول رسیدیم حلقه را متوقف می کنیم، فرمول را انتخاب کرده و نتیجه را نشان می دهیم.
- اگر کمتر از طول باشد، بررسی می کنیم که آیا عدد است و vsCalc خالی است (همانطور که می دانیم قسمت اول یا دوم فرمول).
- اگر هر دو باشد ما به vsNumber اضافه می کنیم
- اگر عدد است اما vsCalc خالی نیست، بررسی می کنیم که آیا vsOne خالی است یا نه، اگر vsNumber را کپی می کنیم و vsNumbner را پاک می کنیم (آماده برای شماره دوم در فرمول). سپس دوباره به vsNumber اضافه می کنیم.
- در نهایت اگر عددی نباشد، ذخیره به همان اندازه vsCal است که می دانیم اپراتور است.
شروع کنید
vbCalc
تکرار
vbCalc
OnTimerEnd
If(i>CountRows(colInput),
Set(vbCalc,false);
Set(vbResult,true);
Switch(vsCalc,
"+",Set(viValue,Value(vsOne) + Value(vsNumber)),
"-",Set(viValue,Value(vsOne) - Value(vsNumber)),
"*",Set(viValue,Value(vsOne) * Value(vsNumber)),
"https://dev.to/",Set(viValue,Value(vsOne) / Value(vsNumber))
);
Reset(inCalcTimer);
,
If(IsNumeric(Index(colInput,i).Value),
If(vsCalc="",
Set(vsNumber,vsNumber&Index(colInput,i).Value);
,
If(vsOne="",Set(vsOne,vsNumber);Set(vsNumber,""));
Set(vsNumber,vsNumber&Index(colInput,i).Value);
)
,
Set(vsCalc,Index(colInput,i).Value)
)
);
Set(i,i+1);
5. چرتکه
میخواهید واقعاً نوآورانه عمل کنید، پس LowCode and Power Apps به شما کمک میکند. چرا وقتی می توانید از چرتکه استفاده کنید از ماشین حساب استفاده کنید.
چرتکه با تراز کردن 2 گالری ساخته شده است که در سمت راست مهره های استفاده نشده و سمت چپ استفاده شده است.
گالری با 2 مجموعه مشابه پر شده است
Screen OnVisible / Clear Button OnSelect
ClearCollect(colSelected,
{type:"ones",show:"|",val:""},
{type:"tens",show:"X",val:""},
{type:"hundreds",show:"C",val:""},
{type:"thousands",show:"M",val:""},
{type:"tenthousnads",show:"̅X̅",val:""}
);
ClearCollect(colUnSelected,
{type:"ones",show:"|",val:"||||||||||"},
{type:"tens",show:"X",val:"XXXXXXXXXXX"},
{type:"hundreds",show:"C",val:"CCCCCCCCCC"},
{type:"thousands",show:"M",val:"MMMMMMMMMM"},
{type:"tenthousnads",show:"̅X̅",val:"X̅X̅X̅X̅X̅X̅X̅X̅X̅X̅"}
)
گالری دارای یک برچسب است که val مجموعه را نشان می دهد، روی انتخاب برچسب با پچ مقدار با طول -1 و مجموعه دیگر را با val و نمایش آن وصله کنید.
برچسب گالری OnSelect
If(ThisItem.val<>"",
Patch(colUnSelected,{type:ThisItem.type},
{val:Left(ThisItem.val,Len(ThisItem.val)-1)}
);
Patch(colSelected,{type:ThisItem.type},
{val:LookUp(colSelected,type=ThisItem.type).val&ThisItem.show}
);
)
آخرین مرحله تبدیل آیتم های colSelected به عدد است.
متن برچسب نتیجه
(Len(Index(colSelected,1).val)*1)+
(Len(Index(colSelected,2).val)*10)+
(Len(Index(colSelected,3).val)*100)+
(Len(Index(colSelected,4).val)*1000)+
(Len(Index(colSelected,5).val)*10000/2)
همانطور که می بینید راه های مختلفی برای حل هر راه حل برنامه وجود دارد، این نشان می دهد که بررسی طراحی خوب برای کمک به برنامه ریزی قبل از توسعه چقدر مهم است.
یک کپی از برنامه را می توانید در اینجا پیدا کنید