File: DIFRKMTY\A_INTERN.CPP
1 //##############################################################################
2 // //
3 // A_INTERN.CPP //
4 // //
5 // Subsystem: Diffraktometrie/ Reflektometrie //
6 // intern genutzte Fenster für AreaScan //
7 // Benutzung durch andere Subsysteme erforderlich: NEIN //
8 // //
9 //##############################################################################
10 //! Kommentierung und Aenderungen B. Buss, 2000/2001, HUB IfI
11
12 #include <direct.h>
13
14 #include "internls\evrythng.h" // GermanVersion
15 #include "winresrc\rc_def.h" // Ressourcen-IDs
16 #include "help\help_def.h" // Help-IDs
17 #pragma hdrstop
18
19 #include "difrkmty\a_intern.h" // SCHNITTSTELLE für diese Datei
20 #include "difrkmty\a_extern.h" // TAreaScanWindow
21 #include "internls\l_layer.h" // für extern lpDBase
22
23 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
24
25 __declspec(dllimport) LPDataBase lpDBase; // aus L_LAYER.CPP
26
27 //#############################################################################
28 // globale Typen und Konstanten
29 //#############################################################################
30
31 const UINT _RELATIONDIGITS= 2;
32 const UINT _MAXTIMEDIGITS= 1;
33
34 //#############################################################################
35 // sprachspezifische Konstanten
36 //#############################################################################
37
38 #ifdef GermanVersion
39 static const char szDlgFailure[]= "Fehler";
40 static const char szDlgMessage[]= "Meldung";
41 static const char szInfoType0[]= " Meßdetektor";
42 static const char szInfoType1[]= "Integrale Intensität";
43 static const char szInfoType2[]= " Absorberposition";
44 static const char szInfoType3[]= " Monitor-Intensität";
45 static const char szInfoType4[]= " reale Meßzeit";
46 static const char szDlgMsgLine001[]= "Kein gültiger Scantyp";
47 static const char szDlgMsgLine002[]= "Vorgang bitte wiederholen !";
48 static const char szDlgMsgLine003[]= "kein Absorber verfügbar";
49 static const char szDlgMsgLine004[]= "gültige Kanalnummern: 0 bis %d";
50 static const char szDlgMsgLine005[]= "Bereichsüberschreitung (Omega)";
51 static const char szDlgMsgLine006[]= "Bereichsüberschreitung (Theta)!\n\nMinimum %s ist ungültig.";
52 static const char szDlgMsgLine007[]= "Bereichsüberschreitung (Theta)!\n\nMaximum %s ist ungültig.";
53
54 static const char szDlgMsgLine100[]= "Datei existiert bereits !\r\nüberschreiben ?";
55 static const char szDlgMsgLine101[]= "Probleme beim Anlegen der Datei !";
56 static const char szDlgMsgLine102[]= "Bitte mit der Maus eine Linie festlegen.";
57 static const char szDlgMsgLine103[]= "Kein Monitor";
58 static const char szDlgMsgLine104[]= "Datenbasis-Datei wählen";
80 #endif
81
82 //##############################################################################
83 // TSetupAreaScanDlg
84 //##############################################################################
85
86 TSetupAreaScanDlg::TSetupAreaScanDlg( TAreaScanWindow *aScan ) : TModalDlg( "AREASCANPARAMETERS", GetMainInstance() ), Areascan(0)
87 {
88 //! einige Parameter vom AreaScan-fenster uebernehmen
89 Areascan= aScan;
90 nOmega= Areascan->nOmega;
91 nTheta= Areascan->nTheta;
92 //JP 12.08.2002 nOldMotor= mlGetAxis();
93 hDetectorList= 0;
94 d2ThetaStart= Areascan->d2ThetaStart;
95 //! o-t-offset aus AreaScanfenster holen
96 dThetaOffset= Areascan->dOffsetTheta;
97 dOmegaOffset= Areascan->dOffsetOmega;
98 mlSetAxis( nTheta );
99 };
100 //*****************************************************************************
101
102 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box
103 //! Rueckkehrcode immer true
104 BOOL TSetupAreaScanDlg::Dlg_OnInit( HWND, HWND hwndCtl, LPARAM lParam )
105 {
106 CtrlSetDouble(id_2Theta, d2ThetaStart, mlGetDigits(nTheta), _DECIMAL); // 12.06.2003 hier wurde immer eine Nachkommastellengenauigkeit von 4 verwendet?!
107 //! FIX Fehler 74
108 if (!mlIsAxisValid(Theta))
109 {
110 Areascan->eScanType= stStandardScan;
111 CtrlSetEnabled(id_2Theta, FALSE);
112 }
113 //! Werte fuer Checkboxen 'Save on Ready' und 'Using Absorber' setzen
114 CheckDlgButton( GetHandle(), id_SaveOnReady, Areascan->bSaveOnReady );
115 //! nur wenn absorber exist diesen ev. aktivieren
116 if (mlIsAxisValid(Absorber))
117 CheckDlgButton( GetHandle(), id_AbsorberUsed, Areascan->ReportUse.bAbsorber );
118 //! diverse Werte in Dialogbox setzen
119 CtrlSetDouble(id_MaxTime, Areascan->fMaxTime, _MAXTIMEDIGITS, _DECIMAL);
120 //! Fehler id_ThetaUnit existiert nicht
121 CtrlSetText(id_ThetaUnit, mlGetUnitName(nTheta));
122 mlSetAxis( nOmega );
123 CtrlSetText(id_Unit, mGetUnitName());
124 CtrlSetDouble(id_AngleMin, Areascan->dOmegaMin, mlGetDigits(nOmega), _DECIMAL);
125 CtrlSetDouble(id_AngleMax, Areascan->dOmegaMax, mlGetDigits(nOmega), _DECIMAL);
126 CtrlSetLong(id_MaxCounts, Areascan->dwMaxCounts);
127 CheckDlgButton( GetHandle(), id_Standard,
128 Areascan->eSaveFormat == ffStandardFile );
129 // CheckDlgButton( GetHandle(), id_DIB_Format, Areascan->eSaveFormat == Bitmap );
130 CheckDlgButton( GetHandle(), id_SaveContinuous, Areascan->bSaveContinuous );
131 //! FIX Fehler 38
132 CtrlSetDouble(id_AngleWidth, Areascan->dOmegaWidth, mlGetDigits(nOmega)+1, _DECIMAL);
133 CtrlSetText(id_Catalog, Areascan->szDataPath);
134 CtrlSetDouble(id_Relation, Areascan->dMoveRelation, _RELATIONDIGITS, _DECIMAL);
135
136 //! neu akk
137 //! einstellen der Art der Darstellungsaktualisierung
138 CheckDlgButton( GetHandle(), id_Final, !Areascan->bAccumulatedDisplay );
139 CheckDlgButton( GetHandle(), id_Akkumulation, Areascan->bAccumulatedDisplay );
140
141 //! aufnehmen aller verfuegbaren Detektoren in Combobox und vorauswahl des
142 //! aktuell eingestellten Det.
143 hDetectorList= GetDlgItem( GetHandle(), id_ChooseDetector );
144 TDetectorManager::DetectorManager().FillDetectorComboBox( hDetectorList);
145 ComboBox_SelectString( hDetectorList, 0 , Areascan->GetDetector()->GetCharacteristic() );
146
147 //! aufnehmen aller verfuegbaren Detektoren in Combobox
148 HWND hMonitorList= GetDlgItem( GetHandle(), id_ChooseMonitor );
149
150 ComboBox_AddString( hMonitorList, szDlgMsgLine103 );
151 TDetectorManager::DetectorManager().FillDetectorComboBox( hMonitorList);
152
153 if (Areascan->GetMonitor() != 0)
154 ComboBox_SelectString( hMonitorList, 0 , Areascan->GetMonitor()->GetCharacteristic() );
155 else
156 ComboBox_SelectString( hMonitorList, 0 , szDlgMsgLine103 );
157
158 //! bewirkt aufruf von Dlg_OnCommand mit den Kommandos cm_ParamSet und
159 //! cm_SetupParameters
160 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage );
161 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, hwndCtl, 0, SendMessage );
162 //! Focus auf OK-Button der Box
163 CtrlSetFocus( IDOK );
164
165 // HotKey's für Hilfe
166 LoadHotKeys( LoadAccelerators(GetMainInstance(), MAKEINTRESOURCE(ACC_SetupAreaScanDlg)) ); // Accelerator aus Ressourcen laden
167 return TRUE;
168 };
169 //*****************************************************************************
170
171 //! behandelt Kommandos in der Dialogbox
172 void TSetupAreaScanDlg::Dlg_OnCommand( HWND, int id, HWND hwndCtl, UINT codeNotify )
173 {
174 //! abhaengig von Dialogelement bzw. Kommando
175 switch ( id )
176 {
177 case cm_Help:
178 WinHelp(GetHandle(), GetHelpFile(), HELP_CONTEXT, Help_SetupAreaScanDlg);
179 break;
180
181 //! initialisierung
182 case cm_ParamSet:
183 OnParamSet(GetHandle());
184 break;
185
186 //! 'Update Parameters'-Button betaetigt
187 case cm_SetupParameters:
188 FORWARD_WM_COMMAND( GetHandle(), cm_InquireRelevantData, hwndCtl, 0, SendMessage );
189 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage );
190 break;
191
192 //! uebernehmen von einigen Dialogeintraegen ohne pruefung (fehler)
193 //! 'Data Catalog','Save each Scan',Omegaschrittweite,Thetarelation,
194 //! Speicherformat
195 case cm_InquireRelevantData:
196 OnInquireRelevantData();
197 break;
198
199 //! Detektor-auswahlbox angewaehlt
200 case id_ChooseDetector:
201 OnChooseDetector(GetHandle(), hwndCtl, codeNotify);
202 break;
203
204 case id_ChooseMonitor:
205 OnChooseMonitor(codeNotify);
206 break;
207
208 //! 'Detector Settings'-Button betaetigt
209 //! bewirkt Aufruf der zum eingestellten Detekt. gehoerigen Settingsbox
210 //! und uebernahme der akt. Einstellungen ohne pruefung
211 case cm_SpecificParameters:
212 // spezifische Parameter fuer einen Sensor setzen
213 if ( Areascan->GetDetector()->RunSpecificParametersDlg( Areascan->GetHandle() ) )
214 FORWARD_WM_COMMAND( GetHandle( ), cm_ActivateChanges, 0, 0, PostMessage ); // Dialog in den Vordergrund verschieben
215 else
216 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, SendMessage ); // Parameter aktualisieren und anzeigen
217 break;
218
219 //! FIX Fehler 74
220 case id_FixThetaAxis:
221 OnFixThetaAxis();
222 break;
223
224 //! anclicken der folgenden Dialogelemente bewirkt uebernahme der akt.
225 //! Einstellungen ohne pruefung
226
227 /*case id_DIB_Format:
228 case id_Standard:
229 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, PostMessage );
230 break;*/
231
232 //! neu akk
233 //! exclusives oder bei aktualisierungsoptionen
234 case id_Akkumulation:
235 CheckDlgButton(GetHandle(), id_Final, FALSE);
236 break;
237
238 case id_Final:
239 CheckDlgButton(GetHandle(), id_Akkumulation, FALSE);
240 break;
241
242 //! FIX Fehler 71
243 case id_SaveContinuous:
244 CheckDlgButton(GetHandle(), id_SaveOnReady, FALSE);
245 break;
246
247 case id_SaveOnReady:
248 CheckDlgButton(GetHandle(), id_SaveContinuous, FALSE);
249 break;
250
251 //! auswaehlen von absorberbenutz. nur eraubt wenn absorber exist.
252 case id_AbsorberUsed:
253 if (!mlIsAxisValid(Absorber))
254 {
255 MessageBox(szDlgMsgLine003, szDlgFailure, MBINFO);
256 CtrlSetChecked(id_AbsorberUsed, FALSE);
257 }
258 break;
259
260 default:
261 TModalDlg::Dlg_OnCommand( GetHandle(), id, hwndCtl, codeNotify );
262 }
263 };
264 //*****************************************************************************
265
266 void TSetupAreaScanDlg::OnParamSet(HWND)
267 {
268 CtrlSetEnabled(cm_SpecificParameters, Areascan->GetDetector()->HasSpecificParametersDlg() );
269
270 //! abhaengig vom Scantyp einige Dialogelemente sperren bzw. freigeben
271 switch ( Areascan->eScanType )
272 {
273 case stOmega2ThetaScan:
274 CtrlSetEnabled(id_Relation, TRUE );
275 //! abhaengig ob PSD verfuegbar oder nicht Dialogelemente sperren
276 //! bzw. freigeben
277 //! FIX Fehler 53
278 CheckDlgButton( GetHandle(), id_FixThetaAxis, FALSE );
279 if ( Areascan->GetPsd() != 0 )
280 {
281 //! FIX Fehler 59
282 CtrlSetEnabled(id_MaxCounts, FALSE);
283 //! FIX Fehler 55
284 CtrlSetEnabled(id_AbsorberUsed, TRUE );
285 CtrlSetEnabled(id_FixThetaAxis, TRUE );
286 CtrlSetEnabled(id_ThetaWidth, FALSE );
287 CtrlSetEnabled(id_ThetaWindow, FALSE );
288 Areascan->nAddedChannels= Areascan->GetPsd()->GetAddedChannels();
289 CtrlSetDouble(id_ThetaWidth, Areascan->GetPsd()->GetWidth(), Areascan->GetPsd()->GetAngleStepDigits(), _DECIMAL); // 17.06.2003 hier wurde eine Nachkommastellengenauigkeit von 3 verwendet
290 //! neu akk
291 //! bei psd Darstellungsaktualisierungmodus erlaubt
292 CtrlSetEnabled(id_Akkumulation, TRUE );
293 CtrlSetEnabled(id_Final, TRUE );
294
295 }
296 else
297 {
298 //! FIX Fehler 59
299 CtrlSetEnabled(id_MaxCounts, TRUE);
300 //! FIX Fehler 55
301 CtrlSetEnabled(id_AbsorberUsed, FALSE);
302 CheckDlgButton(GetHandle(), id_AbsorberUsed, FALSE);
303 //! FIX Fehler 53
304 CtrlSetEnabled(id_FixThetaAxis, FALSE );
305 CtrlSetEnabled(id_ThetaWindow, TRUE );
306 CtrlSetEnabled(id_ThetaWidth, TRUE );
307 CtrlSetDouble(id_ThetaWindow, Areascan->dThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL);
308 CtrlSetDouble(id_ThetaWidth, Areascan->dThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL);
309 //! neu akk
310 //! bei 0-dim. detektor Darstellungsaktualisierungmodus nicht
311 //! erlaubt
312 CtrlSetEnabled(id_Akkumulation, FALSE );
313 CtrlSetEnabled(id_Final, FALSE );
314 CheckDlgButton( GetHandle(), id_Akkumulation , FALSE);
315 CheckDlgButton( GetHandle(), id_Final , TRUE);
316 }
317 break;
318
319 case stStandardScan:
320 //! FIX Fehler 59
321 CtrlSetEnabled(id_MaxCounts, FALSE);
322 //! FIX Fehler 55
323 CtrlSetEnabled(id_AbsorberUsed, TRUE );
324 CheckDlgButton( GetHandle(), id_FixThetaAxis, TRUE );
325 CtrlSetEnabled(id_FixThetaAxis, TRUE );
326 CtrlSetEnabled(id_ThetaWindow, FALSE );
327 CtrlSetEnabled(id_ThetaWidth, FALSE );
328 CtrlSetEnabled(id_Relation, FALSE );
329
330 Areascan->nAddedChannels= Areascan->GetPsd()->GetAddedChannels();
331 CtrlSetDouble(id_ThetaWidth, Areascan->GetPsd()->GetWidth(), Areascan->GetPsd()->GetAngleStepDigits(), _DECIMAL);
332 CtrlSetDouble(id_ThetaWindow, Areascan->dThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL);
333 //! neu akk
334 //! bei psd Darstellungsaktualisierungmodus erlaubt
335 CtrlSetEnabled(id_Akkumulation, TRUE );
336 CtrlSetEnabled(id_Final, TRUE );
337 break;
338
339 default:
340 MessageBox( szDlgMsgLine001, szDlgFailure, MBSTOP );
341 break;
342 }
343 };
344 //*****************************************************************************
345
346 void TSetupAreaScanDlg::OnInquireRelevantData()
347 {
348 BOOL bValid= TRUE;
349 CtrlGetText(id_Catalog, Areascan->szDataPath, MaxString);
350 Areascan->bSaveContinuous= IsDlgButtonChecked( GetHandle(),
351 id_SaveContinuous );
352 // Bestimmen der Schrittweite und Schrittrelation
353 Areascan->dOmegaWidth= CtrlGetDouble(id_AngleWidth, mlGetDigits(nOmega)+1, _DECIMAL, bValid);
354 Areascan->dMoveRelation= CtrlGetDouble(id_Relation, _RELATIONDIGITS, _DECIMAL, bValid);
355 //! uebernahme von Scantyp und abhaengig davon weitere werte
356 switch ( Areascan->eScanType )
357 {
358 case stOmega2ThetaScan:
359 if ( Areascan->GetPsd() != 0)
360 {
361 if ( IsDlgButtonChecked( GetHandle(), id_FixThetaAxis ) )
362 {
363 Areascan->eScanType= stStandardScan;
364 break;
365 }
366 CtrlSetDouble(id_ThetaWidth, Areascan->dMoveRelation * Areascan->dOmegaWidth, mlGetDigits(nTheta)+1, _DECIMAL);
367 }
368 else
369 {
370 Areascan->dThetaWindow= CtrlGetDouble(id_ThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL, bValid);
371 Areascan->dThetaWidth= CtrlGetDouble(id_ThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL, bValid);
372 }
373 break;
374
375 case stStandardScan:
376 if ( !IsDlgButtonChecked( GetHandle(), id_FixThetaAxis ) )
377 {
378 Areascan->eScanType= stOmega2ThetaScan;
379 if ( Areascan->GetPsd() != 0)
380 {
381 CtrlSetDouble(id_ThetaWidth, Areascan->dMoveRelation * Areascan->dOmegaWidth, mlGetDigits(nTheta)+1, _DECIMAL);
382 }
383 }
384 break;
385
386 default:
387 MessageBox( szDlgMsgLine001, szDlgFailure, MBSTOP );
388 }
389 Areascan->eSaveFormat= ffStandardFile;
390 //! if ( IsDlgButtonChecked( GetHandle(), id_DIB_Format ) )
391 //! Areascan->eSaveFormat= Bitmap;
392 //! if ( IsDlgButtonChecked( GetHandle(), id_Standard ) )
393 //! Areascan->eSaveFormat= StandardFile;
394 };
395 //*****************************************************************************
396
397 void TSetupAreaScanDlg::OnChooseDetector(HWND, HWND hwndCtl, UINT codeNotify )
398 {
399 if ( codeNotify == CBN_SELCHANGE )
400 {
401 //! wenn neuer det. ausgewaehlt, dann diesen als aktuellen Det.
402 //! setzen und neuinitialisierung (cm_ParamSet)
403 int idx= ComboBox_GetCurSel( hDetectorList );
404
405 if (idx == CB_ERR)
406 return;
407
408 TDetector* newDetector= TDetectorManager::DetectorManager().GetDetector(idx);
409
410 if ( Areascan->GetDetector() != newDetector )
411 {
412 Areascan->SetDetector(newDetector);
413 //! FIX Fehler 74
414 if (Areascan->GetPsd() != 0)
415 {
416 Areascan->eScanType= stStandardScan;
417 }
418 else
419 {
420 if (mlIsAxisValid(Theta) == FALSE)
421 {
422 Areascan->SetDetector( TDetectorManager::DetectorManager().GetDetector( 0, 1) );
423 ComboBox_SelectString( hDetectorList, 0, Areascan->GetDetector()->GetCharacteristic() );
424 }
425 else
426 {
427 Areascan->eScanType= stOmega2ThetaScan;
428 }
429 }
430 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, PostMessage );
431 }
432 }
433 };
434 //*****************************************************************************
435
436 void TSetupAreaScanDlg::OnFixThetaAxis()
437 {
438 if (!mlIsAxisValid(Theta))
439 CheckDlgButton(GetHandle(), id_FixThetaAxis, TRUE);
440
441 //! 2thetawert bei fixierter Thetaachse vorgeben wenn Theta exist.
442 if (IsDlgButtonChecked( GetHandle(), id_FixThetaAxis ))
443 {
444 if (mlIsAxisValid(Theta))
445 {
446 double dPos;
447 mlGetDistance(nTheta, dPos);
448 CtrlSetDouble(id_2Theta, dPos, mlGetDigits(nTheta), _DECIMAL);
449 }
450 else
451 CtrlSetText(id_2Theta, " ");
452 }
453 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, PostMessage );
454 };
455 //*****************************************************************************
456
457 void TSetupAreaScanDlg::OnChooseMonitor(UINT codeNotify )
458 {
459 if ( codeNotify == CBN_SELCHANGE )
460 {
461 int idx= ComboBox_GetCurSel( GetDlgItem( GetHandle(), id_ChooseMonitor ) );
462
463 if (idx == CB_ERR)
464 return;
465
466 // Ersten Eintrag "Kein Monitor" beruecksichtigen
467 if (idx == 0)
468 {
469 Areascan->SetMonitor(0);
470 return;
471 }
472 idx--;
473
474 TDetector* newMonitor= TDetectorManager::DetectorManager().GetDetector( idx );
475 if ( Areascan->GetDetector() != newMonitor )
476 Areascan->SetMonitor(newMonitor);
477 }
478 };
479 //*****************************************************************************
480
481 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor verlassen der
482 //! Dialogbox (durch OK-Button)
483 //! Rueckkehrcode false wenn die Dialogbox nicht geschlossen werden kann (werte
484 //! inkonsistent) sonst true
485 BOOL TSetupAreaScanDlg::CanClose( void )
486 {
487 char buf[ MaxString ];
488 BOOL bValid= TRUE;
489 float valueF;
490 long valueL;
491 BOOL bFailure= FALSE;
492 //! lokale Wert fuer o-t-offset
493 double dTO= dThetaOffset, dOO= dOmegaOffset;
494
495 //! uebernehmen von einigen werten ohne pruefung
496 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, SendMessage );
497 //! uebernahme der CheckButtons 'Save on Ready' und 'Using Absorber'
498 Areascan->bSaveOnReady= IsDlgButtonChecked( GetHandle(), id_SaveOnReady );
499 Areascan->ReportUse.bAbsorber= IsDlgButtonChecked( GetHandle(), id_AbsorberUsed );
500 //! o-t-offset verwenden bzw. nicht verwenden
501 switch (Areascan->eScanType)
502 {
503 case stStandardScan:
504 dTO= 0.0;
505 break;
506
507 case stOmega2ThetaScan:
508 dTO= dOO= 0.0;
509 break;
510 }
511 //! Psd-spezifische parameter
512 if (Areascan->GetPsd() != 0)
513 {
514 //! neu akk
515 //! art der darstellungsaktualisierung an Scanfenster uebergeben
516 Areascan->bAccumulatedDisplay= IsDlgButtonChecked( GetHandle(), id_Akkumulation );
517 }
518
519 //! uebernahme des Omega-Maximum mit Pruefung, ob der Wert kleiner als der
520 //! maximal erlaubte
521 //! wenn Wert nicht kleiner als der max. erlaubte dann auf
522 //! Max.Wert-Schrittweite setzen + Setzen des korrekten Wertes fuer
523 //! Theta-Window? (Fehler) + Box wird nicht verlassen
524 valueF= CtrlGetDouble(id_AngleMax, mlGetDigits(nOmega), _DECIMAL, bValid);
525 //! FIX Fehler 50,52
526 if (!bValid) bFailure= TRUE;
527 else if ( (valueF + dOO < mlGetValue( nOmega, MaxDistanceRel )) &&
528 (valueF + dOO > mlGetValue( nOmega, MinDistanceRel )))
529 Areascan->dOmegaMax= valueF;
530 else
531 {
532 Areascan->dOmegaMax= ( mlGetValue( nOmega, MaxDistanceRel ) -
533 mlGetValue( nOmega, MinWidth ) );
534 CtrlSetDouble(id_AngleMax, Areascan->dOmegaMax, mlGetDigits(nOmega), _DECIMAL);
535 MessageBox(szDlgMsgLine005, szDlgMessage, MBINFO);
536 CtrlSetFocus(id_AngleMax);
537 bFailure= TRUE;
538 }
539
540 //! uebernahme des Omega-Minimum mit Pruefung, ob der Wert groesser als der
541 //! maximal erlaubte
542 //! wenn Wert nicht groesser als der max. erlaubte dann auf
543 //! Min.Wert+Schrittweite setzen + Setzen des korrekten Wertes fuer
544 //! Minimum + Box wird nicht verlassen
545 valueF= CtrlGetDouble(id_AngleMin, mlGetDigits(nOmega), _DECIMAL, bValid);
546 //! FIX Fehler 50
547 if (!bValid) bFailure= TRUE;
548 else if ( (valueF + dOO < mlGetValue( nOmega, MaxDistanceRel )) &&
549 ( valueF + dOO > mlGetValue( nOmega, MinDistanceRel ) ))
550 Areascan->dOmegaMin= valueF;
551 else
552 {
553 Areascan->dOmegaMin= ( mlGetValue( nOmega, MinDistanceRel ) +
554 mlGetValue( nOmega, MinWidth ) );
555 CtrlSetDouble(id_AngleMin, Areascan->dOmegaMin, mlGetDigits(nOmega), _DECIMAL);
556 MessageBox(szDlgMsgLine005, szDlgMessage, MBINFO);
557 CtrlSetFocus(id_AngleMin);
558 bFailure= TRUE;
559 }
560 //! FIX Fehler 50,52
561 if (Areascan->dOmegaMin >= Areascan->dOmegaMax)
562 {
563 valueF= Areascan->dOmegaMax;
564 Areascan->dOmegaMax= Areascan->dOmegaMin;
565 CtrlSetDouble(id_AngleMax, Areascan->dOmegaMax, mlGetDigits(nOmega), _DECIMAL);
566 Areascan->dOmegaMin= valueF;
567 CtrlSetDouble(id_AngleMin, Areascan->dOmegaMin, mlGetDigits(nOmega), _DECIMAL);
568 CtrlSetFocus(id_AngleMin);
569 bFailure= TRUE;
570 }
571
572 //! 2theta aus Dialogbox wird fuer bereichsuebrschreitungstests gebraucht
573 d2ThetaStart= CtrlGetDouble(id_2Theta, mlGetDigits(nTheta), _DECIMAL, bValid);
574 if (!bValid) bFailure= TRUE;
575 //!FIX Fehler 60
576 switch (Areascan->eScanType)
577 {
578 case stOmega2ThetaScan:
579 //! Relation ermitteln
580 valueF= CtrlGetDouble(id_Relation, _RELATIONDIGITS, _DECIMAL, bValid);
581 if (!bValid) bFailure= TRUE;
582 else if ( valueF>0 )
583 Areascan->dMoveRelation= valueF;
584 else {
585 Areascan->dMoveRelation= 2;
586 CtrlSetDouble(id_Relation, Areascan->dMoveRelation, _RELATIONDIGITS, _DECIMAL);
587 MessageBeep(0);
588 CtrlSetFocus(id_Relation);
589 bFailure= TRUE;
590 }
591
592 if ( Areascan->GetPsd() == 0 )
593 {
594 //! uebernahme des Theta-Window mit Pruefung, ob der
595 //! Wert groesser 0 wenn nicht, setzen auf
596 //! (OmegaMax-OmegaMin)*Relation + eintragen des
597 //! entsprechenden Wertes in Dlg.Box + Box wird nicht
598 //! verlassen
599 valueF= CtrlGetDouble(id_ThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL, bValid);
600 //! FIX Fehler 50
601 if (!bValid) bFailure= TRUE;
602 else if ( valueF>0 )
603 Areascan->dThetaWindow= valueF;
604 else
605 {
606 Areascan->dThetaWindow= ( Areascan->dOmegaMax - Areascan->dOmegaMin ) *
607 Areascan->dMoveRelation;
608 CtrlSetDouble(id_ThetaWindow, Areascan->dThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL);
609 MessageBeep(0);
610 CtrlSetFocus(id_ThetaWindow);
611 bFailure= TRUE;
612 }
613
614 //! uebernahme der Theta-Schrittweite mit Pruefung, ob der Wert ungleich 0
615 //! (Fehler) wenn nicht, setzen auf OmegaSchrittweite*Relation + eintragen
616 //! des entsprechenden Wertes in Dlg.Box + Box wird nicht verlassen
617 valueF= CtrlGetDouble(id_ThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL, bValid);
618 //! FIX Fehler 50
619 if (!bValid) bFailure= TRUE;
620 else if ( valueF>0 )
621 Areascan->dThetaWidth= valueF;
622 else
623 {
624 Areascan->dThetaWidth= Areascan->dOmegaWidth * Areascan->dMoveRelation;
625 CtrlSetDouble(id_ThetaWidth, Areascan->dThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL);
626 MessageBeep(0);
627 CtrlSetFocus(id_ThetaWidth);
628 bFailure= TRUE;
629 }
630
631 //! uebernahme der Messimpulse mit Pruefung, ob der Wert ungleich 0 (Fehler)
632 //! wenn nicht, wird Box wird nicht verlassen
633 valueL= CtrlGetLong(id_MaxCounts, bValid);
634 //! FIX Fehler 50
635 if (!bValid) bFailure= TRUE;
636 else if ( valueL>0 )
637 Areascan->dwMaxCounts= valueL;
638 else {
639 Areascan->dwMaxCounts= 1;
640 CtrlSetLong(id_MaxCounts, Areascan->dwMaxCounts);
641 MessageBeep(0);
642 CtrlSetFocus(id_MaxCounts);
643 bFailure= TRUE;
644 }
645
646 Areascan->ReportUse.bTime= FALSE;
647 Areascan->ReportUse.bIntegral= FALSE;
648 //! test ob Thetabereichsueberschreitung bei sld
649 if (!bFailure)
650 {
651 valueF= d2ThetaStart - 0.5*Areascan->dThetaWindow;
652 if ( ((valueF + dTO) <= mlGetValue(nTheta, MaxDistanceRel)) &&
653 ((valueF + dTO) >= mlGetValue(nTheta, MinDistanceRel)) )
654 {
655 Areascan->dThetaMin= valueF;
656 //! Thetawinkel fuer letzten punkt des letzten spektrums
657 //! ermitteln + test ob dieser wert gueltig
658 valueF= d2ThetaStart + (Areascan->dOmegaMax - Areascan->dOmegaMin) *
659 Areascan->dMoveRelation + 0.5 * Areascan->dThetaWindow;
660
661 if ( valueF + dTO <= mlGetValue(nTheta, MaxDistanceRel) )
662 Areascan->d2ThetaStart= d2ThetaStart;
663 else
664 {
665 char buf2[_MAXLENDOUBLE];
666 Double2String(buf2, valueF, mlGetDigits(nTheta), FALSE, _DECIMAL);
667 sprintf(buf, szDlgMsgLine007, buf2);
668 MessageBox(buf, szDlgMessage, MBINFO);
669 CtrlSetFocus(id_Relation);
670 bFailure= TRUE;
671 }
672 }
673 else
674 {
675 char buf2[_MAXLENDOUBLE];
676 Double2String(buf2, valueF, mlGetDigits(nTheta), FALSE, _DECIMAL);
677 sprintf(buf, szDlgMsgLine006, buf2);
678 MessageBox(buf, szDlgMessage, MBINFO);
679 CtrlSetFocus(id_2Theta);
680 bFailure= TRUE;
681 }
682
683 }
684 }
685 else //! O2T-Scan mit Psd
686 {
687 //! test Thetabereichsueberschreitung O2T mit Psd
688 if (!bFailure)
689 {
690 if ( ((d2ThetaStart + dTO) >= mlGetValue(nTheta, MinDistanceRel)) &&
691 ((d2ThetaStart + dTO) <= mlGetValue(nTheta, MaxDistanceRel)) )
692 {
693 Areascan->d2ThetaStart= d2ThetaStart;
694 //! ermitteln des Thetawinkel fuer letztes Spektrum + test ob
695 //! Bereichsueberschreitung
696 valueF= d2ThetaStart + (Areascan->dOmegaMax - Areascan->dOmegaMin) *
697 Areascan->dMoveRelation;
698 if ( ((valueF + dTO) >= mlGetValue(nTheta, MinDistanceRel)) &&
699 ((valueF + dTO) <= mlGetValue(nTheta, MaxDistanceRel)) )
700 {
701 Areascan->dThetaMax= valueF; Areascan->dThetaMin= d2ThetaStart;
702 }
703 else
704 {
705 char buf2[_MAXLENDOUBLE];
706 Double2String(buf2, valueF, mlGetDigits(nTheta), FALSE, _DECIMAL);
707 sprintf(buf, szDlgMsgLine007, buf2);
708 MessageBox(buf, szDlgMessage, MBINFO);
709 CtrlSetFocus(id_Relation);
710 bFailure= TRUE;
711 }
712 }
713 else
714 {
715 char buf2[_MAXLENDOUBLE];
716 Double2String(buf2, d2ThetaStart, mlGetDigits(nTheta), FALSE, _DECIMAL);
717 sprintf(buf, szDlgMsgLine006, buf2);
718 MessageBox(buf, szDlgMessage, MBINFO);
719 CtrlSetFocus(id_2Theta);
720 bFailure= TRUE;
721 }
722
723 }
724 //! bei Psd diese infos immer anlegen
725 Areascan->ReportUse.bTime= TRUE;
726 Areascan->ReportUse.bIntegral= TRUE;
727
728 }
729 break;
730
731 case stStandardScan: //! bei Psd diese infos immer anlegen
732 Areascan->ReportUse.bTime= TRUE;
733 Areascan->ReportUse.bIntegral= TRUE;
734
735 //! test Thetabereichsueberschreitung StandardScan
736 if (!bFailure)
737 //! test ob Theta exist. wenn ja wert testen+ ev.uebernehmen
738 //! sonst nicht
739 if ( mlIsAxisValid(Theta) )
740 if ( (d2ThetaStart >=mlGetValue(nTheta, MinDistanceRel)) &&
741 (d2ThetaStart <=mlGetValue(nTheta, MaxDistanceRel)) )
742 {
743 Areascan->dThetaMin= d2ThetaStart;
744 Areascan->dThetaMax= d2ThetaStart;
745 Areascan->d2ThetaStart= d2ThetaStart;
746 }
747 else
748 {
749 char buf2[_MAXLENDOUBLE];
750 Double2String(buf2, d2ThetaStart, mlGetDigits(nTheta), FALSE, _DECIMAL);
751 sprintf(buf, szDlgMsgLine006, buf2);
752 MessageBox(buf, szDlgMessage, MBINFO);
753 CtrlSetFocus(id_2Theta);
754 bFailure= TRUE;
755 }
756 break;
757 }
758 //! wenn bis hier schon Fehlern aufgetretenen sind: cm_ParamSet senden und Dialogbox nicht schliessen
759 if ( bFailure )
760 {
761 PostMessage( GetHandle(), WM_COMMAND, ( WPARAM ) cm_ParamSet, 0l );
762 return FALSE;
763 }
764
765 //! uebernahme der Messzeit mit Pruefung, ob der Wert ungleich 0
766 //! wenn nicht, wird Box wird nicht verlassen
767 valueF= CtrlGetDouble(id_MaxTime, _MAXTIMEDIGITS, _DECIMAL, bValid);
768 //! FIX Fehler 50
769 if (!bValid) bFailure= TRUE;
770 else if ( valueF>0.0 )
771 Areascan->fMaxTime= valueF;
772 else {
773 Areascan->fMaxTime= 0.1f;
774 CtrlSetDouble(id_MaxTime, Areascan->fMaxTime, _MAXTIMEDIGITS, _DECIMAL);
775 MessageBeep(0);
776 CtrlSetFocus(id_MaxTime);
777 bFailure= TRUE;
778 }
779
780 //! uebernahme des Datenpfades, wenn er sich beschreiben laesst
781 //! ansonsten auf "C:\\" setzen + Box wird nicht verlassen
782 CtrlGetText(id_Catalog, Areascan->szDataPath, MaxString);
783 if ( !PathCanWrite(Areascan->szDataPath) ) {
784 strcpy( Areascan->szDataPath, "c:\\" );
785 //! FIX Fehler 38
786 CtrlSetText(id_Catalog, Areascan->szDataPath);
787 CtrlSetFocus(id_Catalog);
788 MessageBeep(0);
789 bFailure= TRUE;
790 }
791
792 //! FIX Fehler 38,51
793 valueF= CtrlGetDouble(id_AngleWidth, mlGetDigits(nOmega)+1, _DECIMAL, bValid);
794 if (!bValid) bFailure= TRUE;
795 else if ( valueF>=mGetValue(MinWidth) )
796 Areascan->dOmegaWidth= valueF;
797 else
798 {
799 Areascan->dOmegaWidth= mGetValue(MinWidth);
800 CtrlSetDouble(id_AngleWidth, Areascan->dOmegaWidth, mlGetDigits(nOmega)+1, _DECIMAL);
801 MessageBeep(0);
802 CtrlSetFocus(id_AngleWidth);
803 bFailure= TRUE;
804 }
805
806 //! wenn bisher keine fehler auftraten diverse werte an Areasanfenster
807 //! uebergeben
808 if ( !bFailure)
809 {
810 //! Offsetwerte uebernehmen
811 Areascan->dOffsetOmega= dOO;
812 Areascan->dOffsetTheta= dTO;
813 Areascan->dPsdOffset= 0;
814 Areascan->nMeasurementChannel= 0;
815 //! gewollte zusatzinfos
816 Areascan->ReportUse.bAbsorber= IsDlgButtonChecked( GetHandle(), id_AbsorberUsed );
817 }
818
819 //! bei aufgetretenen Fehlern cm_ParamSet senden und Dialogbox nicht
820 //! schliessen
821 if ( bFailure )
822 {
823 PostMessage( GetHandle(), WM_COMMAND, ( WPARAM ) cm_ParamSet, 0l );
824 return FALSE;
825 }
826
827 return TRUE;
828 };
829
830 //#############################################################################
831 // TAquisitionDlg
832 //#############################################################################
833
834 TAquisitionDlg::TAquisitionDlg( TAreaScanWindow *aScan ) : TModalDlg( "AQUISITION", GetMainInstance() )
835 {
836 Areascan= aScan;
837 Areascan->bAquisitionActive= FALSE;
838 };
839 //*****************************************************************************
840
841 //! eintragen von Defaultwerten fuer alle Elemente bei Aufruf der Dlg.Box
842 //! rueckkehrcode immer true
843 BOOL TAquisitionDlg::Dlg_OnInit( HWND, HWND hwndCtl, LPARAM lParam )
844 {
845 //! Anzahl der Messpunkte
846 CtrlSetLong(id_LinePoints, Areascan->nLinePoints);
847 //! Umgebung
848 CtrlSetLong( id_AddedPoints, Areascan->nEnvironment );
849 CtrlSetText( id_FileName, Areascan->DataFile );
850 //! ?
851 CheckDlgButton( GetHandle(), id_DX, Areascan->bSetDXZero );
852 CheckDlgButton( GetHandle(), id_DY, Areascan->bSetDYZero );
853 CheckDlgButton( GetHandle(), id_RL, Areascan->bSetRLSave );
854 //! Focus auf OK-Button der Box
855 CtrlSetFocus( IDOK );
856 return TRUE;
857 };
858 //*****************************************************************************
859
860 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor Verlassen der
861 //! Dialogbox (durch OK-Button)
862 //! Rueckkehrcode false wenn die Dialogbox nicht geschlossen werden kann (werte
863 //! inkonsistent) sonst true
864 BOOL TAquisitionDlg::CanClose( void )
865 {
866 int value;
867 OFSTRUCT of;
868 int hFile;
869 BOOL bValid= TRUE;
870
871 //! Werte der CheckBoxen uebernehmen wenn nicht beide markiert, sonst 'dX=0'
872 //! auf unmarkiert setzen, CheckButtons neu setzen und Box nicht verlassen
873 Areascan->bSetDXZero= IsDlgButtonChecked( GetHandle(), id_DX );
874 Areascan->bSetDYZero= IsDlgButtonChecked( GetHandle(), id_DY );
875 Areascan->bSetRLSave= IsDlgButtonChecked( GetHandle(), id_RL );
876 if ( Areascan->bSetDXZero * Areascan->bSetDYZero )
877 {
878 Areascan->bSetDXZero= !Areascan->bSetDYZero;
879 CheckDlgButton( GetHandle(), id_DX, Areascan->bSetDXZero );
880 CheckDlgButton( GetHandle(), id_DY, Areascan->bSetDYZero );
881 return FALSE;
882 }
883 //! uebernehmen der 'Umgebung', wenn Wert im Bereich von 0 bis 3 liegt, sonst
884 //! Wert auf entsprechende Grenze setzen + Wert in Box eintragen + Box nicht
885 //! verlassen
886 value= CtrlGetLong( id_AddedPoints, bValid );
887 Areascan->nEnvironment= max( 0, min( 3, value ) );
888 if (!bValid) return FALSE;
889 else if ( value!=Areascan->nEnvironment )
890 {
891 CtrlSetLong( id_AddedPoints, Areascan->nEnvironment );
892 MessageBeep(0);
893 CtrlSetFocus(id_AddedPoints);
894 return FALSE;
895 }
896 //! uebernehmen der 'Messpunkte', wenn Wert im Bereich von 0 bis 1100 liegt,
897 //! sonst Wert auf entsprechende Grenze setzen + Wert in Box eintragen + Box
898 //! nicht verlassen
899 value= CtrlGetLong( id_LinePoints, bValid );
900 Areascan->nLinePoints= max( 0, min( 1100, value ) );
901 if (!bValid) return FALSE;
902 else if ( value!=Areascan->nLinePoints )
903 {
904 CtrlSetLong( id_LinePoints, Areascan->nLinePoints );
905 MessageBeep(0);
906 CtrlSetFocus(id_LinePoints);
907 return FALSE;
908 }
909 //! Test, ob angeg. Datei bereits existiert + evtl. Fehlermeldung
910 //! anlegen der Datei
911 CtrlGetText( id_FileName, Areascan->DataFile, MaxString );
912 // Testen, ob sich das File auch erzeugen laesst
913 if ( OpenFile( Areascan->DataFile, &of, OF_EXIST )!=HFILE_ERROR )
914 {
915 if ( IDYES == MessageBox( szDlgMsgLine100, szDlgMessage, MBASK ) )
916 goto Exit;
917 else
918 return FALSE;
919 }
920
921 //! Fehlermeldung bei Problemen beim Anlegen der Datei
922 hFile= OpenFile( Areascan->DataFile, &of, OF_CREATE );
923 if ( hFile == HFILE_ERROR )
924 {
925 MessageBox( szDlgMsgLine101, szDlgMessage, MBINFO );
926 return FALSE;
927 }
928 else
929 _lclose(hFile);
930 //! remove( DataFile );
931
932 //! wenn alles erfolgreich Marke setzen + Info + DataAquisiton auf true
933 //!setzen
934 Exit:
935 Areascan->bAquisitionActive= TRUE;
936 SetInfo( szDlgMsgLine102 );
937
938 return TRUE;
939 };
940
941 //##############################################################################
942 // TChooseScanDlg
943 //##############################################################################
944
945 TChooseScanDlg::TChooseScanDlg( TAreaScanWindow *aScan, TModelessDlg **aRef ) : TModelessDlg( "CHOOSESCAN", aRef, GetMainInstance() ), InfoField(0, 0), Report(0), Report2(0), BarHandle(0), hInfoList(0)
946 {
947 Areascan= aScan;
948 Report= Areascan->ScanReport;
949 Report2= Areascan->ScanReport2;
950 nMaxScan= nInfoNumber= 0;
951 };
952 //*****************************************************************************
953
954 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box
955 //! Rueckkehrcode immer true
956 BOOL TChooseScanDlg::Dlg_OnInit( HWND, HWND hwndCtl, LPARAM )
957 {
958 SCROLLINFO scrInfo;
959 scrInfo.cbSize= sizeof(SCROLLINFO);
960 scrInfo.fMask= SIF_RANGE;
961 //! 1.zusatzinfo auf Detektortyp setzen
962 nInfoNumber= 0;
963 //! anzahl der Kurven eintragen + Scrollbar initialisieren
964 nMaxScan= lpDBase->GetCNumber() - 1;
965 CtrlSetLong(id_Limit, nMaxScan);
966 BarHandle= GetDlgItem( GetHandle(), id_Bar );
967
968 scrInfo.nMin= 0;
969 scrInfo.nMax= nMaxScan;
970 SetScrollInfo(BarHandle,SB_CTL,&scrInfo,TRUE);
971
972 //! alle zur datenbasis verfuegbaren Infos in combobox eintragen
973 hInfoList= GetDlgItem( GetHandle() , id_ChooseInfo );
974 ComboBox_AddString( hInfoList , szInfoType0 );
975 InfoField.Append(0);
976 if (Areascan->ReportUse.bIntegral == TRUE)
977 {
978 ComboBox_AddString( hInfoList , szInfoType1 );
979 InfoField.Append(1);
980 }
981 if (Areascan->ReportUse.bAbsorber == TRUE)
982 {
983 ComboBox_AddString( hInfoList , szInfoType2 );
984 InfoField.Append(2);
985 }
986 if (Areascan->ReportUse.bMonitor == TRUE)
987 {
988 ComboBox_AddString( hInfoList , szInfoType3);
989 InfoField.Append(3);
990 }
991 if (Areascan->ReportUse.bTime == TRUE)
992 {
993 ComboBox_AddString( hInfoList , szInfoType4 );
994 InfoField.Append(4);
995 }
996 ComboBox_SelectString( hInfoList, 0 , szInfoType0 );
997
998 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage );
999 //! Focus auf OK-Button der Box
1000 CtrlSetFocus( IDOK );
1001 return TRUE;
1002 };
1003 //*****************************************************************************
1004
1005 //! behandelt Kommandos in der Dialogbox
1006 void TChooseScanDlg::Dlg_OnCommand( HWND, int id, HWND hwndCtl,
1007 UINT codeNotify )
1008 {
1009 BOOL bValid= TRUE;
1010 char buf[ MaxString ];
1011 float x, y, fIntegral, fPeakPos, fMonitor, fAbsorber, fTime, fdummy;
1012
1013 SCROLLINFO scrInfo;
1014 scrInfo.cbSize= sizeof(SCROLLINFO);
1015 scrInfo.fMask= SIF_POS;
1016
1017 switch ( id )
1018 {
1019 //! Update-Button gedrueckt
1020 case id_CurveShow:
1021 //! Scannummer aus Dialogbox holen + diese Darstellen
1022 lpDBase->SetCurveIdx( CtrlGetLong(id_ScanNumber, bValid) );
1023 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage );
1024 break;
1025
1026 //! aktualisieren
1027 case cm_ParamSet: {
1028 //! aktuelle Kurve in Maincurve + Dialogboxeintraege eintragen +
1029 //! Fenster neuzeichnen
1030 Areascan->nActiveScan= lpDBase->GetCurveIdx();
1031 Areascan->MainCurve= lpDBase->GetCurve( Areascan->nActiveScan );
1032 CtrlSetLong(id_ScanNumber, Areascan->nActiveScan);
1033 scrInfo.nPos= nMaxScan - Areascan->nActiveScan;
1034 SetScrollInfo(BarHandle,SB_CTL,&scrInfo,TRUE);
1035 Report->SetPP( Areascan->nActiveScan );
1036 Report->PGet( x, y, fIntegral );
1037 Report2->SetPP( Areascan->nActiveScan );
1038 Report2->PGet( fTime, fMonitor, fAbsorber);
1039 //! FIX Fehler 42
1040 CtrlSetDouble(id_Omega, x, 3, _DECIMAL);
1041 TCurve *Curve= Areascan->MainCurve;
1042 CtrlSetDouble(id_PeakIntensity, Curve->GetMax( 1 ), 1, _DECIMAL);
1043
1044 //! je nach ausgewähltem Combobox-eintrag den zugehörigen Infowert eintragen
1045 Curve->GetGravityCenter(fPeakPos, fdummy, fdummy);
1046 if (Areascan->VisualDB.bPsd)
1047 fPeakPos= y + fPeakPos;
1048 CtrlSetDouble(id_PeakPosition, fPeakPos, 3, _DECIMAL);
1049 switch (nInfoNumber)
1050 {
1051 case 0:
1052 if (Areascan->VisualDB.bPsd)
1053 sprintf( buf, "Psd");
1054 else
1055 sprintf( buf, "0-dim.");
1056 break;
1057
1058 case 1:
1059 sprintf( buf, "%.1f", fIntegral); //! integrale Intens.
1060 break;
1061
1062 case 2:
1063 sprintf( buf, "%.3f", fAbsorber); //! Absorber
1064 break;
1065
1066 case 3:
1067 sprintf( buf, "%.1f", fMonitor); //! Monitor
1068 break;
1069
1070 case 4:
1071 sprintf( buf, "%.3f", fTime); //! Zeit
1072 break;
1073
1074 default:
1075 sprintf( buf, "????");
1076 };
1077 CtrlSetText(id_Info, buf);
1078
1079 //! Kurve im Hintergrund neu zeichnen
1080 Areascan->UpdateWnd();
1081 break;
1082 }
1083
1084 case id_ChooseInfo: //! auswaehlen einer anderen Zusatzinfo
1085 if ( codeNotify==CBN_SELCHANGE ) { //! wenn neue info ausgewaehlt, dann diesen ins nachbarfeld(in cm_ParamSet
1086 nInfoNumber= InfoField[ ComboBox_GetCurSel(hInfoList) ];
1087 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage );
1088 };
1089 break; //Fehler? Kullmann+Reinecker: Fehlt hier vielleicht ein break?
1090
1091 //! behandelt OK und Abbruch
1092 default:
1093 TModelessDlg::Dlg_OnCommand( GetHandle(), id, hwndCtl, codeNotify );
1094 }
1095 };
1096 //*****************************************************************************
1097
1098 //! wird aufgerufen, wenn in der Dialogbox die linke Maustaste nach Druecken
1099 //! wieder losgelassen wird (sinnvoll wenn Dialogbox waehrend eines Areascans
1100 //! aktiv ist)
1101 void TChooseScanDlg::Dlg_OnLButtonUp( HWND, int, int, UINT )
1102 {
1103 SCROLLINFO scrInfo;
1104 scrInfo.cbSize= sizeof(SCROLLINFO);
1105 scrInfo.fMask= SIF_RANGE;
1106 //! aktualisiert Anzahl der Scans der Datenbasis + anpassen des Scrollbar
1107 nMaxScan= lpDBase->GetCNumber() - 1;
1108 CtrlSetLong(id_Limit, nMaxScan);
1109 BarHandle= GetDlgItem( GetHandle(), id_Bar );
1110
1111 scrInfo.nMin= 0;
1112 scrInfo.nMax= nMaxScan;
1113 SetScrollInfo(BarHandle,SB_CTL,&scrInfo,TRUE);
1114 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, 0, 0, SendMessage );
1115 };
1116 //*****************************************************************************
1117
1118 //! wird aufgerufen, wenn Scrollbar angeclickt wurde
1119 void TChooseScanDlg::Dlg_OnVScrollBar( HWND, HWND hwndCtl, UINT code,
1120 int pos )
1121 {
1122 switch ( code )
1123 {
1124 case SB_LINEUP://! Klick auf oberen Pfeil
1125 lpDBase->SetCurveIdx( Areascan->nActiveScan + 1 );
1126 break;
1127
1128 case SB_LINEDOWN://! Klick auf unteren Pfeil
1129 lpDBase->SetCurveIdx( Areascan->nActiveScan - 1 );
1130 break;
1131
1132 case SB_THUMBPOSITION://! anclicken + bewegen des Scrollschiebers
1133 lpDBase->SetCurveIdx( nMaxScan - pos );
1134 break;
1135
1136 case SB_PAGEUP://! anklicken oberhalb des schiebers
1137 lpDBase->SetCurveIdx( Areascan->nActiveScan + 10 );
1138 break;
1139
1140 case SB_PAGEDOWN://! anklicken unterhalb des schiebers
1141 lpDBase->SetCurveIdx( Areascan->nActiveScan - 10 );
1142 break;
1143
1144 case SB_ENDSCROLL://! Skrolling ist beendet, Daten nun anzeigen
1145 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, 0, 0, SendMessage );
1146 break;
1147 }
1148 };
1149 //*****************************************************************************
1150
1151 //! wird aufgerufen beim druecken des OK-Buttons
1152 //! Rueckkehrcode immer true
1153 BOOL TChooseScanDlg::CanClose( void )
1154 {
1155 return TRUE;
1156 };
1157
1158 //##############################################################################
1159 // TComposeDBDlg
1160 //##############################################################################
1161
1162 TComposeDBDlg::TComposeDBDlg( TAreaScanWindow *aScan ) : TModalDlg( "COMPOSEDATABASE", GetMainInstance() )
1163 {
1164 //! sichern aktueller Werte fuer Dateinamen und Dateianzahl
1165 Areascan= aScan;
1166 strcpy( oldFirstFile, Areascan->FirstFile );
1167 strcpy( oldLastFile, Areascan->LastFile );
1168 oldMaxFiles= Areascan->MaxFiles;
1169 };
1170 //*****************************************************************************
1171
1172 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box
1173 //! Rueckkehrcode immer true
1174 BOOL TComposeDBDlg::Dlg_OnInit(HWND, HWND hwndCtl, LPARAM lParam)
1175 {
1176 //! Eintraege in Dialogbox setzen fuer Dateinamen und Dateizahl
1177 CtrlSetText(cm_StartFile, oldFirstFile);
1178 CtrlSetText(id_LastFile, oldLastFile);
1179 CtrlSetLong(id_NumberSpectrum, oldMaxFiles);
1180 //! wenn Dateizahl 0 deaktivieren des Eingabefeldes
1181 if ( oldMaxFiles == 0 ) CtrlSetEnabled(id_NumberSpectrum, FALSE );
1182 //! Focus auf OK-Button der Box
1183 CtrlSetFocus( IDOK );
1184 return TRUE;
1185 };
1186 //*****************************************************************************
1187
1188 //! behandelt alle kommandos der Dialogbox
1189 void TComposeDBDlg::Dlg_OnCommand(HWND, int id, HWND hwndCtl, UINT codeNotify)
1190 {
1191 HFILE hFile;
1192 OFSTRUCT of;
1193 char buf[ MaxString ], FileName[ MaxString ];
1194 int counter= 0, oldcounter= 0;
1195 char drive[ _MAX_DRIVE+1 ], path[ _MAX_DIR+1 ], name[ _MAX_FNAME+1 ], ext[ _MAX_EXT+1 ];
1196
1197 switch ( id )
1198 {
1199 case cm_StartFile://! Start-Datei-Button gedrueckt
1200 //! ins Arbeitverzeichnis wechseln + 'Datei nachladen'-Dialog oeffnen + Dateinamen prüfen
1201 char NewFilename[ _MAX_PATH ];
1202 strcpy( NewFilename, "*.crv" ); // Fehler? warum *.crv beim AreaScan
1203 _chdir( Areascan->szDataPath );
1204 if ( !FileOpenDialog( szDlgMsgLine104, "", NewFilename, Areascan->szDataPath ) ) return; // 'Abbruch' geklickt
1205 if ( strlen(NewFilename)==0 || strcmp(NewFilename, "*")==0 ) return;
1206
1207 //! nach Auswahl des Dateinamen bestimmen der maximalen Anzahl
1208 //! zusammenfassbarer Spektren abhaengig von fortlaufendem Vorhandensein
1209 //! der entsprechenden Dateien
1210 //! zunaechst: Bestimmung des Dateinamens(ohne Numerierung)
1211 _splitpath( NewFilename, drive, path, name, ext );
1212 counter= oldcounter= atoi( &name[ max(0, strlen(name)-4) ] );
1213 strcpy( buf, name );
1214 buf[ max(0, strlen(name)-4) ]= '\0';
1215 strcpy( Areascan->DismantleFile, buf );
1216 strcpy( oldFirstFile, name );
1217 strcat( oldFirstFile, ext );
1218 SetWindowText( GetDlgItem( GetHandle(), cm_StartFile ), oldFirstFile );
1219 hFile= OpenFile( oldFirstFile, &of, OF_READ );
1220 //! fortlaufender Test auf vorhandene Dateien
1221 do
1222 {
1223 _lclose( hFile );
1224 strcpy( oldLastFile, name );
1225 strcpy(buf, "");
1226 sprintf( buf, "%.4d", counter++ );
1227 strcpy( name, Areascan->DismantleFile );
1228 strcat( name, buf );
1229 _makepath( FileName, drive, path, name, ext );
1230 hFile= OpenFile( FileName, &of, OF_READ );
1231 } while ( hFile!=HFILE_ERROR );
1232 //! Eintragen von Dateizahl, Start- , End-Datei in Dialogbox
1233 CtrlSetLong(id_NumberSpectrum, counter - oldcounter - 1);
1234 strcat( oldLastFile, ext );
1235 CtrlSetText(id_LastFile, oldLastFile );
1236 oldMaxFiles= counter - oldcounter - 1;
1237 CtrlSetEnabled(id_NumberSpectrum, TRUE );
1238 break;
1239
1240 default://! behandelt IDOK, IDCANCEL
1241 TModalDlg::Dlg_OnCommand( GetHandle(), id, hwndCtl, codeNotify );
1242 }
1243 };
1244 //*****************************************************************************
1245
1246 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor verlassen
1247 //! der Dialogbox (durch OK-Button)
1248 //! Rueckkehrcode False wenn die Dlg.box nicht geschlossen werden kann
1249 //! (Werte inkonsistent) sonst true
1250 BOOL TComposeDBDlg::CanClose()
1251 {
1252 BOOL result= TRUE;
1253 BOOL bValid= TRUE;
1254 char buf[ _MAX_PATH+1 ];
1255 int counter;
1256
1257 //! auslesen der Spektrenzahl, event. Korrektur, wenn Wert zu gross bzw. klein
1258 int valueI= CtrlGetLong(id_NumberSpectrum, bValid);
1259 if (!bValid) result= FALSE; // Wert konnte nicht ausgelesen werden
1260 else if ( valueI!=oldMaxFiles )
1261 {
1262 if ( (valueI<=oldMaxFiles) && (valueI >= 1) )
1263 {
1264 oldMaxFiles= valueI;
1265 strcpy( buf, oldLastFile );
1266 buf[ max(0, strlen(buf)-8) ]= '\0';
1267 strcpy( oldLastFile, buf );
1268 counter= atoi( &oldFirstFile[ max(0, strlen(oldFirstFile)-8) ] );
1269 sprintf( buf, "%.4d", counter + oldMaxFiles - 1 );
1270 strcat( oldLastFile, buf );
1271 strcat( oldLastFile, ".CRV" );
1272 }
1273 //! setzen der neuen Eintraege
1274 CtrlSetText(id_LastFile, oldLastFile );
1275 CtrlSetLong(id_NumberSpectrum, oldMaxFiles);
1276 CtrlSetFocus(id_NumberSpectrum);
1277 result= FALSE;
1278 }
1279 else
1280 {
1281 //! uebergeben der neuen Werte an das AreaScan-Fenster
1282 Areascan->MaxFiles= oldMaxFiles;
1283 CtrlGetText(cm_StartFile, Areascan->FirstFile, _MAX_PATH);
1284 CtrlGetText(id_LastFile, Areascan->LastFile, _MAX_PATH);
1285 }
1286 return result;
1287 };
1288
1289 //##############################################################################
1290 // TDismantleDBDlg
1291 //##############################################################################
1292
1293 TDismantleDBDlg::TDismantleDBDlg( TAreaScanWindow *scan ) : TModalDlg( "DISMANTLEDATABASE", GetMainInstance() ), Areascan(0)
1294 {
1295 //! Einlesen der Id's in Feld-Variablen zur komfortableren Nutzung
1296 Areascan= scan;
1297 };
1298 //*****************************************************************************
1299
1300 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box
1301 //! Rueckkehrcode immer true
1302 BOOL TDismantleDBDlg::Dlg_OnInit(HWND, HWND hwndCtl, LPARAM lParam)
1303 {
1304 //! setzen des Datenpfades
1305 CtrlSetText(id_Catalog, Areascan->szDataPath);
1306 strcpy(Areascan->DismantleFile, "");
1307 //! Focus auf OK-Button der Box
1308 CtrlSetFocus( IDOK );
1309 return TRUE;
1310 };
1311 //*****************************************************************************
1312
1313 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor verlassen
1314 //! der Dialogbox (durch OK-Button)
1315 //! Rueckkehrcode False wenn die Dlg.box nicht geschlossen werden kann
1316 //! (Werte inkonsistent) sonst true
1317 BOOL TDismantleDBDlg::CanClose()
1318 {
1319 BOOL retval= TRUE;
1320
1321 CtrlGetText(id_Catalog, Areascan->szDataPath, MaxString);
1322 //! Testen, ob sich der Pfad auch beschreiben laesst
1323 if ( Areascan->szDataPath[ max(0, strlen(Areascan->szDataPath)-1) ] != '\\' )
1324 strcat( Areascan->szDataPath, "\\" );
1325 if ( !PathCanWrite(Areascan->szDataPath) ) {
1326 strcpy( Areascan->szDataPath, "c:\\" );
1327 CtrlSetText(id_Catalog, Areascan->szDataPath);
1328 CtrlSetFocus(id_Catalog);
1329 MessageBeep(0);
1330 retval= FALSE;
1331 }
1332 //! Dateinamen auslesen und auf Laenge <5 testen
1333 //! sonst nur erste 4 Zeichen nehmen und Dialogbox bleibt geoeffnet
1334 if (retval)
1335 {
1336 CtrlGetText(id_FileName, Areascan->DismantleFile, MaxString );
1337 if ( strlen( Areascan->DismantleFile ) > 4 )
1338 {
1339 char buf[ MaxString ];
1340 strcpy( buf, Areascan->DismantleFile );
1341 buf[4]= '\0';
1342 strcpy( Areascan->DismantleFile, buf );
1343 CtrlSetText(id_FileName, buf );
1344 retval= FALSE;
1345 }
1346 }
1347 return retval;
1348 };
1349