How can i make the script works without a GUI, use a preset conditions and vAmount(for example 30000) to calculate then instant get the results MsgBox, %Q1% %Q2% %Q3% %Q4% %R% by default
Really appreciate for your great help
Code: Select all
#NoEnv
SetBatchLines, -1
; Constant multipliers -----------------------------------------------------------------------------------------------------------
P1 := 7.25
P2 := 6.53
P3 := 6.16
P4 := 5.43
; GUI ----------------------------------------------------------------------------------------------------------------------------
Gui, Margin, 10, 10
Gui, Add, Text, xm ym w200, Amount:
Gui, Add, Edit, xp y+2 wp Number vAmount, 30000
Gui, Add, Text, ym wp, Minimum Deviation:
Gui, Add, Edit, xp y+2 wp Number vMinD, 10
Gui, Add, Text, ym wp, Maximum Deviation:
Gui, Add, Edit, xp y+2 wp Number vMaxD, 50
Gui, Add, Text, xm wp Section, Maximum Iterations:
Gui, Add, Edit, xp y+2 w200 ReadOnly Number, 3
Gui, Add, UpDown, vUDI Range1-3, 3
Gui, Add, Text, ys, Maximum Results:
Gui, Add, Edit, xp y+2 w200 ReadOnly Number, 15
Gui, Add, UpDown, vUDR Range1-30, 15
Gui, Add, Text, ys, Maximum Delta (n * 48):
Gui, Add, Edit, xp y+2 w200 ReadOnly Number, 3
Gui, Add, UpDown, vUDD Range1-5, 3
Gui, Add, Text, xm, Results:
Gui, Add, ListView, xm y+2 w620 r15 gSelectResult, #|Q1|Q2|Q3|Q4|Result|Max Delta|%A_Space%
Loop, % LV_GetCount("Column") - 1
LV_ModifyCol(A_Index, "Integer")
Gui, Add, Button, xm wp gCalculate, Calculate
Gui, Add, StatusBar
Gui, Show, , Calculator
Return
; Exit ---------------------------------------------------------------------------------------------------------------------------
GuiClose:
ExitApp
; Calculate the results ----------------------------------------------------------------------------------------------------------
Calculate:
Gui, +OwnDialogs
Gui, Submit, NoHide
;
Num := Amount
Min := Num + MinD
Max := Num + MaxD
MaxLoopCount := UDI
MaxResults := UDR
MaxDelta := UDD * 48
;
Q := Floor(Num // (P1 + P2 + P3 + P4))
Q -= Mod(Q, 48)
If (Q < MaxDelta) {
MsgBox, 16, %A_ThisLabel%, Cannot iterate %UDI% times!
GuiControl, Focus, UDI
Return
}
LV_Delete()
;
Results := []
Loop {
Q1 := Q2 := Q3 := Q4 := Q
S1 := Q1 * P1
Loop {
S2 := S1 + (Q2 * P2)
If (S2 >= Min)
Break
Q3 := Q
Loop {
S3 := S2 + (Q3 * P3)
If (S3 >= Min)
Break
Q4 := Q
Loop {
S4 := S3 + (Q4 * P4)
If (S4 >= Min) {
If (S4 <= Max) {
R := (Q1 * P1) + (Q2 * P2) + (Q3 * P3) + (Q4 * P4)
D := 0
If ((Q2 - Q) > D)
D := Q2 - Q
If ((Q3 - Q) > D)
D := Q3 - Q
If ((Q4 - Q) > D)
D := Q4 - Q
If (D <= MaxDelta)
Results.Push([Q1, Q2, Q3, Q4, Round(R, 2), D])
If !(Results.Length() < MaxResults)
Break, 4
}
Break
}
Q4 += 48
}
Q3 += 48
}
Q2 += 48
}
Q -= 48
} Until (A_Index >= MaxLoopCount)
;
For I, R In Results
LV_Add("", A_Index, R*)
Loop, % LV_GetCount("Column")
LV_ModifyCol(A_Index, "AutoHdr")
LV_ModifyCol(7, "Sort")
L := Results.Length()
SB_SetText(" Found " . L . " solution" . (L <> 1 ? "s." : "."))
Return
; Select a result from the ListView by double click
SelectResult:
Gui, +OwnDialogs
If (A_GuiEvent = "DoubleClick") && (SelectedRow := LV_GetNext()) {
LV_GetText(Q1, SelectedRow, 2)
LV_GetText(Q2, SelectedRow, 3)
LV_GetText(Q3, SelectedRow, 4)
LV_GetText(Q4, SelectedRow, 5)
LV_GetText(R, SelectedRow, 6)
; do what you want to do with the variables here
MsgBox, 0, Selected Result, %Q1% %Q2% %Q3% %Q4% %R% ; just for testing
}
Return