next up previous contents
Nächste Seite: 9.4 Unit ASync4U1 Aufwärts: 9. Programmlisting Vorherige Seite: 9.2 Unit Glob   Inhalt

9.3 Unit MessU


{-------------------------------------------------------------------}

{ Messdialog, Auswahl einer Protokolldatei, Einlesen der Messdaten }
unit MessU;

{$I-}

{-------------------------------------------------------------------}

interface

procedure Messdialog;

{-------------------------------------------------------------------}

implementation

uses
  Async4U1,    { Ansteuerung der seriellen Schnittstelle }
  Glob,        { Globale Deklarationen }
  LoadSave,    { Laden und Speichern von Dateien }

  { Turbo Pascal Standard Units }
  App, Crt, Dialogs, MsgBox, Objects, StdDlg, Views;

var
  mes, s : string;

{-------------------------------------------------------------------}

{ Einlesen der Messdaten }
procedure ReadOut;

const
  timeout = 4;

var
  R        : TRect;
  DD       : PDialog;
  s1       : string;
  c, Taste : char;
  received : boolean;
  f        : Text;

begin
  Str(AnzahlMessung, s1);
  R.Assign(0, 0, 40, 10);
  DD := New(PDialog, Init(R, mes));
  with DD^ do
  begin
    Options := Options or ofCentered;
    R.Grow(-1, -1);
    Dec(R.B.Y, 3);
    Insert(New(PStaticText, Init(R, #13 + #3 + s + '. von ' + s1
      + ' Messungen' + #13 + #3 + 'Taste <PLOT> druecken' + #13 + #13
      + #3 + 'Abbruch mit <ESC>')));
  end;
  Desktop^.Insert(DD);

  Async_Init;
  if Async_Open(2, 9600, 'N', 8, 1) then
  begin
    FileName := FileName + '.' + ExtPlot;
    Assign(f, FileName);
    ReWrite(f);

    repeat
      received := Async_Buffer_Check(c);
      delay(timeout);
      if keypressed then Taste := readkey;
    until received or (Taste in [chr(27)]);

    if c = chr(17) then
      repeat
        received := Async_Buffer_Check(c);
        delay(timeout);
        if keypressed then Taste := readkey;
      until received or (Taste in [chr(27)]);

    Dispose(DD, Done);
    R.Assign(0, 0, 40, 10);
    DD := New(PDialog, Init(R, 'Messung'));
    with DD^ do
    begin
      Options := Options or ofCentered;
      R.Grow(-1, -1);
      Dec(R.B.Y, 3);
      Insert(New(PStaticText, Init(R,
        #13 + #3 + 'Daten werden eingelesen ...' + #13 + #13 + #13
        + #3 + 'Abbruch mit <ESC>')));
    end;
    Desktop^.Insert(DD);

    repeat
      Write(f, c);
      received := Async_Buffer_Check(c);
      delay(timeout);
      if keypressed then Taste := readkey;
    until not received or (Taste in [chr(27)]);

    Close(f);
  end;
  Async_Close;
  if Taste = chr(27) then Abbruch := true;
  Dispose(DD, Done);
end; { ReadOut }

{-------------------------------------------------------------------}

{ Dialog zur Messung bei einer Wegdifferenz }
procedure EineMessung;

var
  R                                     : TRect;
  D                                     : PDialog;
  Bruce                                 : PView;
  i, Messung, Command, ad, ad1, am, fnl : word;
  s1                                    : string;
  uebernehmen                           : array [0..2] of boolean;

begin
  repeat
    if Anzahldelta > 0 then ad1 := Anzahldelta - 1
    else
    begin
      ad1 := 0;
      df[0].int := 'i0';
      df[0].obj := 'o0';
      df[0].ref := 'r0';
      df[0].dark := 'd0';
      AnzahlMessung := 1;
      w[0].delta := 0;
    end;
    ad := Anzahldelta;

    { Parameter der letzten Messung }
    Messdaten.files[0] := df[ad1].int;
    Messdaten.files[1] := df[ad1].obj;
    Messdaten.files[2] := df[ad1].ref;
    Messdaten.files[3] := df[ad1].dark;
    Str(AnzahlMessung : 3, Messdaten.dates[0]);
    Str(w[ad1].delta : 9 : 3, Messdaten.dates[1]);

    { Eingabefenster }
    R.Assign(3, 4, 77, 19);
    D := New(PDialog,Init(R,'Messung'));
    D^.HelpCtx := hcMessung;
    with D^ do
    begin

      { Felder fuer Dateinamen}
      s1 := 'Dateinamen:';
      R.Assign(3, 2, 4 + Length(s1), 3);
      Insert(New(PStaticText, Init(R, s1)));

      R.Assign(23, 4, 33, 5);
      Bruce := New(PInputLine, Init(R, 8));
      Insert(Bruce);
      s1 := 'Interferenzmessung';
      R.Assign(2, 4, 3 + Length(s1), 5);
      Insert(New(PLabel, Init(R, s1, Bruce)));

      R.Assign(23, 6, 33, 7);
      Bruce := New(PInputLine, Init(R, 8));
      Insert(Bruce);
      s1 := 'Objektstrahl';
      R.Assign(2, 6, 3 + Length(s1), 7);
      Insert(New(PLabel, Init(R, s1, Bruce)));

      R.Assign(23, 8, 33, 9);
      Bruce := New(PInputLine, Init(R, 8));
      Insert(Bruce);
      s1 := 'Referenzstrahl';
      R.Assign(2, 8, 3 + Length(s1), 9);
      Insert(New(PLabel, Init(R, s1, Bruce)));

      R.Assign(23, 10, 33, 11);
      Bruce := New(PInputLine, Init(R, 8));
      Insert(Bruce);
      s1 := 'Nullintensitaet';
      R.Assign(2, 10, 3 + Length(s1), 11);
      Insert(New(PLabel, Init(R, s1, Bruce)));

      { Anzahl der Messungen }
      R.Assign(61, 4, 71, 5);
      Bruce := New(PInputLine, Init(R, 8));
      Insert(Bruce);
      s1 := 'Anzahl der Messungen';
      R.Assign(38, 4, 39 + Length(s1), 5);
      Insert(New(PLabel, Init(R, s1, Bruce)));

      { Wegdifferenz delta }
      R.Assign(61, 8, 71, 9);
      Bruce := New(PInputLine, Init(R, 8));
      Insert(Bruce);
      s1 := 'Wegdifferenz (cm)';
      R.Assign(38, 8, 39 + Length(s1), 9);
      Insert(New(PLabel, Init(R, s1, Bruce)));

      { Buttons }
      R.Assign(22, 12, 34, 14);
      Insert(New(PButton, Init(R, '~M~essung', cmOk, bfDefault)));
      R.Assign(40, 12, 52, 14);
      Insert(New(PButton, Init(R, '~E~nde', cmCancel, bfNormal)));

      { Messdaten einfuegen }
      SetData(Messdaten);

      Command := DeskTop^.ExecView(D);
      if Command <> cmCancel then
      begin
        { Messdaten einlesen }
        GetData(Messdaten);
        Ok := true;
        am := AnzahlMessung;
        df[ad].int := Messdaten.files[0];
        df[ad].obj := Messdaten.files[1];
        df[ad].ref := Messdaten.files[2];
        df[ad].dark := Messdaten.files[3];
        ValueI(Messdaten.dates[0], AnzahlMessung);
        ValueR(Messdaten.dates[1], w[ad].delta);
        Ok := Ok and (AnzahlMessung > 0) and (w[ad].delta >= 0);
        if Anzahldelta > 0 then
          if AnzahlMessung <> am then Ok := false;
        AnzahlMessung := am;
        if Ok then
        begin
          if df[ad].int = df[ad].obj then Ok := false;
          if df[ad].int = df[ad].ref then Ok := false;
          if df[ad].int = df[ad].dark then Ok := false;
          if df[ad].obj = df[ad].ref then Ok := false;
          if df[ad].obj = df[ad].dark then Ok := false;
          if df[ad].ref = df[ad].dark then Ok := false;
        end;
        if Ok then
        begin
          case AnzahlMessung of
            1     : fnl := 0;
            2..10 : fnl := 2;
            else fnl := 3;
          end;
          if Length(df[ad].int) > 8 - fnl then Ok := false;
          if Length(df[ad].obj) > 8 - fnl then Ok := false;
          if Length(df[ad].ref) > 8 - fnl then Ok := false;
          if Length(df[ad].dark) > 8 - fnl then Ok := false;
        end;
        if Ok then
          if Exists(Path + df[ad].int + '.' + ExtPlot) or
            Exists(Path + df[ad].int + '_0' + '.' + ExtPlot)
            then Ok := false;
        if Ok then
        begin
          for i := 0 to 2 do uebernehmen[i] := false;
          if Exists(Path + df[ad].obj + '.' + ExtPlot) or
            Exists(Path + df[ad].obj + '_0' + '.' + ExtPlot)
            then
            begin
              Ok := false;
              uebernehmen[0] := true;
            end;
          if uebernehmen[0] then if MessageBox(#3 +
            'Objekstrahlmessung existiert' + #13 + #13 + #3 +
            'Daten uebernehmen ?', nil, mfConfirmation or mfOkCancel)
            = cmOk then Ok := true;
        end;
        if Ok then
        begin
          if Exists(Path + df[ad].ref + '.' + ExtPlot) or
            Exists(Path + df[ad].ref + '_0' + '.' + ExtPlot)
            then
            begin
              Ok := false;
              uebernehmen[1] := true;
            end;
          if uebernehmen[1] then if MessageBox(#3 +
            'Referenzstrahlmessung existiert' + #13 + #13 + #3 +
            'Daten uebernehmen ?', nil, mfConfirmation or mfOkCancel)
            = cmOk then Ok := true;
        end;
        if Ok then
        begin
          if Exists(Path + df[ad].dark + '.' + ExtPlot) or
            Exists(Path + df[ad].dark + '_0' + '.' + ExtPlot)
            then
            begin
              Ok := false;
              uebernehmen[2] := true;
            end;
          if uebernehmen[2] then if MessageBox(#3 +
            'Dunkelmessung existiert' + #13 + #13 + #3 +
            'Daten uebernehmen ?', nil, mfConfirmation or mfOkCancel)
            = cmOk then Ok := true;
        end;
      end
      else Ok := false;

      if (Command = cmOk) and Ok then
      begin
        Abbruch := false;
        mes := 'Interferenzmessung';
        for Messung := 0 to AnzahlMessung - 1 do
        begin
          FileName := Path + df[ad].int;
          if AnzahlMessung > 1 then
          begin
            Str(Messung, s);
            FileName := FileName + '_' + s;
            Str(Messung + 1, s);
          end
          else s := '1';
          ReadOut;
          if Abbruch then Messung := AnzahlMessung - 1;
        end;
        mes := 'Objektstrahl';
        if not uebernehmen[0] and not Abbruch then
        begin
          for Messung := 0 to AnzahlMessung - 1 do
          begin
            FileName := Path + df[ad].obj;
            if AnzahlMessung > 1 then
            begin
              Str(Messung, s);
              FileName := FileName + '_' + s;
              Str(Messung + 1, s);
            end
            else s := '1';
            ReadOut;
            if Abbruch then Messung := AnzahlMessung - 1;
           end;
        end;
        mes := 'Referenzstrahl';
        if not uebernehmen[1] and not Abbruch then
        begin
          for Messung := 0 to AnzahlMessung - 1 do
          begin
            FileName := Path + df[ad].ref;
            if AnzahlMessung > 1 then
            begin
              Str(Messung, s);
              FileName := FileName + '_' + s;
              Str(Messung + 1, s);
            end
            else s := '1';
            ReadOut;
            if Abbruch then Messung := AnzahlMessung - 1;
          end;
        end;
        mes := 'Nullintensitaet';
        if not uebernehmen[2] and not Abbruch then
        begin
          for Messung := 0 to AnzahlMessung - 1 do
          begin
            FileName := Path + df[ad].dark;
            if AnzahlMessung > 1 then
            begin
              Str(Messung, s);
              FileName := FileName + '_' + s;
              Str(Messung + 1, s);
            end
            else s := '1';
            ReadOut;
            if Abbruch then Messung := AnzahlMessung - 1;
          end;
        end;
        if not Abbruch then inc(Anzahldelta);
      end;
      if (Command = cmOk) and not Ok then
        MessageBox(#3 + 'Eingabefehler:' + #13 + #3
          + 'Dateiname existiert, doppelt,' + #13 + #3
          + 'zu lang ? Werte ungueltig ?' + #13 + #3
          + 'Anzahl der Messungen veraendert ?',
          nil, mfError or mfOkButton);
    end;
    Dispose(D, Done);
  until (Command = cmCancel);
end; { EineMessung }

{-------------------------------------------------------------------}

{ Dialog zur Auswahl der Protokolldatei }
procedure Messdialog;

var
  R       : TRect;
  D       : PFileDialog;
  Command : word;
  fnsave  : string;

begin
  Extens := '*.' + ExtDaten;
  Ok := false;
  repeat
    D := New(PFileDialog, Init(Extens, 'Protokolldatei',
      '~N~ame (*.DAT)', fdOkButton, fdReplaceButton));
    Command := Desktop^.ExecView(D);
    if Command <> cmCancel then
    begin
      D^.GetFileName(FileName);
      if Exists(FileName) then
      begin
        if MessageBox(#3 + 'Datei existiert !' + #13 + #3
          + 'Messungen zufuegen ?', nil, mfInformation or mfOkCancel)
          = cmOk then
        begin
          LoadDatFile;
          Ok := true;
        end;
      end
      else
      begin
        Anzahldelta := 0;
        Ok := true
      end;
    end
    else Ok:= true;
    Dispose(D, Done);
  until Ok = true;
  if Command <> cmCancel then
  begin
    fnsave := FileName;
    Path := copy(FileName, 0, Length(FileName) - 4);
    repeat
      Path := copy(Path, 0, Length(Path) - 1);
      s := copy(Path, Length(Path), Length(Path));
    until s = '\';
    repeat
      EineMessung;
    until MessageBox(#13 + #3 + 'weitere Messung ?', nil,
      mfConfirmation or mfOkCancel) = cmCancel;
    FileName := fnsave;
    if Anzahldelta > 0 then SaveDatFile;
  end;
end; { Messdialog }

{-------------------------------------------------------------------}

end. { MessU }

{-------------------------------------------------------------------}

next up previous contents
Nächste Seite: 9.4 Unit ASync4U1 Aufwärts: 9. Programmlisting Vorherige Seite: 9.2 Unit Glob   Inhalt
Udo Becker
2000-01-02