Autor Beitrag
LowSkills
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 111

Windows XP
Delphi 6 Professional
BeitragVerfasst: Sa 28.07.07 15:23 
Aloha!

Mal wieder was für euch... zum grübeln :mrgreen:
Ich habe eine (Ich hoffe) saubere Programmierung geleistet. Das Programm soll Serienmails auf der Basis von

1. Selbst geschriebenen oder geladenen Texten und
2. Daten aus einer AccessDB

verfassen.

Von den procedures und functions her sollte alles eigentlich (bisher wars so) fehlerfrei laufen. Aber - und jetzt kommt das große aber:

Der Speicher wird gesprengt:
Debuggermeldung: [...]OutOfMemory - Programm wird geschlossen.
Vorher bekomm ich von Windows die Meldung, dass mein virtueller Speicher nicht ausreicht und die Auslagerungsdatei vergrößert wird.

Zugegeben: Mein Rechner ist ne alte Krücke, aber ich kann ja nicht aus meiner Haut und das Progg muss an den Mann... :(

Erstmal der QT:
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:
unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;

type
  TSENDINGSTATS = class(TForm)
    PN_IMPORTANT_ADVICE: TPanel;
    IM_SECURITY: TImage;
    LB_IMPORTANT_ADVICE: TLabel;
    LB_IMPORTANT_ADVICE1: TLabel;
    LB_IMPORTANT_ADVICE2: TLabel;
    LB_IMPORTANT_ADVICE3: TLabel;
    Panel1: TPanel;
    PB_GESAMT: TProgressBar;
    LB_PROGRESS_GESAMT: TLabel;
    PB_NOW: TProgressBar;
    LB_PROGRESS_NOW: TLabel;
    RichEdit_SENDINGSTATS: TRichEdit;
    MM_LogDatei: TMemo;
    RichEdit_TEMP: TRichEdit;
    MM_PrintOuts: TMemo;
    Timer_Load: TTimer;
    procedure FormActivate(Sender: TObject);
    procedure GetEW;
    procedure FailedRequest_Close;
    procedure Server_zuweisen;
    procedure Ansprechpartner;
    procedure Mediadaten;
    procedure VLG_Kombis;
    procedure RelevanteVerlageErmitteln;
    procedure BTP_oder_Prodigit;
    procedure Anforderung_Durchfuehren;
    procedure aktuellen_VLG_ermitteln;
    procedure ausgabenliste_erstellen;
    procedure Anhang_Ja_Nein;
    procedure Ausgabenliste_Einfuegen;
    procedure Verlagsliste_aktualisieren;
    procedure Dokumentation;
    procedure Fortschritt;
    procedure GesamtFortschritt;
    procedure BriefSpeichern;
    procedure abschicken;
    procedure PlainToHTML;
    procedure Anhang_hinzufuegen;
    procedure eMail_rausfinden;
    procedure NoMailToPrint;
    procedure Timer_LoadTimer(Sender: TObject);
    procedure initilaize;
    procedure connectT10;
    procedure disconnectT10;
    procedure connectT1001;
    procedure disconnectT1001;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  SENDINGSTATS: TSENDINGSTATS;
  CloseDatabase: boolean;
  woe, mntl, Zwoe, Dwoe, Zxwoe, BTP_MAIL, PRODIGIT_MAIL : string;
  MonthNameNow, MonthNamePast, MonthNamePast2, MonthNamePast3, MonthNamePast4 : string;
  Sending_failed, btp: boolean;
  Name, Tel, eMail: string;
  Anrede: string;
  MediadatenNr, ValidSince: string;
  Anhang: boolean;
  Listing: Text;
  aktueller_VLG: string;
  BE_ANZAHL, Verlagsanzahl: integer;
  Fehler, Doku, Info, GesInfo: String;
  AnzahlVerlage: integer;
  SendViaMail: boolean;
  eMailEmpfaenger: string;
  SQLnichtda: boolean;

implementation

uses Unit2, PowerReceiver, ShlObj, ActiveX, uDatenaustausch, DateUtils,
  uVerlagsgruppen, uProgress;

{$R *.dfm}

function GetSpecialFolder(iGUID: integer): string;
var
  shellMalloc : IMalloc;
  ppidl       : PItemIdList;
begin
  ppidl := nil;
  try
    if SHGetMalloc(shellMalloc) = NOERROR then
    begin
      SHGetSpecialFolderLocation(Form1.Handle, iGUID, ppidl);
      SetLength(Result, MAX_PATH);
      if not SHGetPathFromIDList(ppidl, PChar(Result)) then
        raise exception.create('SHGetPathFromIDList failed : invalid pidl');
      SetLength(Result, lStrLen(PChar(Result)));
    end;
  finally
   if ppidl <> nil then
         shellMalloc.free(ppidl);
  end;
end;

procedure TSENDINGSTATS.VLG_Kombis;
var c, codesource: integer;
    d, Codes: integer;
    MainCode: string;
    r: integer;
begin
  For c:=1 to 50 do
    //Durchläuft die schleife 50 mal!
    begin
      //überprüft, ob es hinterlegte Daten für Fall-c gibt
      If FileExists(GetSpecialFolder($26)+'\Power Tools\VLG_DATA_'+IntToStr(c)+'.dat'then
        begin
          //lädt die benötigten Daten rein!
          Verlagsgruppen.MM_SETTINGS_VLG.Lines.Clear;
          Verlagsgruppen.MM_SETTINGS_VLG.Lines.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\VLG_DATA_'+IntToStr(c)+'.dat');
          Verlagsgruppen.ED_VERLAGSGRUPPENNAME.Text:=Verlagsgruppen.MM_SETTINGS_VLG.Lines[0];
          Verlagsgruppen.CB_GENDER.ItemIndex:=StrToInt(Verlagsgruppen.MM_SETTINGS_VLG.Lines[1]);
          Verlagsgruppen.ED_VLG_NAME.Text:=Verlagsgruppen.MM_SETTINGS_VLG.Lines[2];
          Verlagsgruppen.ED_VLG_EMAIL.Text:=Verlagsgruppen.MM_SETTINGS_VLG.Lines[3];
          Verlagsgruppen.ED_VLG_STRASSE.Text:=Verlagsgruppen.MM_SETTINGS_VLG.Lines[4];
          Verlagsgruppen.ED_VLG_PLZ.Text:=Verlagsgruppen.MM_SETTINGS_VLG.Lines[5];
          Verlagsgruppen.ED_VLG_ORT.Text:=Verlagsgruppen.MM_SETTINGS_VLG.Lines[6];
          Codesource:=StrToInt(Verlagsgruppen.MM_SETTINGS_VLG.Lines[7]);
          Verlagsgruppen.ListBox_VLG_CODES.Items.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\VLG_DATA_'+IntToStr(Codesource)+'_CODES.dat');
          //Alle DS wie Name, Codes, etc sind da!

          Codes:=Verlagsgruppen.ListBox_VLG_CODES.Items.Count;
          //Anzahl der Codes wurde für For-Schleife bereitgestellt!
          MainCode:=Verlagsgruppen.ListBox_VLG_CODES.Items[0];

         { For d:=1 to Codes-1 do
            begin
              Datenaustausch.ADOQuery.Close;
              Datenaustausch.ADOQuery.SQL.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\SQL\VLGKombiBEN.dat');
              Datenaustausch.ADOQuery.SQL.Add('WHERE (([T10 - Belegungseinheiten].[Code Verlag]='+Verlagsgruppen.ListBox_VLG_CODES.Items[d]+') AND ([T10 - Belegungseinheiten].[TB/Ko/GA]="TB"));');
              Datenaustausch.ADOQuery.Open;
              Datenaustausch.AdoQuery.ExecSQL;
              //Hier wird ersetzt
              Datenaustausch.ADOQuery.First;
                While Not Datenaustausch.ADOQuery.Eof do
                  begin
                    Datenaustausch.ADOQuery.Edit;
                    Datenaustausch.ADOQuery.FieldValues['Code Verlag']:=Maincode;
                    Datenaustausch.ADOQuery.UpdateRecord;
                    Datenaustausch.ADOQuery.Next;
                  end;
              Datenaustausch.ADOQuery.Close;
            end;  }


          //Verlage löschen, die nicht gebraucht werden und MainCode Daten vergeben
          For d:=1 to Codes-1 do
            begin
              Datenaustausch.ADOQueryVLG.Close;
              Datenaustausch.ADOQueryVLG.SQL.Clear;
              Datenaustausch.ADOQueryVLG.SQL.Text:='DELETE FROM [T1001 - Verlag] WHERE (([T1001 - Verlag].[Code Verlag]='+Verlagsgruppen.ListBox_VLG_CODES.Items[d]+'));';
              Datenaustausch.AdoQueryVLG.ExecSQL;
            end;
              Datenaustausch.ADOQueryVLG.Close;
              Datenaustausch.ADOQueryVLG.SQL.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\SQL\VLGKombi.dat');
              Datenaustausch.ADOQueryVLG.SQL.Add('WHERE (([T1001 - Verlag].[Code Verlag]='+MainCode+'));');
              Datenaustausch.ADOQueryVLG.Open;
              Datenaustausch.AdoQueryVLG.ExecSQL;

              //ersetzen beginnt hier:
              Datenaustausch.ADOQueryVLG.First;

              Datenaustausch.ADOQueryVLG.Edit;
              Datenaustausch.ADOQueryVLG.FieldValues['Name des Verlages']:=Verlagsgruppen.ED_VERLAGSGRUPPENNAME.Text;
              Datenaustausch.ADOQueryVLG.UpdateRecord;
              Datenaustausch.ADOQueryVLG.Edit;
              Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - Ansprechpartner']:=Verlagsgruppen.ED_VLG_NAME.Text;
              Datenaustausch.ADOQueryVLG.UpdateRecord;
              Datenaustausch.ADOQueryVLG.Edit;
              Datenaustausch.ADOQueryVLG.FieldValues['Verlag Ort']:='KOMBI';
              Datenaustausch.ADOQueryVLG.UpdateRecord;
              ShowMessage('fertich');
        end;
    end;


end;

procedure TSENDINGSTATS.FormActivate(Sender: TObject);
var SQLNichtda: boolean;
begin
  //ProgressBars vorbereiten
  SENDINGSTATS.PB_GESAMT.Position:=0;
  SENDINGSTATS.PB_NOW.Position:=0;
  SENDINGSTATS.LB_PROGRESS_GESAMT.Caption:='';
  SENDINGSTATS.LB_PROGRESS_NOW.Caption:='';

  //RichEdit Leer machen...
  SENDINGSTATS.RichEdit_SENDINGSTATS.Clear;

  If not DirectoryExists(GetSpecialFolder($26)+'\Power Tools\Temporary'then
    begin
      mkDir(GetSpecialFolder($26)+'\Power Tools\Temporary');
    end;

  If not DirectoryExists(GetSpecialFolder($26)+'\Power Tools\Temporary\Print'then
    begin
      mkDir(GetSpecialFolder($26)+'\Power Tools\Temporary\Print');
    end;

  If not DirectoryExists(GetSpecialFolder($26)+'\Power Tools\Documentations'then
    begin
      mkDir(GetSpecialFolder($26)+'\Power Tools\Documentations');
    end;

  If not DirectoryExists(GetSpecialFolder($26)+'\Power Tools\Documentations\'+DateToStr(Now)) then
    begin
      mkDir(GetSpecialFolder($26)+'\Power Tools\Documentations\'+DateToStr(Now));
    end;

  If not DirectoryExists(GetSpecialFolder($26)+'\Power Tools\Documentations\'+DateToStr(Now)+'\Anhänge'then
    begin
      mkDir(GetSpecialFolder($26)+'\Power Tools\Documentations\'+DateToStr(Now)+'\Anhänge');
    end;

  If not FileExists(GetSpecialFolder($26)+'\Power Tools\documentations\doc_'+DateToStr(Date)+'.dat'then
    begin
      SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.SaveToFile((GetSpecialFolder($26)+'\Power Tools\documentations\doc_'+DateToStr(Date)+'.dat'));
    end;

  If Not FileExists(GetSpecialFolder($26)+'\Power Tools\Temporary\Log.dat'then
    begin
      SENDINGSTATS.MM_LogDatei.Lines.Clear;
      SENDINGSTATS.MM_LogDatei.Lines[0]:='false';
      SENDINGSTATS.MM_LogDatei.Lines.Add(IntToStr(Form1.TB_QUANTITY.Position));
      SENDINGSTATS.MM_LogDatei.Lines.Add(Form1.ED_LOAD_BTP.Text);
      SENDINGSTATS.MM_LogDatei.Lines.Add(Form1.ED_LOAD_PRODIGIT.Text);
      SENDINGSTATS.MM_LogDatei.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Temporary\Log.dat');
    end;

  SENDINGSTATS.Timer_Load.Enabled:=true;
end;

procedure TSENDINGSTATS.initilaize;
begin
  //Verlagskombinationen überprüfen

  //Alle relevanten Verlage ermitteln
  SENDINGSTATS.RelevanteVerlageErmitteln;

  //ProgressBar Maximum = 2*Verlagsanzahl
  SENDINGSTATS.PB_GESAMT.Max:=2*AnzahlVerlage;

  //Daten der Erscheinung ermitteln
  SENDINGSTATS.GetEW;

  //Überprüfung, ob Daten da sind (SQL)
  SQLnichtda:=false;
  if not FileExists(GetSpecialFolder($26)+'\Power Tools\SQL\relevantVLG.dat'then SQLnichtda:=true;
  if SQLnichtda = true then
    begin
      Fehler:='Es Fehlen SQL-Anweisungen. Das Programm wird geschlossen';
      SENDINGSTATS.FailedRequest_Close;
    end;

  //ALLE GRUNDDATEN DA?
  // JA ----->  ANFORDERUNG STARTEN...
  SENDINGSTATS.Anforderung_Durchfuehren;
end;

procedure TSENDINGSTATS.Anforderung_Durchfuehren;
var y : integer;
begin
  //ProgressBar (Now) vorbereiten
  SENDINGSTATS.PB_NOW.Max:=29;
  //SCHLEIFE INITIALISIEREN
For y:=0 to Verlagsanzahl do
  begin
  SENDINGSTATS.PB_NOW.Position:=0;

  //aktuellen Verlag ermitteln
  SENDINGSTATS.aktuellen_VLG_ermitteln;

  GesInfo:='Erstelle eMail für Verlag '+aktueller_VLG+'...';
  SENDINGSTATS.GesamtFortschritt;

  //Verlagssensitive Daten auslesen

  //Connecten zu T10 - Belegungseinheiten
  SENDINGSTATS.connectT10;

  //BTP Ja/Nein | T10 - Belegungseinheiten
  SENDINGSTATS.BTP_oder_Prodigit;
  {
  //SERVER ZUWEISEN
  SENDINGSTATS.Server_zuweisen; }


  //Ausgabenliste erstellen | T10 - Belegungseinheiten
  SENDINGSTATS.ausgabenliste_erstellen;

  //Anhang ja oder nein? | T10 - Belegungseinheiten
  SENDINGSTATS.Anhang_Ja_Nein;

  //Ausgabenliste Einfügen in Brief oder Speichern | -
  SENDINGSTATS.Ausgabenliste_Einfuegen;

  //Mediadaten prüfen  | T10 - Belegungseinheiten
  SENDINGSTATS.Mediadaten;

  //DisconnectT10
  SENDINGSTATS.disconnectT10;

  {//Anhang bekannt machen oder nicht | -
  SENDINGSTATS.Anhang_hinzufuegen; }


  //Wenn KOMBI dann als TXT in TEMP2 speichern und für drucken vormerken

  //HTML-Konvertierung vornehmen!

  //Mail abspeichern

  //Connecten T1001
  SENDINGSTATS.connectT1001;

  //MailTo ermitteln  | T1001 - Tarif
  SENDINGSTATS.eMail_rausfinden;

  //Ansprechpartner ermitteln | T1001 - Tarif
  SENDINGSTATS.Ansprechpartner;

  //Disconnect T1001
  SENDINGSTATS.disconnectT1001;

  //Mail Versenden
  If SendViaMail = true then
    begin
      SENDINGSTATS.abschicken;
    end
  else
    begin
      //Wenn keine eMail Adresse hinterlegt ist, dann info...
      SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.Add(TimeToStr(Now)+': Für Verlag '+aktueller_VLG+' ist keine eMail-Adresse hinterlegt. Die Datei wird gespeichert und nach der Versendung aller Mails ausgedruckt.');
      //...und speichern + vormerken für den Druck
      SENDINGSTATS.NoMailToPrint;
    end;

  //aktuelle Verlagsliste erstellen
  SENDINGSTATS.Verlagsliste_aktualisieren;

  //Brief abspeichern
  SENDINGSTATS.BriefSpeichern;

  //Info aktualisieren
  GesInfo:='eMail an Verlag '+aktueller_VLG+' erfolgreich erstellt und versendet... ermittle nächsten Verlag...';
  SENDINGSTATS.GesamtFortschritt;
  SENDINGSTATS.RichEdit_TEMP.Clear;
  end;

  //Temporärdaten löschen
  If DirectoryExists(GetSpecialFolder($26)+'\Power Tools\Temporary'then
    begin
      //löschen
    end;
end;

procedure TSENDINGSTATS.GetEW;
begin
  try
    SENDINGSTATS.LB_PROGRESS_NOW.Caption:='Ermittle mögliche Erscheinungsweisen und deren Parameter...';
    SENDINGSTATS.LB_PROGRESS_NOW.Refresh;
    case MonthOfTheYear(now) of
      1begin
           MonthNamePast4:='September';
           MonthNamePast3:='Oktober';
           MonthNamePast2:='November';
           MonthNamePast:='Dezember';
           MonthNameNow:='Januar';
         end;
      2begin
           MonthNamePast4:='Oktober';
           MonthNamePast3:='November';
           MonthNamePast2:='Dezember';
           MonthNamePast:='Januar';
           MonthNameNow:='Februar';
         end;
      3begin
           MonthNamePast4:='November';
           MonthNamePast3:='Dezember';
           MonthNamePast2:='Januar';
           MonthNamePast:='Febraur';
           MonthNameNow:='März';
         end;
      4begin
           MonthNamePast4:='Dezember';
           MonthNamePast3:='Januar';
           MonthNamePast2:='Februar';
           MonthNamePast:='März';
           MonthNameNow:='April';
         end;
      5begin
           MonthNamePast4:='Januar';
           MonthNamePast3:='Februar';
           MonthNamePast2:='März';
           MonthNamePast:='April';
           MonthNameNow:='Mai';
         end;
      6begin
           MonthNamePast4:='Februar';
           MonthNamePast3:='März';
           MonthNamePast2:='April';
           MonthNamePast:='Mai';
           MonthNameNow:='Juni';
         end;
      7begin
           MonthNamePast4:='März';
           MonthNamePast3:='April';
           MonthNamePast2:='Mai';
           MonthNamePast:='Juni';
           MonthNameNow:='Juli';
         end;
      8begin
           MonthNamePast4:='April';
           MonthNamePast3:='Mai';
           MonthNamePast2:='Juni';
           MonthNamePast:='Juli';
           MonthNameNow:='August';
         end;
      9begin
           MonthNamePast4:='Mai';
           MonthNamePast3:='Juni';
           MonthNamePast2:='Juli';
           MonthNamePast:='August';
           MonthNameNOw:='September';
         end;
      10begin
            MonthNamePast4:='Juni';
            MonthNamePast3:='Juli';
            MonthNamePast2:='August';
            MonthNamePast:='September';
            MonthNameNow:='Oktober';
          end;
      11begin
            MonthNamePast4:='Juli';
            MonthNamePast3:='August';
            MonthNamePast2:='September';
            MonthNamePast:='Oktober';
            MonthNameNow:='November';
          end;
      12begin
            MonthNamePast4:='August';
            MonthNamePast3:='September';
            MonthNamePast2:='Oktober';
            MonthNamePast:='November';
            MonthNameNow:='Dezember';
          end;
    end;
    if form1.TB_QUANTITY.Position = 2 then
          begin
    woe:=', KW '+IntTostr(WeekOfTheYear(now)-2)+' und '+IntToStr(WeekOfTheYear(now)-1)+';';
    mntl:=', Ausgaben '+MonthNamePast2+' und '+MonthNamePast+';';
    Zxwoe:=', Ausgaben der KW '+IntTostr(WeekOfTheYear(now)-2)+' und '+IntToStr(WeekOfTheYear(now)-1)+';';
          end else if form1.TB_QUANTITY.Position = 3 then
                  begin
                    woe:=', KW '+IntTostr(WeekOfTheYear(now)-3)+', '+IntTostr(WeekOfTheYear(now)-2)+', '+IntTostr(WeekOfTheYear(now)-1)+';';
                    mntl:=', Ausgaben '+MonthNamePast3+', '+MonthNamePast2+', '+MonthNamePast+';';
                    Zxwoe:=', Ausgaben der KW '+IntTostr(WeekOfTheYear(now)-3)+', '+IntTostr(WeekOfTheYear(now)-2)+', '+IntTostr(WeekOfTheYear(now)-1)+';';
                  end else if form1.TB_QUANTITY.Position = 4 then
                          begin
                            woe:=', KW '+IntTostr(WeekOfTheYear(now)-4)+', '+IntTostr(WeekOfTheYear(now)-3)+', '+IntTostr(WeekOfTheYear(now)-2)+', '+IntTostr(WeekOfTheYear(now)-1)+';';
                            mntl:=', Ausgaben '+MonthNamePast4+', '+MonthNamePast3+', '+MonthNamePast2+', '+MonthNamePast+';';
                            Zxwoe:=', Ausgaben der KW '+IntTostr(WeekOfTheYear(now)-4)+', '+IntTostr(WeekOfTheYear(now)-3)+', '+IntTostr(WeekOfTheYear(now)-2)+', '+IntTostr(WeekOfTheYear(now)-1)+';';
                          end;
    Zwoe:=', letzte '+IntTostr(Form1.TB_QUANTITY.Position)+' Ausgaben;';
    Dwoe:=', letzte '+IntTostr(Form1.TB_QUANTITY.Position)+' Ausgaben;';

    SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.Add(TimeToStr(Now)+': Die zu den möglichen Erscheinungsweisen gehörenden Parameter wurden erfolgreich ermittelt.');
    SENDINGSTATS.LB_PROGRESS_NOW.Caption:='Mögliche Erscheinungsweisen und deren Parameter erfolgreich ermittelt...';
    SENDINGSTATS.LB_PROGRESS_NOW.Refresh;
  except
    Fehler:='Es gab einen Fehler bei der KW-Ermittlung zur Erscheinungsweise. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.RelevanteVerlageErmitteln;
var Feldinhalt: string;
begin
  try
    SENDINGSTATS.PB_NOW.Position:=0;
    SENDINGSTATS.PB_NOW.Max:=520;
    SENDINGSTATS.LB_PROGRESS_NOW.Caption:='Ermittle relevante Verlage...';
    SENDINGSTATS.LB_PROGRESS_NOW.Refresh;

    Datenaustausch.AdoQuery.SQL.Clear;
    Datenaustausch.ADOQuery.SQL.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\SQL\relevantVLG.dat');
    Datenaustausch.ADOQuery.Open;
    Datenaustausch.ADOQuery.ExecSQL;
    SENDINGSTATS.MM_LogDatei.Lines.Clear;
    Datenaustausch.ADOQuery.First;

    //Einmal durchzählen...
    AnzahlVerlage:=Datenaustausch.ADOQuery.RecordCount;
    //und wieder auf ersten setzen
    Datenaustausch.ADOQuery.First;

    While not Datenaustausch.ADOQuery.Eof do
      begin
        Feldinhalt:=Datenaustausch.ADOQuery.FieldValues['Code Verlag'];
        SENDINGSTATS.MM_LogDatei.Lines.Add(Feldinhalt);
          SENDINGSTATS.LB_PROGRESS_NOW.Caption:='Ermittlung relevanter Verlage... aktuell: Verlag Nr. '+Feldinhalt+'...';
          SENDINGSTATS.LB_PROGRESS_NOW.Refresh;
          SENDINGSTATS.PB_NOW.StepBy(1);
        Datenaustausch.ADOQuery.Next;
      end;
    Datenaustausch.ADOQuery.Close;
    SENDINGSTATS.LB_PROGRESS_NOW.Caption:='Ermittlung relevanter Verlage erfolgreich abgeschlossen...';
    SENDINGSTATS.LB_PROGRESS_NOW.Refresh;
    SENDINGSTATS.PB_NOW.Position:=0;
    SENDINGSTATS.LB_PROGRESS_NOW.Caption:='';
    SENDINGSTATS.MM_LogDatei.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Temporary\relevanteVLGs.dat');
  except
    Fehler:='Es ist ein Fehler bei der Ermittlung der relevanten Verlage aufgetreten. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.FailedRequest_Close;
begin
  try
    MessageDlg(Fehler,mtwarning,[mbOK],0);
    SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.Add(timetostr(now)+': '+Fehler);
    SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Documentations\doc_'+DateToStr(Date)+'.dat');
    SENDINGSTATS.Close;
    Form1.Close;
  except
    MessageDlg('Ein schwerwiegender Ausnahmefehler ist aufgetreten. Das Programm kann nicht Ordnungsgemäß beendet werden. Das Programm wird geschlossen.',mtwarning,[mbOK],0);
    SENDINGSTATS.Close;
    Form1.Close;
  end;
end;

procedure TSENDINGSTATS.aktuellen_VLG_ermitteln;
begin
  try
    Info:='Ermittle aktuellen Verlag...';
    Fortschritt;

    SENDINGSTATS.MM_LogDatei.Lines.Clear;
    If FileExists(GetSpecialFolder($26)+'\Power Tools\Temporary\relevanteVLGs.dat'then
      begin
        SENDINGSTATS.MM_LogDatei.Lines.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\Temporary\relevanteVLGs.dat');
        aktueller_VLG:=SENDINGSTATS.MM_LogDatei.Lines[0];
      end;

    Info:='Ermittlung des aktuellen Verlages erfolgreich abgeschlossen. Aktueller Verlag ist Verlag '+aktueller_VLG+'...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Ermittlung des aktuellen Verlages. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.BTP_oder_Prodigit;
begin
  try
    Info:='Ermittle, ob es sich um einen Partnerverlag handelt...';
    Fortschritt;

    Datenaustausch.ADOQueryVLG.First;
      if Datenaustausch.ADOQueryVLG.FieldValues['Mitglied BTP?'] = 'True' then
        begin
          btp:=true;
          Form1.MM_OVER.Lines.Clear;
          Form1.MM_OVER.Text:=Form1.MM_DEVICE_BTP.Text;
        end
      else
        begin
          btp:=false;
          Form1.MM_OVER.Lines.Clear;
          Form1.MM_OVER.Text:=Form1.MM_DEVICE_PRODIGIT.Text;
        end;
    Info:='Ermittlung, ob es sich um einen Partnerverlag handelt erfolgreich abgeschlossen..';
    Fortschritt;

  except
    Fehler:='Es gab einen Fehler während der Ermittlung des BTP-Verhältnisses. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSendingstats.Server_zuweisen;
var ServerIDFromRow: integer;
    Area: string;
begin
  try
    Info:='Weise SMTP und POP3 Daten zu...';
    Fortschritt;

    Datenaustausch.AdoQueryVLG.SQL.Clear;
    Datenaustausch.ADOQueryVLG.SQL.Text:='SELECT * FROM [T1001 - Verlag] WHERE (([T1001 - Verlag].[Code Verlag]='+aktueller_VLG+'));';
    Datenaustausch.ADOQueryVLG.Open;
    Datenaustausch.ADOQueryVLG.ExecSQL;
    Datenaustausch.ADOQueryVLG.First;
    Area:=Datenaustausch.ADOQueryVLG.FieldValues['Code BuLand'];
    If Area = 'NW' then begin If btp = true Then ServerIDFromRow:=0 else ServerIDFromRow:=1end;
    If Area = 'NI' then begin If btp = true Then ServerIDFromRow:=2 else ServerIDFromRow:=3end;
    If Area = 'RP' then begin If btp = true Then ServerIDFromRow:=4 else ServerIDFromRow:=5end;
    If Area = 'HE' then begin If btp = true Then ServerIDFromRow:=6 else ServerIDFromRow:=7end;
    If Area = 'MV' then begin If btp = true Then ServerIDFromRow:=8 else ServerIDFromRow:=9end;
    If Area = 'SH' then begin If btp = true Then ServerIDFromRow:=10 else ServerIDFromRow:=11end;
    If Area = 'HB' then begin If btp = true Then ServerIDFromRow:=12 else ServerIDFromRow:=13end;
    If Area = 'HH' then begin If btp = true Then ServerIDFromRow:=14 else ServerIDFromRow:=15end;
    If Area = 'BE' then begin If btp = true Then ServerIDFromRow:=16 else ServerIDFromRow:=17end;
    If Area = 'BB' then begin If btp = true Then ServerIDFromRow:=18 else ServerIDFromRow:=19end;
    If Area = 'SN' then begin If btp = true Then ServerIDFromRow:=20 else ServerIDFromRow:=21end;
    If Area = 'ST' then begin If btp = true Then ServerIDFromRow:=22 else ServerIDFromRow:=23end;
    If Area = 'TH' then begin If btp = true Then ServerIDFromRow:=24 else ServerIDFromRow:=25end;
    If Area = 'BY' then begin If btp = true Then ServerIDFromRow:=26 else ServerIDFromRow:=27end;
    If Area = 'SL' then begin If btp = true Then ServerIDFromRow:=28 else ServerIDFromRow:=29end;
    If Area = 'BW' then begin If btp = true Then ServerIDFromRow:=30 else ServerIDFromRow:=31end;

    Info:='SMTP und POP3-Server zugewiesen...';
    Fortschritt;

    Info:='Ersetze eMail, Tel. und Name im Serienbrief...';
    Fortschritt;

    Name:=Form1.SG_INPUTSETTINGS.Cells[0,ServerIDFromRow];
    Tel:=Form1.SG_INPUTSETTINGS.Cells[1,ServerIDFromRow];
    eMail:=Form1.SG_INPUTSETTINGS.Cells[2,ServerIDFromRow];

    Form1.IdSMTP.Password:=Form1.SG_INPUTSETTINGS.Cells[7,ServerIDFromRow];
    Form1.IdSMTP.Port:=StrToInt(Form1.SG_INPUTSETTINGS.Cells[4,ServerIDFromRow]);
    Form1.IdSMTP.Host:=Form1.SG_INPUTSETTINGS.Cells[3,ServerIDFromRow];
    Form1.IdSMTP.UserId:=Form1.SG_INPUTSETTINGS.Cells[2,ServerIDFromRow];
    Form1.IdSMTP.MailAgent:=Form1.SG_INPUTSETTINGS.Cells[3,ServerIDFromRow];

    Form1.IdPOP3.Password:=Form1.SG_INPUTSETTINGS.Cells[7,ServerIDFromRow];
    Form1.IdPOP3.Port:=StrToInt(Form1.SG_INPUTSETTINGS.Cells[6,ServerIDFromRow]);
    Form1.IdPOP3.Host:=Form1.SG_INPUTSETTINGS.Cells[5,ServerIDFromRow];
    Form1.IDPOP3.UserId:=Form1.SG_INPUTSETTINGS.Cells[2,ServerIDFromRow];
    Datenaustausch.ADOQueryVLG.Close;

    Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{NAME DES ABSENDERS}',Name,[RfReplaceAll]);
    Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{DURCHWAHL DES ABSENDERS}',Tel,[RfReplaceAll]);
    Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{EMAIL DES ABSENDERS}',eMail,[RfReplaceAll]);

    Info:='Alle Daten wurden erfolgreich zugewiesen...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Zuweisung der SMTP/POP3 Daten. Das Programm wird geschlossen';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Ansprechpartner;
begin
  try
    Info:='Ermittle Ansprechpartner...';
    Fortschritt;

    Datenaustausch.ADOQueryVLG.First;
      if Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - ID Anrede zum ASP'] = '0' then
        begin
          Anrede:='Sehr geehrte Damen und Herren,';
        end
      else
      if Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - ID Anrede zum ASP'] = '1' then
        begin
          Anrede:='Sehr geehrter Herr '+Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - Ansprechpartner']+',';
        end
      else
      if Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - ID Anrede zum ASP'] = '2' then
        begin
          Anrede:='Sehr geehrte Frau '+Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - Ansprechpartner']+',';
        end;

      Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{ANREDE}',Anrede,[RfreplaceAll]);

    Info:='Ansprechpartner erfolgreich ermittelt und ersetzt...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Ermittlung der Anrede. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Anhang_Ja_Nein;
begin
  try
    Info:='Ermittle Notwendigkeit des Anhangs...';
    Fortschritt;

    Datenaustausch.ADOQueryVLG.First;
    Datenaustausch.ADOQueryVLG.RecordCount;
    if Datenaustausch.ADOQueryVLG.RecordCount > 3 then
      begin
        Anhang:=true;
        Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{ART DES ERHALTS}','Im Anhang erhalten Sie',[RfreplaceAll]);

        Info:='Ermittlung abgeschlossen, Anhang ist Notwendig';
        Fortschritt;
      end
    else
      begin
        Anhang:=false;
        Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{ART DES ERHALTS}','Im folgenden erhalten Sie',[RfreplaceAll]);

        Info:='Ermittlung abgeschlossen, ein Anhang ist nicht Notwendig';
        Fortschritt;
      end;

  except
    Fehler:='Es gab einen Fehler in der Ermittlung, ob die Auflistung im Anhang versendet werden soll. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.ausgabenliste_erstellen;
begin
  try
    Info:='Ermittlung Ausgaben und Erscheinungsweisen...';
    Fortschritt;

    Datenaustausch.ADOQueryVLG.First;
    SENDINGSTATS.MM_LogDatei.Lines.Clear;
    While not Datenaustausch.ADOQueryVLG.Eof do
      begin
        if Datenaustausch.ADOQueryVLG.FieldValues['ew'] = 'wö.' then begin SENDINGSTATS.MM_LogDatei.Lines.Add(Datenaustausch.ADOQueryVLG.FieldValues['Titel Ausgabe']+woe); end;
        if Datenaustausch.ADOQueryVLG.FieldValues['ew'] = '2 x wö.' then begin SENDINGSTATS.MM_LogDatei.Lines.Add(Datenaustausch.ADOQueryVLG.FieldValues['Titel Ausgabe']+Zxwoe); end;
        if Datenaustausch.ADOQueryVLG.FieldValues['ew'] = '14-tägig' then begin SENDINGSTATS.MM_LogDatei.Lines.Add(Datenaustausch.ADOQueryVLG.FieldValues['Titel Ausgabe']+Zwoe); end;
        if Datenaustausch.ADOQueryVLG.FieldValues['ew'] = 'alle 3 W.' then begin SENDINGSTATS.MM_LogDatei.Lines.Add(Datenaustausch.ADOQueryVLG.FieldValues['Titel Ausgabe']+Dwoe); end;
        if Datenaustausch.ADOQueryVLG.FieldValues['ew'] = 'mntl.' then begin SENDINGSTATS.MM_LogDatei.Lines.Add(Datenaustausch.ADOQueryVLG.FieldValues['Titel Ausgabe']+mntl); end;
        Datenaustausch.ADOQueryVLG.Next;
      end;

    Info:='Ermittlung der Ausgaben und Erscheinungsweisen erfolgreich abgeschlossen...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Aufstellung der Ausgabenliste. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Ausgabenliste_Einfuegen;
begin
  try
    Info:='Füge dem Brief die Ausgabenliste hinzu...';
    Fortschritt;

    if Anhang = false then
      begin
        Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{BELEGUNGSEINHEITEN}',SENDINGSTATS.MM_LogDatei.Text,[RfReplaceAll]);
      end
    else
      begin
        Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{BELEGUNGSEINHEITEN}','',[RfReplaceAll]);
        SENDINGSTATS.MM_LogDatei.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Temporary\Anh_'+aktueller_VLG+'.txt');
        SENDINGSTATS.MM_LogDatei.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Documentations\'+DateToStr(Now)+'\Anhänge\'+aktueller_VLG+'.txt');
      end;

    Info:='Ausgabenliste wurde dem Brief erfolgreich hinzugefügt...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler beim Einfügen der Ausgabenliste. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Mediadaten;
begin
  try
    Info:='Ermittle Mediadatennummer und Gültigkeit...';
    Fortschritt;

    Datenaustausch.ADOQueryVLG.First;
    MediadatenNr:=Datenaustausch.ADOQueryVLG.FieldValues['Tarif-Nr'];
    ValidSince:=Datenaustausch.ADOQueryVLG.FieldValues['gültig ab'];

    Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{MEDIADATEN GELTEN SEIT}',ValidSince,[RfReplaceAll]);
    Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'{MEDIADATEN NR}',MediadatenNr,[RfReplaceAll]);

    Info:='Ermittlung von Mediadaten und Gültigkeit erfolgreich abgeschlossen...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Ermittlung der Mediadaten. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end
end;

procedure TSENDINGSTATS.Verlagsliste_aktualisieren;
begin
  try
    Info:='Aktualisiere Liste relevanter Verlage...';
    Fortschritt;

    SENDINGSTATS.MM_LogDatei.Clear;
    SENDINGSTATS.MM_LogDatei.Lines.Delete(0);
    SENDINGSTATS.MM_LogDatei.Lines.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\Temporary\relevanteVLGs.dat');

    Info:='Aktualisierung der Verlagsliste erfolgreich abgeschlossen...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Überarbeitung der Liste aktueller Verlage. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Dokumentation;
begin
  try
    SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.Add(Doku)
  except
    Fehler:='Es gab einen Fehler bei der Dokumentation. Das Programm wird geschlossen';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Fortschritt;
begin
  try
    SENDINGSTATS.LB_PROGRESS_NOW.Caption:=Info;
    SENDINGSTATS.LB_PROGRESS_NOW.Refresh;
    SENDINGSTATS.RichEdit_TEMP.Lines.Add(Info);
    SENDINGSTATS.PB_NOW.StepBy(1);
  except
    Fehler:='Es gab einen Fehler bei der Anzeige des Fortschritts. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.GesamtFortschritt;
begin
  try
    SENDINGSTATS.LB_PROGRESS_GESAMT.Caption:=GesInfo;
    SENDINGSTATS.LB_PROGRESS_GESAMT.Refresh;
    SENDINGSTATS.PB_GESAMT.StepBy(1);
    SENDINGSTATS.RichEdit_SENDINGSTATS.Lines.Add(GesInfo)
  except
    Fehler:='Es gab einen Fehler bei der Anzeige des Gesamtfortschritts. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.BriefSpeichern;
begin
  try
    Info:='Speichere den Brief...';
    Fortschritt;
    if Anhang= true then
      begin
        Form1.MM_OVER.Text:=StringReplace(Form1.MM_OVER.Text,'</h1>','<br><br><font color="red">Anhang: '+GetSpecialFolder($26)+'\Power Tools\Documentations\'+DateToStr(now)+'\Anhänge\'+aktueller_VLG+'.txt'+'</font></h1>',[rfReplaceAll]);
        Form1.MM_OVER.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\documentations\'+DateToStr(Now)+'\'+aktueller_VLG+'.html');
      end
    else
      begin
        Form1.MM_OVER.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\documentations\'+DateToStr(Now)+'\'+aktueller_VLG+'.html');
      end;
    Info:='Der Brief wurde erfolgreich abgespeichert unter '+GetSpecialFolder($26)+'\Power Tools\documentations\'+DateToStr(Now)+'\'+aktueller_VLG+'.html...';
    Fortschritt;
  except
    Fehler:='Es gab einenFehler beim Abspeichern des Briefes. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.PlainToHTML;
begin
  try
    Info:='Konvertiere Plain-Text ins HTML-Format...';
    Fortschritt;
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'ä','ä',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'ö','ö',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'ü','ü',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'Ä','Ä',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'Ö','Ö',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'Ü','Ü',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,'ß','ß',[rfreplaceall]);
    Form1.MM_Over.Text:=StringReplace(Form1.MM_Over.Text,#13,'<br>'+#13,[rfreplaceall]);
    Info:='Konvertierung von Plain-Text ins HTML erfolgreich abgeschlossen...';
    Fortschritt;
  except
    Fehler:='Ein Fehler ist bei der Konvertierung ins HTML-Format aufgetreten. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Anhang_hinzufuegen;
begin
  try
    If Anhang = true then
      begin
        Info:='Füge dem Schreiben einen Anhang hinzu...';
        Fortschritt;
        //Form1.IdMessage1.Create(Form1.IdMessage1,GetSpecialFolder($26)+'\Power Tools\Temporary\Anh_'+aktueller_VLG+'.txt');
        Info:='Erfolgreich abgeschlossen...';
        Fortschritt;
      end;
  except
    Fehler:='Ein Fehler ist beim Hinzufügen des Anhangs aufgetreten. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;


procedure TSENDINGSTATS.eMail_rausfinden;
begin
  try
    Info:='Ermittle eMail-Adresse des Empfängers...';
    Fortschritt;

    Datenaustausch.ADOQueryVLG.First;
      While Not Datenaustausch.ADOQueryVLG.Eof do
        begin
        eMailEmpfaenger:=Datenaustausch.ADOQueryVLG.FieldValues['PL-IX - eMail'];
        end;
    If eMailEmpfaenger = '' then
      begin
        SendViaMail:=False;
      end
    else
      SendViaMail:=true;

    Info:='Ermittlung der eMail-Adresse des Empfängers erfolgreich abgeschlossen...';
    Fortschritt;
  except
    Fehler:='Es gab einen Fehler bei der Ermittlung der eMail-Adresse des Empfängers. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end
end;

procedure TSENDINGSTATS.abschicken;
begin
  try
        try
              Info:='Versendung der eMail an '+eMailEmpfaenger+'...';
              Fortschritt;
              //IdSMTP := TIdSMTP.Create(nil);
              Form1.IdMessage1.Create(nil);
              //idpop3 := tidpop3.create(nil);

              Form1.IdPOP3.Connect;
              //    idpop3.Disconnect;

              Form1.IdSMTP.Connect;

              Form1.IdMessage1.From.Address:=eMail;
              Form1.IdMessage1.Recipients.EMailAddresses:='h.ehrens@prodigit-online.de';
{'<!-- Form1.IdMessage1.Recipients.EMailAddresses:=eMailEmpfaenger; --!>'}
              Form1.IdMessage1.Subject:=StringReplace(StringReplace(Form1.MM_OVER.Lines[12],'<!-- ','',[rfreplaceall]),' -->','',[rfreplaceall]);;
              Form1.IdMessage1.Body.Text:=Form1.MM_OVER.Text;

              Form1.IdSMTP.Send(IdMsg);
        finally
              //FreeAndNil(IdSMTP);
              FreeAndNil(Form1.IdMessage1);

              Form1.IdSMTP.Disconnect;
              Form1.IdPOP3.Disconnect;

              Info:='Versendung der eMail an '+eMailEmpfaenger+' erfolgreich abgeschlossen...';
              Fortschritt;
        end;

  except
    Fehler:='Ein Fehler ist bei der Versendung der eMail an '+eMailEmpfaenger+' aufgetreten. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.NoMailToPrint;
begin
  try
    SENDINGSTATS.PB_NOW.Max:=SENDINGSTATS.PB_NOW.Max+2;
    Info:='Bereite Druckvorlage vor...';
    Fortschritt;

    if FileExists(GetSpecialFolder($26)+'\Power Tools\Temporary\Print\printindex.dat'then
      begin
        SENDINGSTATS.MM_PrintOuts.Lines.Clear;
        SENDINGSTATS.MM_PrintOuts.Lines.LoadFromFile(GetSpecialFolder($26)+'\Power Tools\Temporary\Print\printindex.dat');
        SENDINGSTATS.MM_PrintOuts.Lines.Add(aktueller_VLG);
        SENDINGSTATS.MM_PrintOuts.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Temporary\Print\printindex.dat');
      end
    else
      begin
        SENDINGSTATS.MM_PrintOuts.Lines.Clear;
        SENDINGSTATS.MM_PrintOuts.Lines.Add(aktueller_VLG);
        SENDINGSTATS.MM_PrintOuts.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Temporary\Print\printindex.dat');
      end;

    Form1.MM_OVER.Lines.SaveToFile(GetSpecialFolder($26)+'\Power Tools\Temporary\Print\'+aktueller_VLG+'.dat');

    Info:='Die Druckvorlage wurde erfolgreich initialisiert...';
    Fortschritt;
  except
    Fehler:='Ein Fehler trat bei der Bereitstellung der Druckvorlage für Verlag '+aktueller_VLG+' auf. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.Timer_LoadTimer(Sender: TObject);
var q: integer;
begin
  if q < 10 then
    begin
      q:=q+1;
    end
  else
    begin
      SENDINGSTATS.Timer_Load.Enabled:=false;
      SENDINGSTATS.initilaize;
    end;
end;

procedure TSENDINGSTATS.connectT10;
begin
  try
    Datenaustausch.AdoQueryVLG.SQL.Clear;
    Datenaustausch.ADOQueryVLG.SQL.Text:='SELECT * FROM [T10 - Belegungseinheiten] WHERE (([T10 - Belegungseinheiten].[Code Verlag]='+aktueller_VLG+'));';
    Datenaustausch.ADOQueryVLG.Open;
    Datenaustausch.ADOQueryVLG.ExecSQL;
  except
    Fehler:='Es gab einen Fehler beim Auslesen der Daten der T10 - Belegungseinheitentabelle. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.disconnectT10;
begin
  try
    Datenaustausch.AdoQueryVLG.Close;
  except
    Fehler:='Es gab einen Fehler beim Beenden der Verbindung zur T10 - Belegungseinheitentabelle. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.connectT1001;
begin
  try
    Datenaustausch.AdoQueryVLG.SQL.Clear;
    Datenaustausch.ADOQueryVLG.SQL.Text:='SELECT * FROM [T1001 - Verlag] WHERE (([T1001 - Verlag].[Code Verlag]='+aktueller_VLG+'));';
    Datenaustausch.ADOQueryVLG.Open;
    Datenaustausch.ADOQueryVLG.ExecSQL;
  except
    Fehler:='Es gab einen Fehler beim Auslesen der Daten der T1001 - Verlagstabelle. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

procedure TSENDINGSTATS.disconnectT1001;
begin
  try
    Datenaustausch.AdoQueryVLG.Close;
  except
    Fehler:='Es gab einen Fehler beim Beenden der Verbindung zur T1001 - Verlagstabelle. Das Programm wird geschlossen.';
    SENDINGSTATS.FailedRequest_Close;
  end;
end;

end.


Also, das ist der ganze (an dieser Stelle) Relevante Quelltext. Ich geh nicht davon aus, dass ihr das jetzt Stringweise analysiert habt, ist aber auch gar nicht nötig zur Klärung.

An welcher Stelle muss ich ansetzen, um meinem Speicher was gutes zu gönnen?
Kann ich variablen, die in ihrer schleife vorerst ihren Dienst geleistet haben, freigeben, ohne das sie, wenn sie in der Schleife wieder dran sind weg sind?
Wenn ja: Bringt das was bezüglich meines Problems?

Anderer Ansatz:
Würde es helfen, wenn ich nicht nach jeder Aktion was ins RichEdit schreiben und selbiges refreshen lasse? Wär schade, denn die Dokumentation wär mir schon wichtig. Need Help!

Weitere Ansätze:
Mit Start des Programms laden sich so einige (In zahlen: etwa 10) Forms. Zwei, eigentlich drei davon werden direkt benötigt, andere gar nicht: Aber sie sind halt da (invisible). Kann es helfen, wenn ich da nicht benötigte Forms (hart)schließe- also ganz weg. Wenn ja, kann ich (invisible)Forms schließen?

Ihr seht: Viele Dinge, eines wirrer als das andere und ich hoffe in meiner hoffnungslos-verzweifelt-naiv-geprägten art, das ihr mir helfen könnt.

Vielen Dank!

_________________
Verstand ist eines der am besten verteilten Güter. Jeder denkt, er hätte genug davon.
Kein Problem widersteht lange dem Angriff beharrlichen Denkens.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 28.07.07 20:02 
Dein Quälkot könnte an zahlreichen Stellen eine starke Optimierung vertragen. So z.B. bei der Server-Auswahl, bei den vergangenen Monaten, ... Das sieht mir sehr danach aus, dass Du vieles an Source immer wieder dupliziert hast. Entferne da erstmal die ganze Redundanz.

Ferner solltest Du mal schauen, an welchen Stellen der Speicher immer wieder reserviert wird. Ein häufiger Fehler ist es, bei Datenbanken Edit oder Insert aufzurufen, ohne mit Post abzuschließen. Ansonsten nutzte einfach mal FastMM4, der finde die wahrscheinlichen Fehlerquellen im Normalfall recht schnell.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
LowSkills Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 111

Windows XP
Delphi 6 Professional
BeitragVerfasst: So 29.07.07 11:44 
ja ja, ist ja schon gut :mrgreen: Hab ja schon verstanden. Du magst mich also nicht :(

Spaß bei seite, bei den Monaten ist natürlich einiges machbar, ebenso an den Serverdingern. Wahrscheinlich hätte ich es auch schon lange geändert, wenn ich wüsste, wie.

Fakt ist, dass ich mittlerweile nur noch an zwei stellen die Datenbank öffne/schliesse, und nicht mehr wie vorher am beginn jeder Procedure, wie ihr ja da sehen könnt.

Werde heute mal versuchen müssen, ob es hilft, wenn ich die Doku reduziere, alternativ mal FastMM4...

Wenn jetzt noch einer so freundlich wäre: Was ist fastmm4??? o.0

Vielen Dank schonmal.

_________________
Verstand ist eines der am besten verteilten Güter. Jeder denkt, er hätte genug davon.
Kein Problem widersteht lange dem Angriff beharrlichen Denkens.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 29.07.07 12:48 

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
LowSkills Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 111

Windows XP
Delphi 6 Professional
BeitragVerfasst: Mo 30.07.07 21:16 
Ja ja, ich bins wieder. :autsch:

Auch auf die Gefahr hin, dass ich jetzt wieder einmal einen auf den Deckel bekomme:

Google ist nicht mein Freund! Wir haben uns zerstritten und seit einiger Zeit mit dem Allerwertesten nicht mehr angeschaut.

Spaß bei Seite: Ich bin brav deinem Link gefolgt, BenBE, habe mir dann auch die 4. Revision der Fastmm4 dinger runtergeladen. Leider gehöre ich zu den Menschen, die sich schwer damit tun, etwas zu installieren, das nicht mit einer install.exe daherkommt. Fürderhin gestaltet es sich als schwierig, etwas zu installieren, dass ohne install.exe daherkommt und dessen ReadMe nicht viel Aufschluß bringt bezüglich Fragen wie How-to-install oder so.

Natürlich habe ich mich umgehend bei google informieren wollen, wie man das denn installiert, zu meinem allergrößten Bedauern musste ich allerdings resignierend feststellen, dass Google kein besonders guter Freund von mir ist.

Könnt mir da nochmal jemand helfen?

Bidde...?!

_________________
Verstand ist eines der am besten verteilten Güter. Jeder denkt, er hätte genug davon.
Kein Problem widersteht lange dem Angriff beharrlichen Denkens.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 30.07.07 21:53 
Naja ... ne Install brauch das auch nicht wirklich. Es sollte reichen alle Dateien, die irgendwie nach Source, oder so ähnlich aussehen, mit in dein Projekt-Verzeichnis zu entpacken, dann in deiner DPR-Datei (Projekt --> Quelltext anzeigen) als erste Unit FastMM4, (vor allen anderen) zu ergänzen und dein Projekt neu zu erstellen.

Ggf. musst Du mal kurz die Unit FastMM4.pas öffnen und ein wenig im Kopf lesen und ein paar Compiler-Schalter deinen bedürfnissen anpassen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 30.07.07 22:21 
du brauchst die folgenden dateien in deinem projektverzeichnis.

FastMM4.pas
FastMM4Options.inc
FastMM4Messages.pas

die FastMM4Messages.pas gibt es ettliche male. und zwar für so ziemlich jede bekanntere landesprache eine.
du holst dir am besten die aus ".\Translations\German\". mit dem meldungen kann mann dann wenigstens was anfangen.

startest du dann den programm über delphi, arbeitest damit und beendest es wieder so findet sich nach dem ende eine textdatei im verzeichnis deiner exe. wenn du glück hast siehst du die ergebnisse aber schon direkt nach dem programm ende in einem fenster (ich hatte noch nicht das glück)

zu deinem quelltext.
jeder fängt mal "klein" an. ich habe früher auch mal solche quelltexte geschrieben. jetzt würden mich solche redundanzen nicht mehr schlafen lassen. :wink:
ansonsten kann ich nichts finden. ist bei dem quelltextumfang auch nicht so einfach. zumal man das ganze ja nicht ausführen kann um mal das laufzeitverhalten beobachten zu können.
was ich mal ganz genau unter die lupe nehmen würde ist die procedure VLG_Kombis.

ansonsten kann ich nur sagen. einfach mal im FMM den FullDebugMode anschalten und schauen was kommt.
allerdings musst du dazu noch die FastMM_FullDebugMode.dll in dein porgrammverzeichnis kopieren.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
LowSkills Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 111

Windows XP
Delphi 6 Professional
BeitragVerfasst: Di 31.07.07 10:26 
Dankeschön. Werd das heute ode morgen mal in Angriff nehmen und hoffen, dass sich was tut.

Im übrigen hast du recht, wenn du sagst, du würdest die procedure VLG_Kombis nochmal unter die Lupe nehmen. Werd ich auch, die funzt nähmlich noch nicht so ganz, wie ich das will. Aber das krieg ich hin. Mit dem Laufzeitverhalten allerdings kann das ja nichts zu tun haben, die ist nähmlich noch gar nicht "on", also scharf geschaltet, fals man das so sagen kann. Werd heut mal schauen, ob ich nen größeren Arbeitsspeicher besorgen kann. Mit 512 MB-Ram ist man ja heute so oder so das ende der Nahrungskette. Vielleicht hilft das ja schon. Muss ich allerdings auch schon wieder in Frage stellen.

Denn: Wenn ich, wie ich feststellen muss, bereits beim ersten Verlag Out Of Memory gerate, könnte es auch bei größerem Speicher problematisch werden, bedenkt man, das die Schleife insgesamt fast 520 Verlage durchläuft.

Da ich allerdings nicht weis, ob die Speicheranforderung ihr Max erreicht, wenn sie das erste mal durchgelaufen ist, kann ich auch nicht sagen, ob der Speicher dannach in trockenen Tüchern wäre und somit Problemlos die andern 519 Verlage durchlaufen würde.
Ich weiss ja nicht, ob der dann bei Verlag noch mehr speicher Verlangt. dann wäre ja auch bei einem riesen Speicher spätestens nach zehn verlagen schluss, net oder?

Vielen Dank aber nochmal an Dich SinSpin, dass du dich so ausführlich mit dem Quellcode auseinandergesetzt hast. Werd später oder morgen mal den aktuellen Quellcode posten, wie er nach dem neuesten Feinschliff aussieht.

Danke schonmal wieder im Vorraus. Und scheut euch nicht, ruhig weiter fleißig lösungsansätze zu finden/posten. :mrgreen:

Was würde ich nur ohne euch machen?!

_________________
Verstand ist eines der am besten verteilten Güter. Jeder denkt, er hätte genug davon.
Kein Problem widersteht lange dem Angriff beharrlichen Denkens.