UI.PAS 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. Uses Core,Win2K2,CoolKey,ccontr;
  2. { Используемые модули -
  3. Core - Основной модуль курсовика, само моделирование. (C) IE 2002
  4. Win2K2 - Графический модуль, по возможности, аналогия иделологии
  5. Win32 API (C) Microsoft. Win2k2 (C) IE
  6. CoolKey - Модуль низкоукровневой работы с клавиатурой, используется в Win2k2,
  7. в головной программе необходим для клавиатурных констант
  8. CContr - Модуль для работы с Win2k2, в нем реализованы основные элементы
  9. интерфейса (EditBox, CheckBox, Button, XYPlot)}
  10. TYPE
  11. {Состояниия системы}
  12. EStatus = (ST_WAITING, {Система ожидает старта}
  13. ST_RUNNING, {Система в сост. работы}
  14. ST_FINISHED) {Сислема завершила моделирование};
  15. const
  16. AStatus : array [EStatus] of string[15] = ('Waiting','Running', 'Finished');
  17. {Сообщения о состоянии системы}
  18. var
  19. TextOut : Text; {Файловый дескриптор текстового вывода результатов}
  20. RunNum : Integer; {Номер запуска системы (по нему различаются файлы вывода}
  21. RunMode : boolean; {Режим работы (рабочий/отладочный)}
  22. Parent : hWNd; {Handle основного окна программы}
  23. Stat : EStatus; {Текущее рабочее состояние}
  24. OCButtons : Array [1..2] of hWnd; {Handl'ы кнопок [1] - OK, [2] - Stop}
  25. Edits : array [1..9] of hWnd; {Handl'ы полей ввода}
  26. Checks : array [0..5] of hWnd; {Handl'ы выбираемых кновоп}
  27. Mode : hWnd; {Handle селектора режима}
  28. Limits : array [1..2] of hWnd; {Handl'ы текстовых полей границ графика}
  29. Realiz : hWnd; {Handle поля ввода числа реализаций}
  30. RealNum : UINT32; {Само число реализаций}
  31. CurReal : UINT32; {Текущий номер раелизации, использеутся
  32. ислючительно для равномерного распределения
  33. точек в режиме отладки}
  34. Plot : hWnd; {Handle графика}
  35. {Динамические объекты - элементы системы массового обслуживания}
  36. { Описание - см. заголовок модуля Core.pas}
  37. Model : ^CModel;
  38. Buffer : PBuffer;
  39. Device : PDevice;
  40. Srcs1, Srcs2,Srcs3 : PSource;
  41. BegVal, {Начальные/конечные зн-я скорости прибора}
  42. LastVal : Real;
  43. Steps : integer; {Число шагов от начального к конечному зн-ю прибора
  44. (число точек на графике)}
  45. CurStep : integer; {Текущий шаг}
  46. BufferSize : integer; {Емкость буфера модели}
  47. S1,S2,S3 : Real; {Скорости источников}
  48. Delta, DovInt : real; {Настройки вероятностей}
  49. {----------------------------------------------------------------}
  50. Function GetFloat(aH:hWND):real; {Функция считывает вещественное зн-е из поля
  51. ввода}
  52. var
  53. st : string;
  54. ret : real;
  55. i : integer;
  56. begin
  57. GetWindowText(AH,@st,255);
  58. Val(st,ret,i);
  59. GetFloat := ret;
  60. end;
  61. {----------------------------------------------------------------}
  62. Procedure GetParams; {Считывание всех зн-ний из полей ввода}
  63. var
  64. st : string[50];
  65. i : integer;
  66. v : real;
  67. begin
  68. BegVal := GetFloat(Edits[3]);
  69. LastVal := GetFloat(Edits[4]);
  70. DovInt := GetFloat(Edits[2]);
  71. Steps := Round(GetFloat(Edits[5]));
  72. BufferSize := Round(GetFloat(Edits[6]));
  73. S1 := Getfloat(Edits[7]);
  74. S2 := Getfloat(Edits[8]);
  75. S3 := Getfloat(Edits[9]);
  76. GetWindowText(Edits[1],@st,50);
  77. if st[ord(st[0])] = '%' then
  78. begin
  79. Val(copy(st,1,ord(st[0])-1),v,i);
  80. Delta := v/100.0;
  81. end
  82. else
  83. Val(st,Delta,i);
  84. end;
  85. Procedure InitModel; {Начальная инициализация значений модели и
  86. инициализация динамических объектов}
  87. begin
  88. Delta := 0.1;
  89. DovInt := 1.64;
  90. BegVal := 1.0;
  91. LastVal := 5.0;
  92. Steps := 20;
  93. BufferSize := 5;
  94. S1 := 2.0;
  95. S2 := 1.0;
  96. S3 := 5.0;
  97. New(Buffer, Init(BufferSize));
  98. New(Device, Init(BegVal));
  99. New(Model, Init(3,Device,Buffer,Delta,DovInt));
  100. New(Srcs1,Init(0,S1));
  101. Model^.AddNewSource(Srcs1);
  102. New(Srcs2,Init(1,S2));
  103. Model^.AddNewSource(Srcs2);
  104. New(Srcs3,Init(2,S3));
  105. Model^.AddNewSource(Srcs3);
  106. end;
  107. Procedure StartModel; {Процедура подготовки и старта моделирования при
  108. указанных значениях}
  109. var
  110. XY : TRPoint;
  111. nm : string;
  112. i : UINT8;
  113. begin
  114. Buffer^.SetBufferSize(BufferSize);
  115. Device^.Lambda := BegVal;
  116. Model^.Delta := Delta;
  117. Model^.DovInt := DovInt;
  118. Srcs1^.Lambda := S1;
  119. Srcs2^.Lambda := S2;
  120. Srcs3^.Lambda := S3;
  121. Model^.Start;
  122. for i := 0 to 5 do
  123. SendMessage(Plot,WM_SETVISIBLE,i,SendMessage(Checks[i],CB_GETCHECK,0,0));
  124. S1 := GetFloat(Realiz);
  125. RealNum := round(S1);
  126. Model^.RealizSteps := RealNum;
  127. if RunMode then
  128. begin
  129. Model^.CalcVer := true;
  130. XY.X:=0;
  131. XY.Y:=Steps;
  132. for i := 0 to 5 do
  133. begin
  134. SendMessage(Plot,XP_DELALLPOINTS,i,0);
  135. SendMessage(Plot,XP_SETXRANGE,i,UINT32(@XY));
  136. end;
  137. str(Steps,nm);
  138. SetWindowText(Limits[2],@nm);
  139. str(RunNum,nm);
  140. Inc(RunNum);
  141. nm := 'result.'+nm;
  142. Assign(TextOut,nm);
  143. Rewrite(TextOut);
  144. end
  145. else
  146. begin
  147. Model^.CalcVer := false;
  148. Str(RealNum,nm);
  149. SetWindowText(Limits[2],@nm);
  150. XY.X:=1;
  151. XY.Y:=RealNum;
  152. CurReal:=0;
  153. for i := 0 to 2 do
  154. begin
  155. SendMessage(Plot,XP_DELALLPOINTS,i,0);
  156. SendMessage(Plot,XP_SETXRANGE,i,UINT32(@XY));
  157. SendMessage(Plot,WM_SETVISIBLE,i,SendMessage(Checks[i],CB_GETCHECK,0,0));
  158. end;
  159. for i := 3 to 5 do
  160. begin
  161. SendMessage(Plot,XP_DELALLPOINTS,i,0);
  162. SendMessage(Plot,WM_SETVISIBLE,i,0);
  163. end;
  164. end;
  165. CurStep := 0;
  166. end;
  167. {Основной обработчик сообщений (messages) от системы (графического модуля).
  168. По идеологии Win32 API (C) Microsoft - основная процедура всей программы,
  169. в ней задается вся реакция на действия пользователя, наравне с внутренней
  170. логикой программы}
  171. Function WindowProc(ahWnd:HWND;aMsg,wParam,lParam:UINT32):UINT32;far;
  172. var
  173. ps : LPPAINTSTRUCT;
  174. XY,Max : TRPoint;
  175. st : string;
  176. i : UINT8;
  177. rt : RECT;
  178. begin
  179. case aMsg of
  180. WM_CREATE: {Первое сообщение после создания окна, в нем - инициализация
  181. и создание всех дочерних окон (полей ввода, и проч.)}
  182. begin
  183. OCButtons[1] := CreateWindow('OK','BUTTON',WS_CHILD,
  184. 66,350,50,30,ahWnd,NULL);
  185. PostMessage(OCButtons[1],CB_SETID,1,0);
  186. OCButtons[2] := CreateWindow('Exit','BUTTON',WS_CHILD,
  187. 152,350,60,30,ahWnd,NULL);
  188. PostMessage(OCButtons[2],CB_SETID,2,0);
  189. CreateWindow('Veroyatn','LABEL',WS_CHILD,
  190. 10,10,140,15,ahWnd,NULL);
  191. Edits[1]:=CreateWindow('10%','EDIT',WS_CHILD,
  192. 150,10,140,15,ahWnd,NULL);
  193. CreateWindow('Dov. Int','LABEL',WS_CHILD,
  194. 10,30,140,15,ahWnd,NULL);
  195. Edits[2]:=CreateWindow('0.82','EDIT',WS_CHILD,
  196. 150,30,140,15,ahWnd,NULL);
  197. CreateWindow('Beg. Lam ist','LABEL',WS_CHILD,
  198. 10,50,140,15,ahWnd,NULL);
  199. Edits[3]:=CreateWindow('1.0','EDIT',WS_CHILD,
  200. 150,50,140,15,ahWnd,NULL);
  201. CreateWindow('End Lam ist','LABEL',WS_CHILD,
  202. 10,70,140,15,ahWnd,NULL);
  203. Edits[4]:=CreateWindow('5.0','EDIT',WS_CHILD,
  204. 150,70,140,15,ahWnd,NULL);
  205. CreateWindow('Steps','LABEL',WS_CHILD,
  206. 10,90,140,15,ahWnd,NULL);
  207. Edits[5]:=CreateWindow('20','EDIT',WS_CHILD,
  208. 150,90,140,15,ahWnd,NULL);
  209. CreateWindow('Buf size','LABEL',WS_CHILD,
  210. 10,110,140,15,ahWnd,NULL);
  211. Edits[6]:=CreateWindow('5','EDIT',WS_CHILD,
  212. 150,110,140,15,ahWnd,NULL);
  213. CreateWindow('Lambda 1','LABEL',WS_CHILD,
  214. 10,130,140,15,ahWnd,NULL);
  215. Edits[7]:=CreateWindow('2.0','EDIT',WS_CHILD,
  216. 150,130,140,15,ahWnd,NULL);
  217. CreateWindow('Lambda 2','LABEL',WS_CHILD,
  218. 10,150,140,15,ahWnd,NULL);
  219. Edits[8]:=CreateWindow('1.0','EDIT',WS_CHILD,
  220. 150,150,140,15,ahWnd,NULL);
  221. CreateWindow('Lambda 3','LABEL',WS_CHILD,
  222. 10,170,140,15,ahWnd,NULL);
  223. Edits[9]:=CreateWindow('5.0','EDIT',WS_CHILD,
  224. 150,170,140,15,ahWnd,NULL);
  225. Plot := CreateWindow('Test plot','XYPLOT',WS_CHILD,310,10,300,300,ahWnd,NULL);
  226. SendMessage(Plot,XP_SETPLOTCOUNT,6,0);
  227. SendMessage(Plot,XP_SETCOLOR,0,Red);
  228. SendMessage(Plot,XP_SETCOLOR,1,Green);
  229. SendMessage(Plot,XP_SETCOLOR,2,Blue);
  230. SendMessage(Plot,XP_SETCOLOR,3,Magenta);
  231. SendMessage(Plot,XP_SETCOLOR,4,Yellow);
  232. SendMessage(Plot,XP_SETCOLOR,5,White);
  233. XY.X:=0;
  234. XY.Y:=100;
  235. SendMessage(Plot,XP_SETYRANGE,0,UINT32(@XY));
  236. SendMessage(Plot,XP_SETYRANGE,1,UINT32(@XY));
  237. SendMessage(Plot,XP_SETYRANGE,2,UINT32(@XY));
  238. Limits[1] := CreateWindow('0','LABEL',WS_CHILD,310,320,20,15,ahWnd,NULL);
  239. Limits[2] := CreateWindow('20','LABEL',WS_CHILD,560,320,50,15,ahWnd,NULL);
  240. Checks[0] := CreateWindow('Ist1 Potk (Red)','CHECKBOX',WS_CHILD,
  241. 10,200,200,15,ahWnd,NULL);
  242. SendMessage(Checks[0],CB_SETCHECK,0,0);
  243. Checks[1] := CreateWindow('Ist2 Potk (Green)','CHECKBOX',WS_CHILD,
  244. 10,220,200,15,ahWnd,NULL);
  245. SendMessage(Checks[1],CB_SETCHECK,1,0);
  246. Checks[2] := CreateWindow('Ist3 Potk (Blue)','CHECKBOX',WS_CHILD,
  247. 10,240,200,15,ahWnd,NULL);
  248. SendMessage(Checks[2],CB_SETCHECK,0,0);
  249. Checks[3] := CreateWindow('Ist1 MatO (Magenta)','CHECKBOX',WS_CHILD,
  250. 10,260,200,15,ahWnd,NULL);
  251. SendMessage(Checks[3],CB_SETCHECK,0,0);
  252. Checks[4] := CreateWindow('Ist2 MatO (Yellow)','CHECKBOX',WS_CHILD,
  253. 10,280,200,15,ahWnd,NULL);
  254. SendMessage(Checks[4],CB_SETCHECK,1,0);
  255. Checks[5] := CreateWindow('Ist3 MatO (White)','CHECKBOX',WS_CHILD,
  256. 10,300,200,15,ahWnd,NULL);
  257. SendMessage(Checks[5],CB_SETCHECK,0,0);
  258. Mode := CreateWindow('Test mode','CHECKBOX', WS_CHILD,
  259. 210,200,100,15, ahWnd, NULL);
  260. CreateWindow('KMIN','LABEL',WS_CHILD,210,220,50,15,ahWnd,NULL);
  261. Realiz := CreateWindow('1000','EDIT',WS_CHILD,210,240,70,15,ahWnd,NULL);
  262. SendMessage(Mode,CB_SETCHECK,0,0);
  263. RunMode := true;
  264. SendMessage(Mode,CB_SETID,90,0);
  265. Randomize;
  266. Stat := ST_WAITING;
  267. for i := 0 to 5 do SendMessage(Checks[i],CB_SETID,i+100,0);
  268. InitModel;
  269. RunNum := 0;
  270. PostMessage(ahWnd,WM_PAINT,0,0);
  271. AddOnFrameMessage(ahWnd);
  272. end;
  273. WM_COMMAND:
  274. {Обработчик команд от конролов (кнопок, полей ввода, кнопок выбора)}
  275. begin
  276. case wParam of
  277. 1: if (lParam = 0) and (Stat <> ST_RUNNING) then begin {OK button pressed}
  278. GetParams;
  279. StartModel;
  280. Stat := ST_RUNNING;
  281. St := 'STOP';
  282. SetWindowText(OCButtons[2],@St);
  283. PostMessage(ahWnd,WM_PAINT,0,0);
  284. PostMessage(OCButtons[2],WM_PAINT,0,0);
  285. end;
  286. 2: if lParam = 0 then {нажата кнопка STOP}
  287. begin
  288. if Stat = ST_RUNNING then
  289. begin
  290. if RunMode then Close(TextOut);
  291. Stat := ST_WAITING;
  292. St := 'Exit';
  293. SetWindowText(OCButtons[2],@St);
  294. PostMessage(OCButtons[2],WM_PAINT,0,0);
  295. PostMessage(ahWnd,WM_PAINT,0,0);
  296. end
  297. else
  298. PostMessage(ahWnd,WM_DESTROY,0,0);
  299. end;
  300. 90: if lParam = 0 then begin {Вкл/выкл режим отладки}
  301. RunMode := not RunMode;
  302. for i := 3 to 5 do
  303. SendMessage(Checks[i],WM_SETVISIBLE,UINT32(RunMode),0);
  304. end;
  305. end;
  306. if (wParam >= 100) and (wParam <=105) and (lParam = 0) then
  307. begin
  308. SendMessage(Plot,WM_SETVISIBLE,wParam-100,SendMessage(Checks[wParam-100],CB_GETCHECK,0,0));
  309. end;
  310. end;
  311. WM_ONFRAME:
  312. {Основной обработчик всей программы, здесь - внутреняя логика. Вызываются
  313. методы объектов модели для осуществления моделирования. Также происходит
  314. добавление точек на график, вывод текстовой информации в файл.}
  315. begin
  316. if Stat = ST_RUNNING then
  317. begin
  318. if Not Model^.Step then
  319. begin
  320. if Runmode then begin
  321. XY.X := CurStep;
  322. XY.Y := 100*Srcs1^.RefusedReq/Srcs1^.TotalReq;
  323. SendMessage(Plot,XP_ADDPOINT,0,UINT32(@XY));
  324. XY.Y := 100*Srcs2^.RefusedReq/Srcs2^.TotalReq;
  325. SendMessage(Plot,XP_ADDPOINT,1,UINT32(@XY));
  326. XY.Y := 100*Srcs3^.RefusedReq/Srcs3^.TotalReq;
  327. SendMessage(Plot,XP_ADDPOINT,2,UINT32(@XY));
  328. if (Srcs1^.DoneReq <> 0) then
  329. begin
  330. XY.Y := Srcs1^.MatWait/Srcs1^.DoneReq;
  331. SendMessage(Plot,XP_ADDPOINT,3,UINT32(@XY));
  332. end;
  333. if (Srcs2^.DoneReq <> 0) then
  334. begin
  335. XY.Y := Srcs2^.MatWait/Srcs2^.DoneReq;
  336. SendMessage(Plot,XP_ADDPOINT,4,UINT32(@XY));
  337. end;
  338. if (Srcs3^.DoneReq <> 0) then
  339. begin
  340. XY.Y := Srcs3^.MatWait/Srcs3^.DoneReq;
  341. SendMessage(Plot,XP_ADDPOINT,5,UINT32(@XY));
  342. end;
  343. Max.X := 0;
  344. Max.Y := 0;
  345. for i := 3 to 5 do
  346. begin
  347. SendMessage(Plot,XP_GETYRANGE,i,UINT32(@XY));
  348. if XY.Y > Max.Y then Max.Y := XY.Y;
  349. end;
  350. for i := 3 to 5 do
  351. SendMessage(Plot,XP_SETYRANGE,i,UINT32(@Max));
  352. PostMessage(Plot,WM_PAINT,0,0);
  353. Model^.PrintValues(TextOut);
  354. inc(CurStep);
  355. Device^.Lambda := BegVal + (LAstVal-BegVal)/Steps*Curstep;
  356. if CurStep = Steps+1 then
  357. begin
  358. Stat := ST_FINISHED;
  359. Close(TextOut);
  360. St := 'Exit';
  361. SetWindowText(OCButtons[2],@St);
  362. PostMessage(OCButtons[2],WM_PAINT,0,0);
  363. PostMessage(ahWnd,WM_PAINT,0,0);
  364. end
  365. else
  366. Model^.Start;
  367. end else
  368. begin
  369. Stat := ST_FINISHED;
  370. St := 'Exit';
  371. SetWindowText(OCButtons[2],@St);
  372. PostMessage(ahWnd,WM_PAINT,0,0);
  373. end;
  374. end
  375. else if not runmode then
  376. begin
  377. if CurReal = (RealNum div 100) then
  378. begin
  379. XY.X := Model^.CurStep;
  380. XY.Y := 100*Srcs1^.RefusedReq/Srcs1^.TotalReq;
  381. SendMessage(Plot,XP_ADDPOINT,0,UINT32(@XY));
  382. XY.Y := 100*Srcs2^.RefusedReq/Srcs2^.TotalReq;
  383. SendMessage(Plot,XP_ADDPOINT,1,UINT32(@XY));
  384. XY.Y := 100*Srcs3^.RefusedReq/Srcs3^.TotalReq;
  385. SendMessage(Plot,XP_ADDPOINT,2,UINT32(@XY));
  386. CurReal := -1;
  387. PostMessage(Plot,WM_PAINT,0,0);
  388. end;
  389. Inc(CurReal);
  390. end;
  391. end;
  392. end;
  393. WM_DESTROY:
  394. {Сообщение, приходящее перед завершением работы программы,
  395. здесь происходит освобождение памяти и уничтожение объектов модели}
  396. begin
  397. if Stat <> ST_WAITING then begin
  398. Dispose(Model,Done);
  399. Dispose(Buffer,Done);
  400. Dispose(Device,Done);
  401. end;
  402. DelOnFrameMessage(ahWnd);
  403. PostQuitMessage(ahwnd);
  404. end;
  405. WM_KEYDOWN:
  406. {Реакция на нажатие клавиши клавиатуры}
  407. if wParam = ord(SC_ESCAPE) then PostMessage(ahWnd,WM_DESTROY,0,0);
  408. WM_PAINT:
  409. {Обработчик прорисовки окна. Выводит только статус моделирования, вся
  410. остальная прорисовка выполняется дочерними окнами самостоятельно}
  411. begin
  412. ps := BeginPaint(ahWNd);
  413. wSetColor(ps,GlobalPalette.WindowFontColor);
  414. wSetBgColor(ps,GlobalPalette.ThreeDColor1);
  415. wSetStyle(ps,SolidFill);
  416. wSetFontJustify(ps,CenterText,BottomText);
  417. GetClientRect(ahWnd,@rt);
  418. wBar(ps,0,rt.b.y - 20, rt.b.x,rt.b.y);
  419. wTextOut(ps,rt.b.x shr 1, rt.b.y-1, @AStatus[Stat]);
  420. EndPaint(ps);
  421. end;
  422. end;
  423. end;
  424. {ГОЛОВА.}
  425. begin
  426. if InitWin2K2 = ERR_OK then {Иниц. графической подсистемы}
  427. if RegisterClass('MSMO',WindowProc) = ERR_OK then
  428. {Регистрация класса, с таким обработчиком событий}
  429. begin
  430. InitCommonControls; {Инициализация стандартных классов}
  431. Parent:=CreateWindow('Configuration','MSMO',
  432. WS_TITLE OR WS_SIZEABLE OR WS_MINMAX,
  433. 10,10,620,420,
  434. NULL,NULL);
  435. {Создание основного окна}
  436. MainRunLoop; {Основной цикл программы}
  437. end;
  438. DoneWin2K2; {Завершение работы графической подсистемы}
  439. end.