unit IzmUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, PictureList, ExtCtrls, AdvPanel, AdvPicture, AdvGlowButton, AdvProgressBar, ActnList, DeviceRD, ComCtrls, DateUtils, DB, LayeredForm, IzmGraphUnit, user_types, class_measure, class_point, class_param, class_model; type TIzmForm = class(TForm) Izm_main_panel: TAdvPanel; Izm_top_panel: TPanel; Izm_middle_panel: TPanel; Izm_prev_point_btn: TAdvGlowButton; Izm_next_point_btn: TAdvGlowButton; Izm_condition_label: TLabel; Izm_stop_btn: TAdvGlowButton; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Izm_info_panel: TPanel; Panel1: TPanel; Izm_progress_bar: TAdvProgressBar; Izm_point_picture: TAdvPicture; ActionList: TActionList; izm_next_point: TAction; izm_prev_point: TAction; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Izm_patient_name: TLabel; Izm_date: TLabel; Izm_pat_num: TLabel; Izm_gen_num: TLabel; Izm_pat_id: TLabel; Label7: TLabel; izm_mes_tek_count: TLabel; Label9: TLabel; izm_mes_count: TLabel; izm_device_result_LB: TListView; izm_device_program_LB: TListView; Label8: TLabel; Label10: TLabel; izm_U_mis: TLabel; izm_I_mis: TLabel; Panel5: TPanel; Label12: TLabel; izm_point_opis: TLabel; izm_point_num: TLabel; Label1: TLabel; Label13: TLabel; izm_point_name: TLabel; IzmPB: TAdvProgressBar; IzmTimer: TTimer; Label11: TLabel; izm_opisanie_edit: TEdit; IzmGraphFrame1: TIzmGraphFrame; procedure FormCreate(Sender: TObject); procedure izm_next_pointExecute(Sender: TObject); procedure izm_prev_pointExecute(Sender: TObject); procedure FormShow(Sender: TObject); procedure Izm_stop_btnClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure IzmTimerTimer(Sender: TObject); function measure_default_initialization(in_measure: TRDMeasure):boolean; procedure Update_controls_After_point_num_change; procedure Initialize_form_details; private { Private declarations } public measure: TRDMeasure; procedure incoming_message(message_:params_record); end; var IzmForm: TIzmForm; implementation uses ConstUnit, MainUnit, DataUnit; {$R *.dfm} procedure TIzmForm.FormCreate(Sender: TObject); begin //названия параметров with izm_device_result_LB do begin Items.Add(); Items[ 0 ].Caption := params_default_name3; Items.Add(); Items[ 1 ].Caption := params_default_name4; Items.Add(); Items[ 2 ].Caption := params_default_name5; Items.Add(); Items[ 3 ].Caption := params_default_name6; Items.Add(); Items[ 4 ].Caption := params_default_name7; Items.Add(); Items[ 5 ].Caption := params_default_name8; Items.Add(); Items[ 6 ].Caption := params_default_name9; end; with izm_device_program_LB do begin Items.Add(); Items[0].Caption:=params_default_name3; Items.Add(); Items[1].Caption:=params_default_name4; Items.Add(); Items[2].Caption:=params_default_name5; Items.Add(); Items[3].Caption:=params_default_name6; Items.Add(); Items[4].Caption:=params_default_name7; Items.Add(); Items[5].Caption:=params_default_name8; Items.Add(); Items[6].Caption:=params_default_name9; end; end; procedure TIzmForm.Initialize_form_details; begin izm_I_mis.Hide; izm_u_mis.Hide; IzmPB.Position := 0; with izm_device_result_LB do begin Items[0].SubItems.Clear; Items[1].SubItems.Clear; Items[2].SubItems.Clear; Items[3].SubItems.Clear; Items[4].SubItems.Clear; Items[5].SubItems.Clear; Items[6].SubItems.Clear; end; with izm_device_program_LB do begin Items[0].SubItems.Clear; Items[1].SubItems.Clear; Items[2].SubItems.Clear; Items[3].SubItems.Clear; Items[4].SubItems.Clear; Items[5].SubItems.Clear; Items[6].SubItems.Clear; end; end; procedure TIzmForm.FormShow(Sender: TObject); begin Initialize_form_details; // глобальный номер текущего измерения mysql_query(SQL_DM.mysql_query1, 'SELECT MAX(id) FROM `'+table_izm_name+'`;',1); // Создаем измерение self.measure := TRDMeasure.Create; measure_default_initialization(measure); with measure do begin //записываем информацию об измерении Set_measure_info( inttostr( SQL_DM.mysql_DSQ1.DataSet.FieldByName('MAX(id)').AsInteger + 1 ), datetimetostr( Now () ), IZM_UNIT_MEASUREMENT_LABEL + datetostr( today () ) + ' ' + timetostr( time() ) + '.' ); Set_measure_patient_info(MainForm.patient.Get_current_patient_ID, MainForm.patient.Get_current_patient_sirname, MainForm.patient.Get_current_patient_first_name, MainForm.patient.Get_current_patient_middle_name ); //ставим указатель на первую точку measure.point_values.First_point; manual_point_switch := MainForm.izm_manual_switch.Checked; end; // Синхронизируем с формой Update_controls_After_point_num_change; // Фамилия Имя Отчество Izm_patient_name.Caption:=measure.Get_measure_patinet_sirname + ' ' + measure.Get_measure_patinet_first_name + ' ' + measure.Get_measure_patinet_middle_name; Izm_gen_num.Caption := measure.Get_measure_ID; // дата и время измерения Izm_date.Caption := measure.Get_measure_date; //номер измерения для пациента Izm_pat_num.Caption:=inttostr( strtoint( MainForm.patient.Get_current_patient_measure_count ) + 1 ); //ID пациента Izm_pat_id.Caption := measure.Get_measure_patinet_ID; // обнуление параметров формы // количество посылок izm_mes_count.Caption := inttostr ( measure.Get_total_sent ); //название кнопки остановки Izm_stop_btn.Caption := IZM_STOP_MEASUREMENT; //Время измерения izm_opisanie_edit.Text := IZM_UNIT_MEASUREMENT_LABEL + measure.Get_measure_date; //прогресс бар получения посылки IzmPB.Position:=0; //таймер получения посылки IzmTimer.Enabled:=FALSE; /// заносим нулевые значения в базу, потом только обновление end; procedure TIzmForm.FormClose(Sender: TObject; var Action: TCloseAction); begin // уничтожили поток MainForm.device.Close_thread; //закрыли устройство MainForm.device.Close_device; // уничтожаем объект измерения self.measure.Free; end; procedure TIzmForm.FormKeyPress(Sender: TObject; var Key: Char); begin if ( key = #13 ) then IzmForm.izm_next_point.Execute; end; function TIzmForm.measure_default_initialization (in_measure: TRDMeasure): boolean; var params: TRDParamList; models: TRDModelList; begin //result := FALSE; try with in_measure do begin //грузим параметры для каждой из точек mysql_query(SQL_DM.mysql_query3, 'SELECT name, opisanie FROM ' + table_param_name + ';', 1); SQL_DM.mysql_query3.Open; SQL_DM.mysql_query3.First; params := TRDParamList.Create; while ( not SQL_DM.mysql_query3.Eof ) do begin //создаем параметры params.Add ( TRDParam.Create( SQL_DM.mysql_query3.FieldByName( 'name' ).AsString, SQL_DM.mysql_query3.FieldByName( 'opisanie' ).AsString ) ); //присваиваем модели параметрам models := TRDModelList.Create; models.Add( TRDModel.Create( 'Нелинейная 3-х компонентная', '') ); params.Get_current_param.models := models; SQL_DM.mysql_query3.Next; end; // получаем из базы все точки и создаем массив точек mysql_query( SQL_DM.mysql_query3, 'SELECT num, name, opisanie, image FROM ' + table_points_name + ';', 1 ); SQL_DM.mysql_query3.Open; SQL_DM.mysql_query3.First; while ( not SQL_DM.mysql_query3.Eof ) do begin //создаем точку, изображение грузится в автомате point_values.Add( TRDPoint.Create( SQL_DM.mysql_query3.FieldByName( 'name' ).AsString, SQL_DM.mysql_query3.FieldByName( 'opisanie' ).AsString ) ); // присваиваем полученные параметры точке point_values.Get_current_point.Params := params; SQL_DM.mysql_query3.Next; end; Set_total_sent( 0 ); Set_current_sent ( 0 ); end; finally result := TRUE; end; end; procedure TIzmForm.incoming_message(message_:params_record); begin // Показываем результаты расчета //добавить результаты с программы with izm_device_result_LB do begin Items[0].SubItems.Clear; Items[0].SubItems.Add(floattostrf(message_.R_calc, ffExponent, ACCURACY, POWER_DIGITS)); Items[1].SubItems.Clear; Items[1].SubItems.Add(floattostrf(message_.g0_calc, ffExponent, ACCURACY, POWER_DIGITS)); Items[2].SubItems.Clear; Items[2].SubItems.Add(floattostrf(message_.g1_calc, ffExponent, ACCURACY, POWER_DIGITS)); Items[3].SubItems.Clear; Items[3].SubItems.Add(floattostrf(message_.g2_calc, ffExponent, ACCURACY, POWER_DIGITS)); Items[4].SubItems.Clear; Items[4].SubItems.Add(floattostrf(message_.g3_calc, ffExponent, ACCURACY, POWER_DIGITS)); Items[5].SubItems.Clear; Items[5].SubItems.Add(floattostrf(message_.C_calc, ffExponent, ACCURACY, POWER_DIGITS)); Items[6].SubItems.Clear; Items[6].SubItems.Add(floattostrf(message_.Usm_calc, ffExponent, ACCURACY, POWER_DIGITS)); end; //добавить результаты с прибора with izm_device_program_LB do begin Items[0].SubItems.Clear; Items[0].SubItems.Add(floattostrf(message_.R_device, ffExponent, ACCURACY, POWER_DIGITS)); Items[1].SubItems.Clear; Items[1].SubItems.Add(floattostrf(message_.g0_device, ffExponent, ACCURACY, POWER_DIGITS)); Items[2].SubItems.Clear; Items[2].SubItems.Add(floattostrf(message_.g1_device, ffExponent, ACCURACY, POWER_DIGITS)); Items[3].SubItems.Clear; Items[3].SubItems.Add(floattostrf(message_.g2_device, ffExponent, ACCURACY, POWER_DIGITS)); Items[4].SubItems.Clear; Items[4].SubItems.Add(floattostrf(message_.g3_device, ffExponent, ACCURACY, POWER_DIGITS)); Items[5].SubItems.Clear; Items[5].SubItems.Add(floattostrf(message_.C_device, ffExponent, ACCURACY, POWER_DIGITS)); Items[6].SubItems.Clear; Items[6].SubItems.Add(floattostrf(message_.Usm_device, ffExponent, ACCURACY, POWER_DIGITS)); end; //Показываем результаты ошибок if message_.U_mis then begin izm_U_mis.Visible:=TRUE; //если была ошибка, то обнуляем результаты if MainForm.Izm_null_result_CB.Checked then begin message_.R_calc:=0; message_.C_calc:=0; message_.g0_calc:=0; message_.g1_calc:=0; message_.g2_calc:=0; message_.g3_calc:=0; message_.R_device:=0; message_.C_device:=0; message_.g0_device:=0; message_.g1_device:=0; message_.g2_device:=0; message_.g3_device:=0; message_.Usm_device:=0; message_.Ism_device:=0; message_.Usm_calc:=0; message_.Ism_calc:=0; end; end else begin izm_U_mis.Visible:=FALSE; end; if message_.I_mis then begin izm_I_mis.Visible:=TRUE; //если была ошибка, то обнуляем результаты if MainForm.Izm_null_result_CB.Checked then begin message_.R_calc:=0; message_.C_calc:=0; message_.g0_calc:=0; message_.g1_calc:=0; message_.g2_calc:=0; message_.g3_calc:=0; message_.R_device:=0; message_.C_device:=0; message_.g0_device:=0; message_.g1_device:=0; message_.g2_device:=0; message_.g3_device:=0; message_.Usm_device:=0; message_.Ism_device:=0; message_.Usm_calc:=0; message_.Ism_calc:=0; end; end else begin izm_I_mis.Visible:=FALSE; end; end; //таймер при приеме посылки procedure TIzmForm.IzmTimerTimer(Sender: TObject); begin IzmPB.Position := IzmPB.Position + 10; end; procedure TIzmForm.izm_next_pointExecute(Sender: TObject); begin if ( ( measure.point_values.Get_current_item_index + 1 ) < measure.point_values.Count ) then begin measure.point_values.Next_point; Update_controls_After_point_num_change; end; end; procedure TIzmForm.izm_prev_pointExecute(Sender: TObject); begin if ( measure.point_values.Get_current_item_index - 1 >= 0 ) then begin measure.point_values.Prev_point; Update_controls_After_point_num_change; end; end; procedure TIzmForm.Update_controls_After_point_num_change; var point_num: integer; begin measure.Set_current_sent( 0 ); point_num := measure.point_values.Get_current_item_index + 1; //если нормально попадаем в диапазон номеров if ( ( point_num >= 1 ) and ( point_num <= measure.point_values.Count ) ) then begin //номер точки izm_point_num.Caption := inttostr( point_num ); // название и описание точки izm_point_opis.Caption := measure.point_values.Get_current_point.Get_name; izm_point_name.Caption := measure.point_values.Get_current_point.Get_description; //картинка Izm_point_picture.Picture := measure.point_values.Get_current_point.image.get_image; //прогресс бар измерения if ( ( point_num - 1 ) <> 0 ) then begin Izm_progress_bar.Position := round( 100 / ( measure.point_values.Count-1 ) * ( point_num - 1 ) ); end else begin Izm_progress_bar.Position := 0; end; // кнопки вперд назад if measure.manual_point_switch then begin if ( point_num = 1 ) then begin Izm_next_point_btn.Enabled:=TRUE; Izm_prev_point_btn.Enabled:=FALSE; end else if ( point_num = measure.point_values.Count ) then begin Izm_next_point_btn.Enabled:=FALSE; Izm_prev_point_btn.Enabled:=TRUE; end else begin Izm_next_point_btn.Enabled:=TRUE; Izm_prev_point_btn.Enabled:=TRUE; end end else begin Izm_next_point_btn.Enabled:=FALSE; Izm_prev_point_btn.Enabled:=FALSE; end; end; end; procedure TIzmForm.Izm_stop_btnClick(Sender: TObject); begin if MessageBox(0, PChar(izm_data_lost), PChar(izm_caption_message), MB_ICONQUESTION or MB_OKCANCEL ) = id_OK then begin self.Close; end; end; end.