Autor Beitrag
Bronstein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Fr 30.03.07 16:06 
Habe ein Problem,
ich Werte Daten aus verschiedenen TXT-Dateien aus.

Funktioniert auch alles wunderbar.

Werte ich z.B. die Daten vom 01.03 – 20.03 aus bekomme ich keinen Fehler.
Werte ich z.B. die Daten vom 20.03 – 30.03 aus bekomme ich ebenfalls keinen Fehler.
Werte ich jedoch die Daten vom 01.03-30.03 aus bekomme ich einen Fehler:

Im Projekt MDE.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00404A7E in Modul 'MDE.exe'. Lesen von Adresse 72754B0E'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.


Die Daten hat er aber alle richtig ausgewertet, denn nachdem ich bei der Fehlermeldung auf ok gedrückt habe, werden meine ausgewerteten daten auch angezeigt.

Habe jetzt schon meine arrays am Ende der Auswertung freigegeben

Der Fehler tritt auch erst auf, wenn ich die Funktion verlasse.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TfrmAOI.Button1Click(Sender: TObject);
var
  FruehBauteil, SpaetBauteil, NachtBauteil: array[0..1000of String
begin
  //Auswertung
  [...]
  ZeroMemory(@FruehBauteil,SizeOf(FruehBauteil));
  ZeroMemory(@SpaetBauteil,SizeOf(SpaetBauteil));
  ZeroMemory(@NachtBauteil,SizeOf(NachtBauteil)); 
end;


Sprich der Fehler tritt nach dieser Zeile auf:
ZeroMemory(@NachtBauteil,SizeOf(NachtBauteil));

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Fr 30.03.07 16:42 
ich glaube nicht, dass man ein Array of String mit ZeroMemory leeren sollte...
Ich denke, wenn Du die letzte Zeile
ausblenden Delphi-Quelltext
1:
ZeroMemory(@NachtBauteil,SizeOf(NachtBauteil));					

weglässt, dann tritt der Fehler trotzdem auf.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 31.03.07 12:40 
Ja, das tut er auch, aber woran kann es dann liegen.

Das war nur ein Versuch, da ich dachte, dass es daran liegen könnte

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
Andidreas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows XP Pro
BDS 2006
BeitragVerfasst: Sa 31.03.07 13:08 
Könntest Du eventuell den Sourcecode zur verfügungung stellen, damit man den Fehler nach volziehen kann?
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Sa 31.03.07 13:42 
Hab ihn jetzt gerade nicht zur Hand, da ich das Progrann im Geschäft mache.

Ich werde es aber am Montag versuchen.

Versuchen sage ich deshalb, da in dem Programm meher Datenbanken benötig werden.

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Sa 31.03.07 14:12 
Dann lösch mal deine Array anstatt mit ZeroMemeory mit einer Schleife, in welcher Du die Strings aus EmptyStr setzt.
ZeroMemory nimmt an, dass du n-btes zusammenhängenden Speicher hast und füllt den mit Nullen. Strings sind aber andere Konstrukte

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Mo 02.04.07 08:45 
Hier mal der Code:
Der Fehler tritt beim Button1.Click auf.
Das mit dem EmptyStr hat auch nicht funktioniert


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850:
851:
852:
853:
854:
855:
856:
857:
858:
859:
860:
861:
862:
863:
864:
865:
866:
867:
868:
869:
870:
871:
872:
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913:
914:
915:
916:
917:
918:
919:
920:
921:
922:
923:
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
938:
939:
940:
941:
942:
943:
944:
945:
946:
947:
948:
949:
950:
951:
952:
953:
954:
955:
956:
957:
958:
959:
960:
961:
962:
963:
964:
965:
966:
967:
968:
969:
970:
971:
972:
973:
974:
975:
976:
977:
978:
979:
980:
981:
982:
983:
984:
985:
986:
987:
988:
989:
990:
991:
992:
993:
994:
995:
996:
997:
998:
999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
1020:
1021:
1022:
1023:
1024:
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104:
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178:
1179:
1180:
1181:
1182:
1183:
1184:
1185:
1186:
1187:
1188:
1189:
1190:
1191:
1192:
1193:
1194:
1195:
1196:
1197:
1198:
1199:
1200:
1201:
1202:
1203:
1204:
1205:
1206:
1207:
1208:
1209:
1210:
1211:
1212:
1213:
1214:
1215:
1216:
1217:
1218:
1219:
1220:
1221:
1222:
1223:
1224:
1225:
1226:
1227:
1228:
1229:
1230:
1231:
1232:
1233:
1234:
1235:
1236:
1237:
1238:
1239:
1240:
1241:
1242:
1243:
1244:
1245:
1246:
1247:
1248:
1249:
1250:
1251:
1252:
1253:
1254:
1255:
1256:
1257:
1258:
1259:
1260:
1261:
1262:
1263:
1264:
1265:
1266:
1267:
1268:
1269:
1270:
1271:
1272:
1273:
1274:
1275:
1276:
1277:
1278:
1279:
1280:
1281:
1282:
1283:
1284:
1285:
1286:
1287:
1288:
1289:
1290:
1291:
1292:
1293:
1294:
1295:
1296:
1297:
1298:
1299:
1300:
1301:
1302:
1303:
1304:
1305:
1306:
1307:
1308:
1309:
1310:
1311:
1312:
1313:
1314:
1315:
1316:
1317:
1318:
1319:
1320:
1321:
1322:
1323:
1324:
1325:
1326:
1327:
1328:
1329:
1330:
1331:
1332:
1333:
1334:
1335:
1336:
1337:
1338:
1339:
1340:
1341:
1342:
1343:
1344:
1345:
1346:
1347:
1348:
1349:
1350:
1351:
1352:
1353:
1354:
1355:
1356:
1357:
1358:
1359:
1360:
1361:
1362:
1363:
1364:
1365:
1366:
1367:
1368:
1369:
1370:
1371:
1372:
1373:
1374:
1375:
1376:
1377:
1378:
1379:
1380:
1381:
1382:
1383:
1384:
1385:
1386:
1387:
1388:
1389:
1390:
1391:
1392:
1393:
1394:
1395:
1396:
1397:
1398:
1399:
1400:
1401:
1402:
1403:
1404:
1405:
1406:
1407:
1408:
1409:
1410:
1411:
1412:
1413:
1414:
1415:
1416:
1417:
1418:
1419:
1420:
1421:
1422:
1423:
1424:
1425:
1426:
1427:
1428:
1429:
1430:
1431:
1432:
1433:
1434:
1435:
1436:
1437:
1438:
1439:
1440:
1441:
1442:
1443:
1444:
1445:
1446:
1447:
1448:
1449:
1450:
1451:
1452:
1453:
1454:
1455:
1456:
1457:
1458:
1459:
1460:
1461:
1462:
1463:
1464:
1465:
1466:
1467:
1468:
1469:
1470:
1471:
1472:
1473:
1474:
1475:
1476:
1477:
1478:
1479:
1480:
1481:
1482:
1483:
1484:
1485:
1486:
1487:
1488:
1489:
1490:
1491:
1492:
1493:
1494:
1495:
unit AOI;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, ADODB, StdCtrls, DateUtils, Series,
  TeEngine, ExtCtrls, TeeProcs, Chart, DbChart, ComCtrls, IniFiles, Printers,
  Mask, OleServer, Excel97, ComObj, ShellApi, IdGlobal, Jpeg ;

type
  TfrmAOI = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    ListView1: TListView;
    ListView2: TListView;
    ListView3: TListView;
    ListView4: TListView;
    ComboBox1: TComboBox;
    DateTimePicker1: TDateTimePicker;
    DateTimePicker2: TDateTimePicker;
    TabSheet2: TTabSheet;
    ListView5: TListView;
    TabSheet3: TTabSheet;
    Chart1: TChart;
    Series1: TBarSeries;
    Series2: TBarSeries;
    Series3: TBarSeries;
    Series4: TBarSeries;
    Series5: TBarSeries;
    Button2: TButton;
    Button3: TButton;
    PrintDialog1: TPrintDialog;
    SaveDialog1: TSaveDialog;
    Button5: TButton;
    TabSheet5: TTabSheet;
    Label7: TLabel;
    Edit3: TEdit;
    Label8: TLabel;
    Edit4: TEdit;
    TabSheet6: TTabSheet;
    Button6: TButton;
    ListView6: TListView;
    Chart3: TChart;
    Series6: TBarSeries;
    Series7: TBarSeries;
    Label9: TLabel;
    MaskEdit1: TMaskEdit;
    Series8: TLineSeries;
    Series9: TLineSeries;
    Series10: TBarSeries;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
    procedure ListView2Compare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
    procedure ListView3Compare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
    procedure Button4Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Chart1GetLegendText(Sender: TCustomAxisPanel;
      LegendStyle: TLegendStyle; Index: Integer; var LegendText: String);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Chart2GetLegendText(Sender: TCustomAxisPanel;
      LegendStyle: TLegendStyle; Index: Integer; var LegendText: String);
    procedure ListView6Compare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
    procedure Edit3Change(Sender: TObject);
    procedure Edit4Change(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Chart3GetLegendText(Sender: TCustomAxisPanel;
      LegendStyle: TLegendStyle; Index: Integer; var LegendText: String);
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmAOI: TfrmAOI;
  Felder: array[0..22of String;

implementation

uses funktionen, loading;

{$R *.dfm}

procedure Protokoll(Meldung: STring);
var
  t_Datei: TextFile;
begin
  AssignFile(t_Datei, 'fehler.txt');
  ReSet(t_datei);
  Append(t_Datei);
  WriteLn(t_Datei, DateTimeToStr(now) + ' ' + Meldung  + ' : ' + SysErrorMessage(GetLastError));
  CloseFile(t_Datei);
end;

procedure Zeile_Aufschluesseln(Zeile: String);
var
  i, izelle: Integer;
begin
  ZeroMemory(@Felder,SizeOf(Felder));
  izelle := 0;
  for i:=1 to length(zeile) do
  begin
    if Zeile[i] <> ';' then
      Felder[izelle] := Felder[izelle] + zeile[i]
    else
      inc(izelle);
  end;
end;

function GetSchicht(Zeit: TTime): Char;
var
  FruehStart, FruehEnde, SpaetEnde, SpaetStart, NachtStart, NachtEnde, pfad:String;
  ini: TIniFile;
begin
  result := 'N';
  pfad := ExtractFilePath(ParamStr(0));
  pfad := pfad + '\mde.ini';
  ini:=TIniFile.Create(pfad);
  FruehStart:= ini.ReadString('Allgemein','FruehStart',FruehStart);
  FruehEnde:= ini.ReadString('Allgemein','FruehEnde',FruehEnde);
  SpaetStart:= ini.ReadString('Allgemein','SpaetStart',SpaetStart);
  SpaetEnde:= ini.ReadString('Allgemein','SpaetEnde',SpaetEnde);
  NachtStart:= ini.ReadString('Allgemein','NachtStart',NachtStart);
  NachtEnde:= ini.ReadString('Allgemein','NachtEnde',NachtEnde);
  ini.free;
  if Zeit >= StrToTime(FormatDateTime('hh:mm',StrToTime(FormatDateTime('hh:nn', StrToDateTime(FruehStart))))) then
    if Zeit <= StrToTime(FormatDateTime('hh:mm',StrToTime(FormatDateTime('hh:nn', StrToDateTime(FruehEnde))))) then
      result := 'F';
  if Zeit >= StrToTime(FormatDateTime('hh:mm',StrToTime(FormatDateTime('hh:nn', StrToDateTime(SpaetStart))))) then
    if Zeit <= StrToTime(FormatDateTime('hh:mm',StrToTime(FormatDateTime('hh:nn', StrToDateTime(SpaetEnde))))) then
      result := 'S';
  if (Zeit <= StrToTime(FormatDateTime('hh:mm',StrToTime(FormatDateTime('hh:nn', StrToDateTime(NachtEnde)))))) or
    (Zeit >= StrToTime(FormatDateTime('hh:nn',StrToTime(FormatDateTime('hh:nn', StrToDateTime(NachtStart)))))) then
      result := 'N';
end;


procedure Berechne_DiagrammData();
var
  Datum: TDateTime;
  i, z, index, AnzahlLoetstellen, AnzahlBT, AnzahlSeriennummern: Integer;
  FruehFehlerDia, SpaetFehlerDia, NachtFehlerDia: array[0..10of Word;
  SeriennummerDia, FehlerhafteBGRDia: Array[0..3of Integer;
  FehlerBauteileDia: Array[0..1000of ShortString;
  check: Boolean;
  ListItem : TListItem;
  tmpBeschriftung, Schicht: String;
  Frueh, Spaet: Extended;
begin
  frmAOI.ListView5.Clear;
  frmAOI.ListView6.Clear;
  AnzahlLoetstellen := StrToInt(frmAOI.Edit3.Text);
  AnzahlBT := StrToInt(frmAOI.Edit4.Text);
  Frueh := 0;
  Spaet := 0;
  Datum := StrToDate(FormatDateTime('dd.mm.yyyy', frmAOI.DateTimePicker1.Date));
  While Datum <> StrToDate(FormatDateTime('dd.mm.yyyy', frmAOI.DateTimePicker2.Date))+1 do
  begin
    ZeroMemory(@FruehFehlerDia,SizeOf(FruehFehlerDia));
    ZeroMemory(@SpaetFehlerDia,SizeOf(SpaetFehlerDia));
    ZeroMemory(@NachtFehlerDia,SizeOf(NachtFehlerDia));
    ZeroMemory(@SeriennummerDia,SizeOf(SeriennummerDia));
    ZeroMemory(@FehlerhafteBGRDia,SizeOf(FehlerhafteBGRDia));
    check:= false;
    for i:=0 to frmAOI.Listview1.Items.Count-1 do
    begin
      if StrToDate(frmAOI.ListView1.Items[i].Caption) = Datum then
      begin
        index := StrToInt(frmAOI.ListView1.Items[i].SubItems[1]);
        if frmAOI.ListView1.Items[i].SubItems[3] = 'F' then
          FruehFehlerDia[index] := FruehFehlerDia[index] + StrToInt(frmAOI.ListView1.Items[i].SubItems[0]);
        if frmAOI.ListView1.Items[i].SubItems[3] = 'S' then
          SpaetFehlerDia[index] := SpaetFehlerDia[index] + StrToInt(frmAOI.ListView1.Items[i].SubItems[0]);
        if frmAOI.ListView1.Items[i].SubItems[3] = 'N' then
          NachtFehlerDia[index] := NachtFehlerDia[index] + StrToInt(frmAOI.ListView1.Items[i].SubItems[0]);
        check := true;
      end
      else
      begin
        if check = true then
          break;
      end;
    end;
    check:= false;
    for i:=0 to frmAOI.Listview4.Items.Count-1 do
    begin
      if StrToDate(frmAOI.ListView4.Items[i].Caption) = Datum then
      begin
        if frmAOI.ListView4.Items[i].SubItems[1] = 'F' then
          SeriennummerDia[0] := StrToInt(frmAOI.ListView4.Items[i].SubItems[0]);
        if frmAOI.ListView4.Items[i].SubItems[1] = 'S' then
          SeriennummerDia[1] := StrToInt(frmAOI.ListView4.Items[i].SubItems[0]);
        if frmAOI.ListView4.Items[i].SubItems[1] = 'N' then
          SeriennummerDia[2] := StrToInt(frmAOI.ListView4.Items[i].SubItems[0]);
        check := true;
      end
      else
      begin
        if check = true then
          break;
      end;
    end;
    check:= false;
    for i:=0 to frmAOI.Listview2.Items.Count-1 do
    begin
      if StrToDate(frmAOI.ListView2.Items[i].Caption) = Datum then
      begin
        if frmAOI.ListView2.Items[i].SubItems[2] = 'F' then
          FehlerhafteBGRDia[0] := FehlerhafteBGRDia[0] + 1;
        if frmAOI.ListView2.Items[i].SubItems[2] = 'S' then
          FehlerhafteBGRDia[1] := FehlerhafteBGRDia[1] + 1;
        if frmAOI.ListView2.Items[i].SubItems[2] = 'N' then
          FehlerhafteBGRDia[2] := FehlerhafteBGRDia[2] + 1;
        check := true;
      end
      else
      begin
        if check = true then
          break;
      end;
    end;

    //Daten ins Grid speichern

    if SeriennummerDia[0] <> 0 then
    begin
      ListItem := frmAOI.ListView5.Items.Add;
      ListItem.Caption := FormatDateTime('dd.mm.yyyy', Datum);
      ListItem.SubItems.Add('F');
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[4]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[4]/(SeriennummerDia[0] * AnzahlLoetstellen)*1000000));
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[3]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[3]/(SeriennummerDia[0] * AnzahlLoetstellen)*1000000));
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[1]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[1]/(SeriennummerDia[0] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[6]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[6]/(SeriennummerDia[0] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[2]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[2]/(SeriennummerDia[0] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[9]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[9]/(SeriennummerDia[0])*1000000));
      ListItem.SubItems.Add(IntToStr(SeriennummerDia[0]));
      ListItem.SubItems.Add(IntToStr(FehlerhafteBGRDia[0]));
      ListItem.SubItems.Add(FloatToStr(FehlerhafteBGRDia[0]/(SeriennummerDia[0]/100)));
      ListItem.SubItems.Add(IntToStr(FruehFehlerDia[5]));
      ListItem.SubItems.Add(FloatToStr(FruehFehlerDia[5]/(SeriennummerDia[0] * AnzahlBT)*1000000));
    end;

    if SeriennummerDia[1] <> 0 then
    begin
      ListItem := frmAOI.ListView5.Items.Add;
      ListItem.Caption := FormatDateTime('dd.mm.yyyy', Datum);
      ListItem.SubItems.Add('S');
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[4]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[4]/(SeriennummerDia[1] * AnzahlLoetstellen)*1000000));
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[3]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[3]/(SeriennummerDia[1] * AnzahlLoetstellen)*1000000));
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[1]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[1]/(SeriennummerDia[1] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[6]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[6]/(SeriennummerDia[1] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[2]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[2]/(SeriennummerDia[1] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[9]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[9]/(SeriennummerDia[1])*1000000));
      ListItem.SubItems.Add(IntToStr(SeriennummerDia[1]));
      ListItem.SubItems.Add(IntToStr(FehlerhafteBGRDia[1]));
      ListItem.SubItems.Add(FloatToStr(FehlerhafteBGRDia[1]/(SeriennummerDia[1]/100)));
      ListItem.SubItems.Add(IntToStr(SpaetFehlerDia[5]));
      ListItem.SubItems.Add(FloatToStr(SpaetFehlerDia[5]/(SeriennummerDia[1] * AnzahlBT)*1000000));
    end;

    if SeriennummerDia[2] <> 0 then
    begin
      ListItem := frmAOI.ListView5.Items.Add;
      ListItem.Caption := FormatDateTime('dd.mm.yyyy', Datum);
      ListItem.SubItems.Add('N');
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[4]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[4]/(SeriennummerDia[2] * AnzahlLoetstellen)*1000000));
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[3]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[3]/(SeriennummerDia[2] * AnzahlLoetstellen)*1000000));
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[1]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[1]/(SeriennummerDia[2] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[6]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[6]/(SeriennummerDia[2] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[2]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[2]/(SeriennummerDia[2] * AnzahlBT)*1000000));
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[9]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[9]/(SeriennummerDia[2])*1000000));
      ListItem.SubItems.Add(IntToStr(SeriennummerDia[2]));
      ListItem.SubItems.Add(IntToStr(FehlerhafteBGRDia[2]));
      ListItem.SubItems.Add(FloatToStr(FehlerhafteBGRDia[2]/(SeriennummerDia[2]/100)));
      ListItem.SubItems.Add(IntToStr(NachtFehlerDia[5]));
      ListItem.SubItems.Add(FloatToStr(NachtFehlerDia[5]/(SeriennummerDia[2] * AnzahlBT)*1000000));
    end;
    Datum := Datum + 1;
  end;

  //Daten ins Diagramm
  frmAOI.Series1.Clear;
  frmAOI.Series2.Clear;
  frmAOI.Series3.Clear;
  frmAOI.Series4.Clear;
  frmAOI.Series5.Clear;
  frmAOI.Series6.Clear;
  frmAOI.Series7.Clear;
  frmAOI.Series8.Clear;
  frmAOI.Series9.Clear;
  frmAOI.Series10.Clear;

  Datum := StrToDate(frmAOI.ListView5.Items[0].Caption);
  Schicht := frmAOI.ListView5.Items[0].SubItems[0];
  for i:=0 to frmAOI.Listview5.Items.Count-1 do
  begin
    if DaysBetween(Datum, StrToDate(frmAOI.ListView5.Items[i].Caption)) > 1 then
    begin
      while Datum <> StrToDate(frmAOI.ListView5.Items[i].Caption)-1 do
      begin
        Datum := Datum + 1;
        //ShowMessage(FormatDateTime('dd.mm', Datum));
        tmpBeschriftung := FormatDateTime('d.m', Datum) + #13 + Wochentag(Datum);
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Früh';

        frmAOI.Series1.Add(0, tmpBeschriftung);
        frmAOI.Series2.Add(0, tmpBeschriftung);
        frmAOI.Series3.Add(0, tmpBeschriftung);
        frmAOI.Series4.Add(0, tmpBeschriftung);
        frmAOI.Series5.Add(0, tmpBeschriftung);
        frmAOI.Series6.Add(0, tmpBeschriftung);
        frmAOI.Series7.Add(0, tmpBeschriftung);
        frmAOI.Series8.Add(0, tmpBeschriftung);
        frmAOI.Series9.Add(0, tmpBeschriftung);
        frmAOI.Series10.Add(0, tmpBeschriftung);

        Frueh := 0;

        tmpBeschriftung := FormatDateTime('d.m', Datum) + #13 + Wochentag(Datum);
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Spät';

        frmAOI.Series1.Add(0, tmpBeschriftung);
        frmAOI.Series2.Add(0, tmpBeschriftung);
        frmAOI.Series3.Add(0, tmpBeschriftung);
        frmAOI.Series4.Add(0, tmpBeschriftung);
        frmAOI.Series5.Add(0, tmpBeschriftung);
        frmAOI.Series6.Add(0, tmpBeschriftung);
        frmAOI.Series7.Add(0, tmpBeschriftung);
        frmAOI.Series8.Add(0, tmpBeschriftung);
        frmAOI.Series9.Add(0, tmpBeschriftung);
        frmAOI.Series10.Add(0, tmpBeschriftung);

        Spaet := 0;
      end;
    end;
    if FormatDateTime('dd.mm.yyyy', Datum) <> frmAOI.ListView5.Items[i].Caption then
    begin
      //prüfen ob es Daten zur Frühschicht an diesem Tag gibt
      if (frmAOI.ListView5.Items[i].SubItems[0] <> 'F'and (frmAOI.ListView5.Items[i].SubItems[0] <> 'N'then
      begin
        //Es gibt an diesem Tag keine Daten zur Frühschicht, 0 eintragen
        tmpBeschriftung := FormatDateTime('d.m', StrToDate(frmAOI.ListView5.Items[i].Caption)) + #13 + Wochentag(StrToDate(frmAOI.ListView5.Items[i].Caption));
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Früh';

        frmAOI.Series1.Add(0, tmpBeschriftung);
        frmAOI.Series2.Add(0, tmpBeschriftung);
        frmAOI.Series3.Add(0, tmpBeschriftung);
        frmAOI.Series4.Add(0, tmpBeschriftung);
        frmAOI.Series5.Add(0, tmpBeschriftung);
        frmAOI.Series6.Add(0, tmpBeschriftung);
        frmAOI.Series7.Add(0, tmpBeschriftung);
        frmAOI.Series8.Add(0, tmpBeschriftung);
        frmAOI.Series9.Add(Spaet, tmpBeschriftung);
        frmAOI.Series10.Add(0, tmpBeschriftung);

        Frueh := 0;
      end;
    end;

    if (frmAOI.ListView5.Items[i].SubItems[0] <> 'N'then    //Nachtschicht wird nicht angezeigt ###################
    begin
      tmpBeschriftung := FormatDateTime('d.m', StrToDate(frmAOI.ListView5.Items[i].Caption)) + #13 + Wochentag(StrToDate(frmAOI.ListView5.Items[i].Caption));
      if frmAOI.ListView5.Items[i].SubItems[0] = 'F' then
      begin
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Früh';
        frmAOI.Series6.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[12]), tmpBeschriftung);
        frmAOI.Series7.Add(0, tmpBeschriftung);
        frmAOI.Series8.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[15]), tmpBeschriftung);
        frmAOI.Series9.Add(Spaet, tmpBeschriftung);

        Frueh := StrToFloat(frmAOI.ListView5.Items[i].SubItems[15]);
      end;
      if frmAOI.ListView5.Items[i].SubItems[0] = 'S' then
      begin
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Spät';
        frmAOI.Series6.Add(0, tmpBeschriftung);
        frmAOI.Series7.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[12]), tmpBeschriftung);
        frmAOI.Series8.Add(Frueh, tmpBeschriftung);
        frmAOI.Series9.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[15]), tmpBeschriftung);

        Spaet := StrToFloat(frmAOI.ListView5.Items[i].SubItems[15]);
      end;
      if frmAOI.ListView5.Items[i].SubItems[0] = 'N' then
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Nacht';

      frmAOI.Series1.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[2]), tmpBeschriftung);
      frmAOI.Series2.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[4]), tmpBeschriftung);
      frmAOI.Series3.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[6]), tmpBeschriftung);
      frmAOI.Series4.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[8]), tmpBeschriftung);
      frmAOI.Series5.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[10]), tmpBeschriftung);
      frmAOI.Series10.Add(StrToFloat(frmAOI.ListView5.Items[i].SubItems[17]), tmpBeschriftung);
    end;

    //prüfen ob es Daten zur Spätschicht zu diesem Tag gibt
    if i <> frmAOI.Listview5.Items.Count-1 then
    begin
      if ((frmAOI.ListView5.Items[i].SubItems[0] = 'F'and (frmAOI.ListView5.Items[i].Caption <> frmAOI.ListView5.Items[i+1].Caption)) or ((frmAOI.ListView5.Items[i].SubItems[0] = 'F'and(frmAOI.ListView5.Items[i+1].SubItems[0] = 'N')) then
      begin
        tmpBeschriftung := FormatDateTime('d.m', StrToDate(frmAOI.ListView5.Items[i].Caption)) + #13 + Wochentag(StrToDate(frmAOI.ListView5.Items[i].Caption));
        tmpBeschriftung:= tmpBeschriftung + #13 + 'Spät';

        frmAOI.Series1.Add(0, tmpBeschriftung);
        frmAOI.Series2.Add(0, tmpBeschriftung);
        frmAOI.Series3.Add(0, tmpBeschriftung);
        frmAOI.Series4.Add(0, tmpBeschriftung);
        frmAOI.Series5.Add(0, tmpBeschriftung);
        frmAOI.Series6.Add(0, tmpBeschriftung);
        frmAOI.Series7.Add(0, tmpBeschriftung);
        frmAOI.Series8.Add(Frueh, tmpBeschriftung);
        frmAOI.Series9.Add(0, tmpBeschriftung);
        frmAOI.Series10.Add(0, tmpBeschriftung);

        Spaet:=0;
      end;
    end;
    Datum := StrToDate(frmAOI.ListView5.Items[i].Caption);
  end;

  AnzahlSeriennummern := 0;
  for i:=0 to frmAOI.Listview4.Items.Count-1 do
  begin
    AnzahlSeriennummern := AnzahlSeriennummern + StrToInt(frmAOI.ListView4.Items[i].SubItems[0]);
  end;

  //TOP 5 Fehler der Bauteile
  for i:=0 to frmAOI.Listview3.Items.Count-1 do
  begin
    z:=0;
    check:=false;
    while z < 999 do
    begin
      if (FehlerBauteileDia[z] = frmAOI.ListView3.Items[i].SubItems[1]) and (FehlerBauteileDia[z+3] = frmAOI.ListView3.Items[i].SubItems[4]) then
      begin
        FehlerBauteileDia[z+2] := IntToStr(StrToInt(FehlerBauteileDia[z+2]) + StrToInt(frmAOI.ListView3.Items[i].SubItems[0]));
        check:=true;
      end;
      if FehlerBauteileDia[z] = '' then
        break;
      z:= z + 4;
    end;
    if check = false then
    begin
      //Einfügen
      FehlerBauteileDia[z] := frmAOI.ListView3.Items[i].SubItems[1];
      FehlerBauteileDia[z+1] := frmAOI.ListView3.Items[i].SubItems[2];
      FehlerBauteileDia[z+2] := frmAOI.ListView3.Items[i].SubItems[0];
      FehlerBauteileDia[z+3] := frmAOI.ListView3.Items[i].SubItems[4];
    end;
  end;
  z:=0;
  while z < 999 do
  begin
    if FehlerBauteileDia[z] <> '' then
    begin
      ListItem := frmAOI.ListView6.Items.Add;
      ListItem.Caption := FehlerBauteileDia[z];
      ListItem.SubItems.Add(FehlerBauteileDia[z+1]);
      ListItem.SubItems.Add(FehlerBauteileDia[z+2]);
      ListItem.SubItems.Add(FehlerBauteileDia[z+3]);
      if AnzahlSeriennummern <> 0 then
      begin
        if ('Kurzschluß/zu viel Lot' = FehlerBauteileDia[z+3]) or ('offene Lötstelle/zu wenig Lot' = FehlerBauteileDia[z+3]) then
          ListItem.SubItems.Add(FloatToStr((StrToInt(FehlerBauteileDia[z+2])/((AnzahlSeriennummern) * StrToInt(frmAOI.Edit3.Text)))*1000000))
        else
          ListItem.SubItems.Add(FloatToStr((StrToInt(FehlerBauteileDia[z+2])/((AnzahlSeriennummern) * StrToInt(frmAOI.Edit4.Text)))*1000000))
      end;
      z:= z + 4;
    end
    else
      break;
  end;

  ZeroMemory(@FruehFehlerDia,SizeOf(FruehFehlerDia));
  ZeroMemory(@SpaetFehlerDia,SizeOf(SpaetFehlerDia));
  ZeroMemory(@NachtFehlerDia,SizeOf(NachtFehlerDia));
  ZeroMemory(@SeriennummerDia,SizeOf(SeriennummerDia));
  ZeroMemory(@FehlerhafteBGRDia,SizeOf(FehlerhafteBGRDia));
  ZeroMemory(@FehlerBauteileDia,SizeOf(FehlerBauteileDia));

  frmAOI.ListView6.AlphaSort;
end;

procedure TfrmAOI.Button1Click(Sender: TObject);
var
  Datum: TDateTime;
  pfad, zeile, tmpSerNr:String;
  Schicht, aktSchicht: Char;
  FruehFehler, SpaetFehler, NachtFehler: array[0..30of String;
  FruehSerNr, SpaetSerNr, NachtSerNr, FruehBauteil, SpaetBauteil, NachtBauteil: array[0..1000of String;
  ini: TIniFile;
  DateiDB: TextFile;
  i, i_progressBar, AnzahlFrueh, AnzahlSpaet, AnzahlNacht, index: Integer;
  check, progressBar, insert: Boolean;
  SchichtDatum: TDateTime;
  ListItem : TListItem;
begin
  frmLoad.Show;
  frmLoad.Update;
  frmLoad.ProgressBar1.Max := 100;
  Chart1.Title.Text.Clear;
  Chart1.Title.Text.Add('Fehlerrate Basic Induktion LT ' + FormatDateTime('MMMM', DateTimePicker2.Date));
  Chart1.Foot.Text.Clear;
  Chart1.Foot.Text.Add('Erstellt am: ' + FormatDateTime('dd.mm.yyyy', now));
  
  Chart3.Title.Text.Clear;
  Chart3.Title.Text.Add('ppm Ausschuß ' + FormatDateTime('MMMM', DateTimePicker2.Date));
  Chart3.Foot.Text.Clear;
  Chart3.Foot.Text.Add('Erstellt am: ' + FormatDateTime('dd.mm.yyyy', now));

  AnzahlSpaet := 0;
  AnzahlFrueh := 0;
  i_progressBar := 0;
  progressBar := true;
  SchichtDatum := now;

  if ComboBox1.ItemIndex <> -1 then
  begin
    ListView1.Clear;
    ListView2.Clear;
    ListView3.Clear;
    ListView4.Clear;
    for i:=0 to 1000 do
    begin
      if i <= 30 then
      begin
        FruehFehler[i]:='0';
        SpaetFehler[i]:='0';
        NachtFehler[i]:='0';
        if i mod 3 = 0 then
        begin
          FruehFehler[i] := IntToStr(i div 3);
          SpaetFehler[i] := IntToStr(i div 3);
          NachtFehler[i] := IntToStr(i div 3);
        end;
      end;
      FruehSerNr[i]:='0';
      SpaetSerNr[i]:='0';
      NachtSerNr[i]:='0';
      FruehBauteil[i]:='0';
      SpaetBauteil[i]:='0';
      NachtBauteil[i]:='0';
    end;
    AnzahlFrueh := 0;
    AnzahlSpaet := 0;
    AnzahlNacht := 0;
    pfad := ExtractFilePath(ParamStr(0));
    pfad := pfad + '\mde.ini';
    ini:=TIniFile.Create(pfad);
    pfad := ini.ReadString('AOI','Pfad' + IntToSTr(ComboBox1.ItemIndex + 1),pfad);
    ini.free;
    if directoryexists(pfad) then
    begin
      Schicht := 'X';
      //Alle Datumswerte ermitteln
      Datum := StrToDate(FormatDateTime('dd.mm.yyyy', DateTimePicker1.Date));
      While Datum <> StrToDate(FormatDateTime('dd.mm.yyyy', DateTimePicker2.Date))+1 do
      begin
        //Datei öffnen
        if FileExists(pfad + '\' + FormatDateTime('yyyymmdd', Datum)+'.AOI'then
        begin
          AssignFile(DateiDB, pfad + '\' + FormatDateTime('yyyymmdd', Datum)+'.AOI');
          ReSet(DateiDB);
          //Zeile für Zeile die Daten einlesen
          while not Eof(DateiDB) do
          begin
            if i_progressBar = 100 then
              progressBar := false;
            if i_progressBar = 0 then
              progressBar := true;
            if progressBar = true then
              inc(i_progressBar)
            else
              dec(i_progressBar);
            frmLoad.ProgressBar1.Position := i_progressBar;
            ReadLn(DateiDB, zeile);
            Zeile_Aufschluesseln(zeile);
            if (MaskEdit1.Text = '  .   .   'or (MaskEdit1.Text = Felder[2]) then
            begin
              if not IstInString(zeile, 'PASS'then
              begin
                aktSchicht := GetSchicht(StrToTime(Felder[7]));
                if ((FormatDateTime('dd.mm.yyyy', SchichtDatum) <> Felder[6]) and (aktSchicht <> 'N'and (Schicht <> 'X')) or ((SecondsBetween(SchichtDatum , StrToDateTime(Felder[6] + ' ' + Felder[7])) > 28800and (Schicht <> 'X')) then
                begin
                  //Ein Tag ist vorbei hier müssen die Daten gespeichert werden un die Felder geleert
                  //Fehlertyp
                  i:=0;
                  while i < 30 do
                  begin
                    ListItem := ListView1.Items.Add;
                    ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                    ListItem.SubItems.Add(FruehFehler[i+1]);
                    ListItem.SubItems.Add(FruehFehler[i]);
                    ListItem.SubItems.Add(FruehFehler[i+2]);
                    ListItem.SubItems.Add('F');
                    ListItem := ListView1.Items.Add;
                    ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                    ListItem.SubItems.Add(SpaetFehler[i+1]);
                    ListItem.SubItems.Add(SpaetFehler[i]);
                    ListItem.SubItems.Add(SpaetFehler[i+2]);
                    ListItem.SubItems.Add('S');
                    ListItem := ListView1.Items.Add;
                    ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                    ListItem.SubItems.Add(NachtFehler[i+1]);
                    ListItem.SubItems.Add(NachtFehler[i]);
                    ListItem.SubItems.Add(NachtFehler[i+2]);
                    ListItem.SubItems.Add('N');
                    i:= i + 3;
                  end;
                  //Seriennummer
                  i:=0;
                  while i < 1000 do
                  begin
                    if FruehSerNr[i] <> '0' then
                    begin
                      ListItem := ListView2.Items.Add;
                      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                      ListItem.SubItems.Add(FruehSerNr[i+1]);
                      ListItem.SubItems.Add(FruehSerNr[i]);
                      ListItem.SubItems.Add('F');
                    end;
                    if SpaetSerNr[i] <> '0' then
                    begin
                      ListItem := ListView2.Items.Add;
                      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                      ListItem.SubItems.Add(SpaetSerNr[i+1]);
                      ListItem.SubItems.Add(SpaetSerNr[i]);
                      ListItem.SubItems.Add('S');
                    end;
                    if NachtSerNr[i] <> '0' then
                    begin
                      ListItem := ListView2.Items.Add;
                      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                      ListItem.SubItems.Add(NachtSerNr[i+1]);
                      ListItem.SubItems.Add(NachtSerNr[i]);
                      ListItem.SubItems.Add('N');
                    end;
                    i:= i + 2;
                  end;
                  //Bauteil
                  i:=0;
                  while i < 1000 do
                  begin
                    if FruehBauteil[i] <> '0' then
                    begin
                      ListItem := ListView3.Items.Add;
                      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                      ListItem.SubItems.Add(FruehBauteil[i+1]);
                      ListItem.SubItems.Add(FruehBauteil[i]);
                      ListItem.SubItems.Add(FruehBauteil[i+2]);
                      ListItem.SubItems.Add('F');
                      ListItem.SubItems.Add(FruehBauteil[i+3]);
                    end;
                    if SpaetBauteil[i] <> '0' then
                    begin
                      ListItem := ListView3.Items.Add;
                      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                      ListItem.SubItems.Add(SpaetBauteil[i+1]);
                      ListItem.SubItems.Add(SpaetBauteil[i]);
                      ListItem.SubItems.Add(SpaetBauteil[i+2]);
                      ListItem.SubItems.Add('S');
                      ListItem.SubItems.Add(SpaetBauteil[i+3]);
                    end;
                    if NachtBauteil[i] <> '0' then
                    begin
                      ListItem := ListView3.Items.Add;
                      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                      ListItem.SubItems.Add(NachtBauteil[i+1]);
                      ListItem.SubItems.Add(NachtBauteil[i]);
                      ListItem.SubItems.Add(NachtBauteil[i+2]);
                      ListItem.SubItems.Add('N');
                      ListItem.SubItems.Add(NachtBauteil[i+3]);
                    end;
                    i:= i + 4;
                  end;
                  //Anzahl Seriennummern
                  insert := false;
                  //ShowMessage(DateToStr(SchichtDatum));
                  for i:=0 to ListView4.Items.Count-1 do
                  begin
                    if ListView4.Items[i].Caption = FormatDateTime('dd.mm.yyyy', SchichtDatum) then
                    begin
                      if ListView4.Items[i].SubItems[1] = 'F' then
                        ListView4.Items[i].SubItems[0] := IntToStr(StrToInt(ListView4.Items[i].SubItems[0]) + AnzahlFrueh);
                      if ListView4.Items[i].SubItems[1] = 'S' then
                        ListView4.Items[i].SubItems[0] := IntToStr(StrToInt(ListView4.Items[i].SubItems[0]) + AnzahlSpaet);
                      if ListView4.Items[i].SubItems[1] = 'N' then
                        ListView4.Items[i].SubItems[0] := IntToStr(StrToInt(ListView4.Items[i].SubItems[0]) + AnzahlNacht);
                      insert := true;
                    end;
                  end;
                  if insert = false then
                  begin
                    ListItem := ListView4.Items.Add;
                    ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                    if AnzahlFrueh <> 0 then
                      ListItem.SubItems.Add(IntToStr(AnzahlFrueh))
                    else
                      ListItem.SubItems.Add('0');
                    ListItem.SubItems.Add('F');
                    AnzahlFrueh := 0;
                    ListItem := ListView4.Items.Add;
                    ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                    if AnzahlSpaet <> 0 then
                      ListItem.SubItems.Add(IntToStr(AnzahlSpaet))
                    else
                      ListItem.SubItems.Add('0');
                    ListItem.SubItems.Add('S');
                    AnzahlSpaet := 0;
                    ListItem := ListView4.Items.Add;
                    ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
                    if AnzahlNacht <> 0 then
                      ListItem.SubItems.Add(IntToStr(AnzahlNacht))
                    else
                      ListItem.SubItems.Add('0');
                    ListItem.SubItems.Add('N');
                    AnzahlNacht := 0;
                  end
                  else
                  begin
                    AnzahlFrueh := 0;
                    AnzahlSpaet := 0;
                    AnzahlNacht := 0;
                  end;
                  tmpSerNr := '';
                  //Arrays mit Null füllen
                  for i:=0 to 1000 do
                  begin
                    if i <= 30 then
                    begin
                      FruehFehler[i]:='0';
                      SpaetFehler[i]:='0';
                      NachtFehler[i]:='0';
                      if i mod 3 = 0 then
                      begin
                        FruehFehler[i] := IntToStr(i div 3);
                        SpaetFehler[i] := IntToStr(i div 3);
                        NachtFehler[i] := IntToStr(i div 3);
                      end;
                    end;
                    FruehSerNr[i]:='0';
                    SpaetSerNr[i]:='0';
                    NachtSerNr[i]:='0';
                    FruehBauteil[i]:='0';
                    SpaetBauteil[i]:='0';
                    NachtBauteil[i]:='0';
                  end;
                end;
                //Anzahl Seriennummer
                if tmpSerNr <> Felder[4then
                begin
                  if aktSchicht = 'F' then
                    inc(AnzahlFrueh);
                  if aktSchicht = 'S' then
                    inc(AnzahlSpaet);
                  if aktSchicht = 'N' then
                    inc(AnzahlNacht);
                  tmpSerNr := Felder[4];
                end;
                if (aktSchicht = 'F'then
                begin
                  //Fehlertyp
                  If Felder[13] <> '' then
                  begin
                    FruehFehler[StrToInt(Felder[13])*3 + 1] := IntToStr(StrToInt(FruehFehler[StrToInt(Felder[13])*3 + 1]) + 1);
                    FruehFehler[StrToInt(Felder[13])*3 + 2] := Felder[14];
                    SchichtDatum := StrToDateTime(Felder[6] + ' ' + Felder[7]);
                    Schicht := 'F';
                    if Felder[13] <> '0' then
                    begin
                      //Seriennummer
                      check := false;
                      for i:=0 to 1000 do
                      begin
                        if FruehSerNr[i] = Felder[4then
                        begin
                          FruehSerNr[i+1] := IntToStr(StrToInt(FruehSerNr[i+1]) + 1);
                          check := true;
                          break;
                        end;
                        if FruehSerNr[i] = '0' then
                          break;
                      end;
                      if check = false then
                      begin
                        FruehSerNr[i] := Felder[4];
                        FruehSerNr[i+1] := IntToStr(StrToInt(FruehSerNr[i+1]) + 1);
                      end;
                      //BauteilFehler
                      check := false;
                      for i:=0 to 1000 do
                      begin
                        if (FruehBauteil[i] = Felder[10]) and (FruehBauteil[i+3] = Felder[14]) then
                        begin
                          FruehBauteil[i+1] := IntToStr(StrToInt(FruehBauteil[i+1]) + 1);
                          FruehBauteil[i+2] := Felder[11];
                          check := true;
                          break;
                        end;
                        if FruehBauteil[i] = '0' then
                          break;
                      end;
                      if check = false then
                      begin
                        FruehBauteil[i] := Felder[10];
                        FruehBauteil[i+1] := IntToStr(StrToInt(FruehBauteil[i+1]) + 1);
                        FruehBauteil[i+2] := Felder[11];
                        FruehBauteil[i+3] := Felder[14];
                      end;
                    end;
                  end;
                end;
                if aktSchicht = 'S' then
                begin
                  If Felder[13] <> '' then
                  begin
                    //Fehlertyp
                    SpaetFehler[StrToInt(Felder[13])*3 + 1] := IntToStr(StrToInt(SpaetFehler[StrToInt(Felder[13])*3 + 1]) + 1);
                    SpaetFehler[StrToInt(Felder[13])*3 + 2] := Felder[14];
                    SchichtDatum := StrToDateTime(Felder[6] + ' ' + Felder[7]);
                    Schicht := 'S';
                    if Felder[13] <> '0' then
                    begin
                      //Seriennummer
                      check := false;
                      for i:=0 to 1000 do
                      begin
                        if SpaetSerNr[i] = Felder[4then
                        begin
                          SpaetSerNr[i+1] := IntToStr(StrToInt(SpaetSerNr[i+1]) + 1);
                          check := true;
                          break;
                        end;
                        if SpaetSerNr[i] = '0' then
                          break;
                      end;
                      if check = false then
                      begin
                        SpaetSerNr[i] := Felder[4];
                        SpaetSerNr[i+1] := IntToStr(StrToInt(SpaetSerNr[i+1]) + 1);
                      end;
                      //BauteilFehler
                      check := false;
                      for i:=0 to 1000 do
                      begin
                        if (SpaetBauteil[i] = Felder[10]) and (SpaetBauteil[i+3] = Felder[14]) then
                        begin
                          SpaetBauteil[i+1] := IntToStr(StrToInt(SpaetBauteil[i+1]) + 1);
                          SpaetBauteil[i+2] := Felder[11];
                          check := true;
                          break;
                        end;
                        if SpaetBauteil[i] = '0' then
                          break;
                      end;
                      if check = false then
                      begin
                        SpaetBauteil[i] := Felder[10];
                        SpaetBauteil[i+1] := IntToStr(StrToInt(SpaetBauteil[i+1]) + 1);
                        SpaetBauteil[i+2] := Felder[11];
                        SpaetBauteil[i+3] := Felder[14];
                      end;
                    end;
                  end;
                end;
                if (aktSchicht = 'N'and (Schicht <> 'X'then
                begin
                  //Fehlertyp
                  If Felder[13] <> '' then
                  begin
                    NachtFehler[StrToInt(Felder[13])*3 + 1] := IntToStr(StrToInt(NachtFehler[StrToInt(Felder[13])*3 + 1]) + 1);
                    NachtFehler[StrToInt(Felder[13])*3 + 2] := Felder[14];
                    SchichtDatum := StrToDateTime(Felder[6] + ' ' + Felder[7]);
                    Schicht := 'N';
                    if Felder[13] <> '0' then
                    begin
                      //Seriennummer
                      check := false;
                      for i:=0 to 1000 do
                      begin
                        if NachtSerNr[i] = Felder[4then
                        begin
                          NachtSerNr[i+1] := IntToStr(StrToInt(NachtSerNr[i+1]) + 1);
                          check := true;
                          break;
                        end;
                        if NachtSerNr[i] = '0' then
                          break;
                      end;
                      if check = false then
                      begin
                        NachtSerNr[i] := Felder[4];
                        NachtSerNr[i+1] := IntToStr(StrToInt(NachtSerNr[i+1]) + 1);
                      end;
                      //BauteilFehler
                      check := false;
                      for i:=0 to 1000 do
                      begin
                        if (NachtBauteil[i] = Felder[10]) and (NachtBauteil[i+3] = Felder[14]) then
                        begin
                          NachtBauteil[i+1] := IntToStr(StrToInt(NachtBauteil[i+1]) + 1);
                          NachtBauteil[i+2] := Felder[11];
                          check := true;
                          break;
                        end;
                        if NachtBauteil[i] = '0' then
                          break;
                      end;
                      if check = false then
                      begin
                        NachtBauteil[i] := Felder[10];
                        NachtBauteil[i+1] := IntToStr(StrToInt(NachtBauteil[i+1]) + 1);
                        NachtBauteil[i+2] := Felder[11];
                        NachtBauteil[i+3] := Felder[14];
                      end;
                    end;
                  end;
                end;
              end
              else
              begin
                //Anzahl Sreiennummer
                if tmpSerNr <> Felder[4then
                begin
                  index := 5;
                  if Felder[index] = '' then
                    index:=7
                  else
                    index:=6;
                  if GetSchicht(StrToTime(Felder[index])) = 'F' then
                    inc(AnzahlFrueh);
                  if GetSchicht(StrToTime(Felder[index])) = 'S' then
                    inc(AnzahlSpaet);
                  if GetSchicht(StrToTime(Felder[index])) = 'N' then
                    inc(AnzahlNacht);
                  tmpSerNr := Felder[4];
                end;

              end;
            end;
          end;
          CloseFile(DateiDB);
        end;
        Datum := Datum + 1;
      end;
      //Fehlertyp
      i:=0;
      while i < 30 do
      begin
        ListItem := ListView1.Items.Add;
        ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
        ListItem.SubItems.Add(FruehFehler[i+1]);
        ListItem.SubItems.Add(FruehFehler[i]);
        ListItem.SubItems.Add(FruehFehler[i+2]);
        ListItem.SubItems.Add('F');
        ListItem := ListView1.Items.Add;
        ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
        ListItem.SubItems.Add(SpaetFehler[i+1]);
        ListItem.SubItems.Add(SpaetFehler[i]);
        ListItem.SubItems.Add(SpaetFehler[i+2]);
        ListItem.SubItems.Add('S');
        ListItem := ListView1.Items.Add;
        ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
        ListItem.SubItems.Add(NachtFehler[i+1]);
        ListItem.SubItems.Add(NachtFehler[i]);
        ListItem.SubItems.Add(NachtFehler[i+2]);
        ListItem.SubItems.Add('N');
        i:= i + 3;
      end;
      //Seriennummer
      i:=0;
      while i < 1000 do
      begin
        if FruehSerNr[i] <> '0' then
        begin
          ListItem := ListView2.Items.Add;
          ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
          ListItem.SubItems.Add(FruehSerNr[i+1]);
          ListItem.SubItems.Add(FruehSerNr[i]);
          ListItem.SubItems.Add('F');
        end;
        if SpaetSerNr[i] <> '0' then
        begin
          ListItem := ListView2.Items.Add;
          ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
          ListItem.SubItems.Add(SpaetSerNr[i+1]);
          ListItem.SubItems.Add(SpaetSerNr[i]);
          ListItem.SubItems.Add('S');
        end;
        if NachtSerNr[i] <> '0' then
        begin
          ListItem := ListView2.Items.Add;
          ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
          ListItem.SubItems.Add(NachtSerNr[i+1]);
          ListItem.SubItems.Add(NachtSerNr[i]);
          ListItem.SubItems.Add('N');
        end;
        i:= i + 2;
      end;
      //Bauteil
      i:=0;
      while i < 1000 do
      begin
        if FruehBauteil[i] <> '0' then
        begin
          ListItem := ListView3.Items.Add;
          ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
          ListItem.SubItems.Add(FruehBauteil[i+1]);
          ListItem.SubItems.Add(FruehBauteil[i]);
          ListItem.SubItems.Add(FruehBauteil[i+2]);
          ListItem.SubItems.Add('F');
          ListItem.SubItems.Add(FruehBauteil[i+3]);
        end;
        if SpaetBauteil[i] <> '0' then
        begin
          ListItem := ListView3.Items.Add;
          ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
          ListItem.SubItems.Add(SpaetBauteil[i+1]);
          ListItem.SubItems.Add(SpaetBauteil[i]);
          ListItem.SubItems.Add(SpaetBauteil[i+2]);
          ListItem.SubItems.Add('S');
          ListItem.SubItems.Add(SpaetBauteil[i+3]);
        end;
        if NachtBauteil[i] <> '0' then
        begin
          ListItem := ListView3.Items.Add;
          ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
          ListItem.SubItems.Add(NachtBauteil[i+1]);
          ListItem.SubItems.Add(NachtBauteil[i]);
          ListItem.SubItems.Add(NachtBauteil[i+2]);
          ListItem.SubItems.Add('N');
          ListItem.SubItems.Add(NachtBauteil[i+3]);
        end;
        i:= i + 4;
      end;
      //Anzahl Seriennummern
      ListItem := ListView4.Items.Add;
      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
      if AnzahlFrueh <> 0 then
        ListItem.SubItems.Add(IntToStr(AnzahlFrueh))
      else
        ListItem.SubItems.Add('0');
      ListItem.SubItems.Add('F');
      AnzahlFrueh := 0;
      ListItem := ListView4.Items.Add;
      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
      if AnzahlSpaet <> 0 then
        ListItem.SubItems.Add(IntToStr(AnzahlSpaet))
      else
        ListItem.SubItems.Add('0');
      ListItem.SubItems.Add('S');
      AnzahlSpaet := 0;
      ListItem := ListView4.Items.Add;
      ListItem.Caption := FormatDateTime('dd.mm.yyyy', SchichtDatum);
      if AnzahlNacht <> 0 then
        ListItem.SubItems.Add(IntToStr(AnzahlNacht))
      else
        ListItem.SubItems.Add('0');
      ListItem.SubItems.Add('N');

      ListView1.AlphaSort;
      ListView2.AlphaSort;
      ListView3.AlphaSort;
      frmLoad.ProgressBar1.Position := 100;

      Berechne_DiagrammData();
    end
    else
      ShowMessage('Der Pfad in der INI-Datei stimmt nicht, oder Sie haben keine Berechtigung');
  end
  else
    ShowMessage('Sie müssen einen Eintrag in der Combobox auswählen');
{  ZeroMemory(@FruehFehler,SizeOf(FruehFehler));
  ZeroMemory(@SpaetFehler,SizeOf(SpaetFehler));
  ZeroMemory(@NachtFehler,SizeOf(NachtFehler));
  ZeroMemory(@Felder,SizeOf(Felder));
  ZeroMemory(@FruehSerNr,SizeOf(FruehSerNr));
  ZeroMemory(@SpaetSerNr,SizeOf(SpaetSerNr));
  ZeroMemory(@NachtSerNr,SizeOf(NachtSerNr));
  ZeroMemory(@FruehBauteil,SizeOf(FruehBauteil));
  ZeroMemory(@SpaetBauteil,SizeOf(SpaetBauteil));
  ZeroMemory(@NachtBauteil,SizeOf(NachtBauteil));  }


  for i:=0 to 30 do
  begin
    FruehFehler[i] := EmptyStr;
    SpaetFehler[i] := EmptyStr;
    NachtFehler[i] := EmptyStr;
  end;
  for i:=0 to 1000 do
  begin
    FruehSerNr[i] := EmptyStr;
    SpaetSerNr[i] := EmptyStr;
    NachtSerNr[i] := EmptyStr;
    FruehBauteil[i] := EmptyStr;
    SpaetBauteil[i] := EmptyStr;
    NachtBauteil[i] := EmptyStr;
  end;

  frmLoad.Close;
end;

procedure TfrmAOI.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  Compare := CompareDateTime(StrToDateTime(Item1.Caption), StrToDateTime(Item2.Caption));
  if Compare = 0 then
    Compare := CompareText(Item1.SubItems[3], Item2.SubItems[3]);
end;

procedure TfrmAOI.ListView2Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  Compare := CompareDateTime(StrToDateTime(Item1.Caption), StrToDateTime(Item2.Caption));
  if Compare = 0 then
    Compare := CompareText(Item1.SubItems[2], Item2.SubItems[2]);
  if Compare = 0 then
    Compare := CompareText(Item1.SubItems[0], Item2.SubItems[0]);
end;

procedure TfrmAOI.ListView3Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  Compare := CompareDateTime(StrToDateTime(Item1.Caption), StrToDateTime(Item2.Caption));
  if Compare = 0 then
    Compare := CompareText(Item1.SubItems[3], Item2.SubItems[3]);
  if Compare = 0 then
    Compare := CompareText(Item1.SubItems[1], Item2.SubItems[1]);
end;

procedure TfrmAOI.Button4Click(Sender: TObject);
var
  Excel:Variant;
  i: Integer;
begin
  frmLoad.Show;
  frmLoad.Update;
  try
    Excel := CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel konnte nicht gestartet werden !');
    Exit;
  end;
  Excel.Workbooks.Add;
  //Spaltenüberschriften übergeben
  Excel.Cells[11].Value :='Fehlertyp:';
  Excel.Cells[31].Value :='Datum';
  Excel.Cells[32].Value :='Anzahl';
  Excel.Cells[33].Value :='FehlerID';
  Excel.Cells[34].Value :='Fehlerbeschreibung';
  Excel.Cells[35].Value :='Schicht';
  for i:=0 to Listview1.Items.Count-1 do
  begin
    Excel.Cells[i+41].Value :=ListView1.Items[i].Caption;
    Excel.Cells[i+42].Value :=ListView1.Items[i].SubItems[0];
    Excel.Cells[i+43].Value :=ListView1.Items[i].SubItems[1];
    Excel.Cells[i+44].Value :=ListView1.Items[i].SubItems[2];
    Excel.Cells[i+45].Value :=ListView1.Items[i].SubItems[3];
  end;

  Excel.Cells[17].Value :='Seriennummer:';
  Excel.Cells[37].Value :='Datum';
  Excel.Cells[38].Value :='SerNr';
  Excel.Cells[39].Value :='Anzahl';
  Excel.Cells[310].Value :='Schicht';
  for i:=0 to Listview2.Items.Count-1 do
  begin
    Excel.Cells[i+47].Value :=ListView2.Items[i].Caption;
    Excel.Cells[i+48].Value :=ListView2.Items[i].SubItems[0];
    Excel.Cells[i+49].Value :=ListView2.Items[i].SubItems[1];
    Excel.Cells[i+410].Value :=ListView2.Items[i].SubItems[2];
  end;

  Excel.Cells[112].Value :='Bauteile:';
  Excel.Cells[312].Value :='Datum';
  Excel.Cells[313].Value :='Bauteil';
  Excel.Cells[314].Value :='Anzahl';
  Excel.Cells[315].Value :='Beschreibung';
  Excel.Cells[316].Value :='Schicht';
  Excel.Cells[317].Value :='Fehler';
  for i:=0 to Listview3.Items.Count-1 do
  begin
    Excel.Cells[i+412].Value :=ListView3.Items[i].Caption;
    Excel.Cells[i+413].Value :=ListView3.Items[i].SubItems[0];
    Excel.Cells[i+414].Value :=ListView3.Items[i].SubItems[1];
    Excel.Cells[i+415].Value :=ListView3.Items[i].SubItems[2];
    Excel.Cells[i+416].Value :=ListView3.Items[i].SubItems[3];
    Excel.Cells[i+417].Value :=ListView3.Items[i].SubItems[4];
  end;
  Excel.Visible:= true;

  Excel.Cells[119].Value :='Anzahl Seriennummern:';
  Excel.Cells[319].Value :='Datum';
  Excel.Cells[320].Value :='Anzahl';
  Excel.Cells[321].Value :='Schicht';
  for i:=0 to Listview4.Items.Count-1 do
  begin
    Excel.Cells[i+419].Value :=ListView4.Items[i].Caption;
    Excel.Cells[i+420].Value :=ListView4.Items[i].SubItems[0];
    Excel.Cells[i+421].Value :=ListView4.Items[i].SubItems[1];
  end;
  Excel.Visible:= true;
  frmLoad.Close;
end;

procedure TfrmAOI.FormShow(Sender: TObject);
var
  pfad, tmp:String;
  ini: TIniFile;
  Anzahl, i: Integer;
begin
  Anzahl := 0;
  pfad := ExtractFilePath(ParamStr(0));
  pfad := pfad + '\mde.ini';
  ini:=TIniFile.Create(pfad);
  Anzahl:= ini.ReadInteger('AOI','Anzahl',Anzahl);
  Edit3.Text := ini.ReadString('AOI','AnzahlLoetstellen',tmp);
  Edit4.Text := ini.ReadString('AOI','AnzahlBT',tmp);
  for i:=1 to Anzahl do
  begin
    Combobox1.Items.Add(Ini.ReadString('AOI''Name' + IntToStr(i), pfad));
  end;
  ini.Free;
  ComboBox1.ItemIndex := 0;

  DateTimePicker1.DateTime := now - DayOfWeek(now) + 2;
  DateTimePicker2.DateTime := now;

end;

procedure TfrmAOI.Chart1GetLegendText(Sender: TCustomAxisPanel;
  LegendStyle: TLegendStyle; Index: Integer; var LegendText: String);
begin
  if index = 0 then
    LegendText := 'ppm offene Lötstelle';
  if index = 1 then
    LegendText := 'ppm ZB';
  if index = 2 then
    LegendText := 'ppm Bauteil fehlt';
  if index = 3 then
    LegendText := 'ppm Bauteil besch.';
  if index = 4 then
    LegendText := 'ppm Position Bauteil';
  if index = 5 then
    LegendText := 'ppm Grabstein';
  if index = 6 then
    LegendText := 'Frühschicht Prozent Fehlerhaft';
  if index = 7 then
    LegendText := 'Spätschicht Prozent Fehlerhaft';
end;

procedure TfrmAOI.Button2Click(Sender: TObject);
var
  datei, pfad: String;
  ini: TiniFile;
begin
  pfad := ExtractFilePath(ParamStr(0));
  pfad := pfad + 'mde.ini';
  ini:=TIniFile.Create(pfad);
  pfad := ini.ReadString('Kennzahlen','Pfad',pfad);
  ini.Free;
  SaveDialog1.InitialDir := pfad;
  SaveDialog1.Execute;
  datei := SaveDialog1.FileName;
  case  PageControl1.TabIndex of
    2: Chart_Speichern(Chart1, datei, 945550);
    3: Chart_Speichern(Chart3, datei, 945550);
  end;
  DiagrammDesign(Chart1, 3739458810, clBlack, taLeftJustify, 8, clBlue, taRightJustify, clWhite, RGB(15185185), laBottom, 1111);
  DiagrammDesign(Chart3, 3739458810, clBlack, taLeftJustify, 8, clBlue, taRightJustify, clWhite, RGB(15185185), laBottom, 1111);
end;

procedure TfrmAOI.Button3Click(Sender: TObject);
var
  bmp , TargetBitmap: TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.Assign(frmAOI.GetFormImage);
  TargetBitmap := TBitmap.Create;
  TargetBitmap.Height := frmAOI.PageControl1.Height-41;
  TargetBitmap.Width := frmAOI.PageControl1.Width-26;
  BitBlt(TargetBitmap.Canvas.Handle, 00, frmAOI.PageControl1.Width, frmAOI.PageControl1.Height-20, bmp.Canvas.Handle,frmAOI.PageControl1.Left+12, frmAOI.PageControl1.Top+33, SRCCOPY);
  if PrintDialog1.Execute then
  begin
    Printer.orientation:=polandscape;
    Printer.BeginDoc;
    SetMapMode(Printer.Canvas.Handle, MM_ANISOTROPIC);
    Printer.Canvas.StretchDraw(RECT(0,0,Printer.PageWidth,Printer.PageHeight), TargetBitmap);
    Printer.EndDoc;
  end;
end;

procedure TfrmAOI.Button5Click(Sender: TObject);
var
  Excel:Variant;
  i: Integer;
begin
  frmLoad.Show;
  frmLoad.Update;
  try
    Excel := CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel konnte nicht gestartet werden !');
    Exit;
  end;
  Excel.Workbooks.Add;
  //Spaltenüberschriften übergeben
  Excel.Cells[11].Value :='Datum:';
  Excel.Cells[12].Value :='Schicht';
  Excel.Cells[13].Value :='OL';
  Excel.Cells[14].Value :='ppm OL';
  Excel.Cells[15].Value :='ZB';
  Excel.Cells[16].Value :='ppm ZB';
  Excel.Cells[17].Value :='BT fehlt';
  Excel.Cells[18].Value :='ppm BT fehlt';
  Excel.Cells[19].Value :='BT besch.';
  Excel.Cells[110].Value :='ppm BT besch.';
  Excel.Cells[111].Value :='Pos BT';
  Excel.Cells[112].Value :='ppm Pos BT';
  Excel.Cells[113].Value :='Ausschuß';
  Excel.Cells[114].Value :='ppm Ausschuß';
  Excel.Cells[115].Value :='gepr. BGR ';
  Excel.Cells[116].Value :='fehlerhaft BGR';
  Excel.Cells[117].Value :='Prozent Fehler';
  frmLoad.Progressbar1.Max := Listview5.Items.Count;
  for i:=0 to Listview5.Items.Count-1 do
  begin
    frmLoad.Progressbar1.Position := i;
    Excel.Cells[i+21].Value :=ListView5.Items[i].Caption;
    Excel.Cells[i+22].Value :=ListView5.Items[i].SubItems[0];
    Excel.Cells[i+23].Value :=StrToFloat(ListView5.Items[i].SubItems[1]);
    Excel.Cells[i+24].Value :=StrToFloat(ListView5.Items[i].SubItems[2]);
    Excel.Cells[i+25].Value :=StrToFloat(ListView5.Items[i].SubItems[3]);
    Excel.Cells[i+26].Value :=StrToFloat(ListView5.Items[i].SubItems[4]);
    Excel.Cells[i+27].Value :=StrToFloat(ListView5.Items[i].SubItems[5]);
    Excel.Cells[i+28].Value :=StrToFloat(ListView5.Items[i].SubItems[6]);
    Excel.Cells[i+29].Value :=StrToFloat(ListView5.Items[i].SubItems[7]);
    Excel.Cells[i+210].Value :=StrToFloat(ListView5.Items[i].SubItems[8]);
    Excel.Cells[i+211].Value :=StrToFloat(ListView5.Items[i].SubItems[9]);
    Excel.Cells[i+212].Value :=StrToFloat(ListView5.Items[i].SubItems[10]);
    Excel.Cells[i+213].Value :=StrToFloat(ListView5.Items[i].SubItems[11]);
    Excel.Cells[i+214].Value :=StrToFloat(ListView5.Items[i].SubItems[12]);
    Excel.Cells[i+215].Value :=StrToFloat(ListView5.Items[i].SubItems[13]);
    Excel.Cells[i+216].Value :=StrToFloat(ListView5.Items[i].SubItems[14]);
    Excel.Cells[i+217].Value :=StrToFloat(ListView5.Items[i].SubItems[15]);
  end;
  Excel.Visible:= true;
  frmLoad.Close;
end;

procedure TfrmAOI.Chart2GetLegendText(Sender: TCustomAxisPanel;
  LegendStyle: TLegendStyle; Index: Integer; var LegendText: String);
begin
  if index = 0 then
    LegendText := 'Frühschicht Prozent Fehlerhaft';
  if index = 1 then
    LegendText := 'Spätschicht Prozent Fehlerhaft';
end;

procedure TfrmAOI.ListView6Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
begin
  Compare := StrToInt(Item2.SubItems[1])-StrToInt(Item1.SubItems[1]);
end;

procedure TfrmAOI.Edit3Change(Sender: TObject);
var
  ini: TIniFile;
  pfad:string;
begin
  pfad := ExtractFilePath(ParamStr(0));
  pfad := pfad + 'mde.ini';
  ini:=TIniFile.Create(pfad);
  ini.WriteString('AOI','AnzahlLoetstellen',edit3.Text);
  ini.Free;
end;

procedure TfrmAOI.Edit4Change(Sender: TObject);
var
  ini: TIniFile;
  pfad:string;
begin
  pfad := ExtractFilePath(ParamStr(0));
  pfad := pfad + 'mde.ini';
  ini:=TIniFile.Create(pfad);
  ini.WriteString('AOI','AnzahlBT',edit4.Text);
  ini.Free;
end;

procedure TfrmAOI.Button6Click(Sender: TObject);
var
  Excel:Variant;
  i: Integer;
begin
  frmLoad.Show;
  frmLoad.Update;
  try
    Excel := CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel konnte nicht gestartet werden !');
    Exit;
  end;
  Excel.Workbooks.Add;
  //Spaltenüberschriften übergeben
  Excel.Cells[11].Value :='Bauteil:';
  Excel.Cells[12].Value :='Beschreibung';
  Excel.Cells[13].Value :='Anzahl';
  Excel.Cells[14].Value :='Fehler';
  Excel.Cells[15].Value :='ppm';
  frmLoad.Progressbar1.Max := Listview6.Items.Count;
  for i:=0 to Listview6.Items.Count-1 do
  begin
    frmLoad.ProgressBar1.Position := frmLoad.ProgressBar1.Position + 1;
    Excel.Cells[i+21].Value :=ListView6.Items[i].Caption;
    Excel.Cells[i+22].Value :=ListView6.Items[i].SubItems[0];
    Excel.Cells[i+23].Value :=ListView6.Items[i].SubItems[1];
    Excel.Cells[i+24].Value :=ListView6.Items[i].SubItems[2];
    Excel.Cells[i+25].Value :=StrToFloat(ListView6.Items[i].SubItems[3]);
  end;
  frmLoad.ProgressBar1.Position := frmLoad.Progressbar1.Max;
  Excel.Visible:= true;
  frmLoad.Close;
end;

procedure TfrmAOI.Chart3GetLegendText(Sender: TCustomAxisPanel;
  LegendStyle: TLegendStyle; Index: Integer; var LegendText: String);
begin
  if index = 0 then
    LegendText := 'Frühschicht ppm Ausschuß';
  if index = 1 then
    LegendText := 'Spätschicht ppm Ausschuß';
end;

procedure TfrmAOI.FormCreate(Sender: TObject);
begin
  DiagrammDesign(Chart1, 3739458810, clBlack, taLeftJustify, 8, clBlue, taRightJustify, clWhite, clWhite, laBottom, 1111);
  DiagrammDesign(Chart3, 3739458810, clBlack, taLeftJustify, 8, clBlue, taRightJustify, clWhite, clWhite, laBottom, 1111);
  frmAOI.Resize;
end;

procedure TfrmAOI.FormResize(Sender: TObject);
begin
  //Elemente an Bildschirmauflösung anpassen
  PageControl1.Height := frmAOI.Height - PageControl1.Top - 70;
  PageControl1.Width := frmAOI.Width - PageControl1.Left - 20;

  Chart1.Height := PageControl1.Height - 40;
  Chart1.Width := PageControl1.Width - 20;
  Chart3.Height := PageControl1.Height - 40;
  Chart3.Width := PageControl1.Width - 20;

  Listview5.Height := PageControl1.Height - 80;
  Listview5.Width := PageControl1.Width - 20;
  
  Button5.Top := Listview5.Top + Listview5.Height + 5;

  Button3.Top := PageControl1.Height + PageControl1.Top + 5;
  Button2.Top := PageControl1.Height + PageControl1.Top + 5;
end;

end.

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!