UI2.PAS 19 KB

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