Nächste Seite: 9.4 Unit ASync4U1
Aufwärts: 9. Programmlisting
Vorherige Seite: 9.2 Unit Glob
  Inhalt
{-------------------------------------------------------------------}
{ 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 }
{-------------------------------------------------------------------}
Nächste Seite: 9.4 Unit ASync4U1
Aufwärts: 9. Programmlisting
Vorherige Seite: 9.2 Unit Glob
  Inhalt
Udo Becker
2000-01-02