Announcement

Collapse
No announcement yet.

Turbo Pascal und VisualBasic im Multitasking-Datei-Zugriff

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Turbo Pascal und VisualBasic im Multitasking-Datei-Zugriff

    Hallo erstmal,

    Ich hätt' da mal ein Problem...

    Ein VisualBasic (Ja VisualBasic, leider!) liest zyklisch Daten aus einer Siemens S7-SPS über die MPI-Schnittstelle in eine Lesedatei (Treiber für Turbo Pascal gibt es wohl nicht). Aus einer Schreibdatei erhält dieses Programm Daten-Schreibaufträge an die S7.
    Diese Schreibaufträge kommen von einem Turbo Pascal Programm, welches auch Daten aus der Lesedatei entgegennimmt.
    VisualBasic- und Turbo Pascal Programm arbeiten unter Win95/98 im quasi Multitasking. Meines Wissens nach handelt es sich hier nicht um ein echtes zeitscheibenverwaltetes Multitasking, sondern um ein sogenanntes
    'preamtives'-Multitasking, welches einer wartenden Task nur dann Systemresourcen zur Verfügung stellt, wenn die momentan aktive Task dies erlaubt, sich also freiwillig schlafen legt.
    Und hier sind wir auch schon bei dem Problem, die Turbo Pascal Task scheint nicht sehr müde zu sein, sie gibt offenbar dem VisualBasic-Programm kaum Gelegenheit seinen Job zu erfüllen.
    Mit Ausgaben auf dem Bildschirm über 'write(...);' geht das offensichtlich, ich blende dann in der oberen linken Ecke des Bildschirms ein 'Drehkreuz' ein, damit ich irgendwas ausgeben kann und der Bediener was zum staunen hat. Das läuft allerdings nur sehr holprig und es taucht sehr oft, vorallem beim Zugriff auf die Lesedatei der Fehler 150 'Disk write protected' auf, weil offensichtlich das VisualBasic-Programm auch gerade auf diese Datei zugreift.
    Gibt es einen Befehl unter Pascal, oder eine Assembler Zusatzroutine zum einbinden, wodurch das Pascal-Programm für eine definierte Zeit veranlaßt wird mal Pause zu machen und andere (VisualBasic-Programm) arbeiten zu lassen?

    Wenn jemand eine Idee hat, vielen Dank im Voraus

    Gruß

    Hasko

  • #2
    Hallo,

    wenn von Turbo Pascal die Rede ist, handelt es sich dabei noch um ein altes 16-Bit-Programm (DOS)? Und ist das VB-Programm 16- oder 32-Bit

    Comment


    • #3
      <br>Hi,...
      <br>
      <br>ich weiß ja nicht wie Zeitkritisch das ganze ist wie wäre es denn hiermit:
      <br>
      <br>wenn mich ich mich nicht irre so wird das Datum einer Datei geändert (neu gesetzt) wenn ich diese schließe.
      <br>-also das Basic Programm wird gestartet
      <br>-offnet Datei schreibt was rein und schließt diese
      <br>-das Datum der Datei wird neu gesetzt
      <br>-Basic Programm märkt sich dieses Datum
      <br>-Basic Programm fragt das Datum der Datei ab (ohne diese zu öffnen)(in Pascal mit assign(f,'x.txt');...) und wenn das Datum ungleich dem gespeicherten ist kann die Datei wieder geöffnet werden
      <br>-das Pascal Programm wird geöffnet
      <br>-öffnet die Datei ließt was raus und schließt diese
      <br>-das Datum der Datei wird neu gesetzt
      <br>-Pascal Programm märkt sich dieses Datum
      <br>-Pascal Programm fragt das Datum der Datei ab (ohne diese zu öffnen)(in Pascal mit assign(f,'x.txt');...) und wenn das Datum ungleich dem gespeicherten ist kann die Datei wieder geöffnet werden
      usw.
      <br>
      <br>wie gesagt ist nicht schön und bei zeitkritischen Funktionen unbrauchbar.
      <br>
      <br>
      <br>MfG
      <br>P

      Comment


      • #4
        Hallo Andreas, Hallo Patrick,

        Vielen Dank für Eure Hilfe bei meinem Problem,

        Zuerst zu Deiner Frage Andreas:

        Das Pascal-Programm ist ein Borland Pascal Version 7.0, es arbeitet im ‚Real-Modus‘ und zwar mit 16-Bit (Bisher tatsächlich immer noch unter DOS).
        Das VisualBasic-Programm habe ich nicht erstellt. Ich gehe jedoch verstärkt davon aus, daß es sich um eine 32-Bit-Version handelt.

        Deinen Hinweis Patrick mit Datum und Uhrzeit einer Datei habe ich ausprobiert, dies funktioniert mit ‚getftime(...);‘ bzw.
        ‚unpacktime(...);‘ jedoch nur dann zuverlässig, wenn die Datei schon geöffnet ist. Andernfalls, versucht man dies, so wie Du es beschrieben hast direkt nach ‚assign(...);‘, bekommt man irgendein Datum/Uhrzeit.
        Es ist aber eine sehr gute Methode um festzustellen ob etwas an der Datei geändert wurde. Bisher haben wir dies umständlich über eine Zählvariable in der Datei ausgeführt, die von dem Programm, welches Änderungen vornahm, inkrementiert wurde.
        Ich habe dazu ein kleines Testprogramm geschrieben:

        program dat_test;

        {Dieses Programm schreibt eine Integer-Zahl in eine Datei bzw. liest
        diese wieder aus, wobei Datum/Uhrzeit der Datei sowie Inhalt der
        Integer-Zahl ausgegeben werden.}

        {$F+,O+} {Far-codiert, Overlay ein}
        {$D+} {Debug-Info ein}

        uses
        windos,
        CRT;

        {
        ----------------------------------------------------------------------
        Hauptprogramm

        ----------------------------------------------------------------------}

        var
        s_directory : string[80];

        procedure write_test;

        const
        c_zahl = 2001;
        var
        i_zahl : integer;
        f_write : file of integer;

        begin

        i_zahl := c_zahl;

        assign (f_write, s_directory + '\int_zahl.dat');
        {$I-}
        rewrite (f_write);
        {$I+}
        if IOResult = 0 then
        write (f_write, i_zahl);
        close (f_write);

        end; {end of write_test}

        procedure read_test;

        var
        i_zahl : integer;
        f_read : file of integer;
        li_date_time : longint; { For Get/SetFTime}
        rec_date_time: TDateTime; { For Pack/UnpackTime}

        function LeadingZero(w : Word) : String;
        var
        s : String;
        begin
        Str(w:0, s);
        if Length(s) = 1 then
        s := '0' + s;
        LeadingZero := s;
        end;

        begin

        i_zahl := 0;
        {
        getftime (f_read, li_date_time);
        unpacktime(li_date_time, rec_date_time);
        }
        assign (f_read, s_directory + '\int_zahl.dat');
        {
        getftime (f_read, li_date_time);
        unpacktime(li_date_time, rec_date_time);
        }
        {$I-}
        reset (f_read);
        {$I+}
        if IOResult = 0 then
        begin
        getftime (f_read, li_date_time);
        unpacktime(li_date_time, rec_date_time);
        {$I-}
        read (f_read, i_zahl);
        {$I+}
        if IOResult = 0 then
        begin
        with rec_date_time do
        begin
        writeln('Die aus der Datei ''int_zahl.dat'' gelesene Integer- Zahl ist: ', i_zahl);
        writeln('Das Datum und die Uhrzeit der Datei ist: ',
        LeadingZero(day),'|', LeadingZero(month),'|',
        year,' ',
        LeadingZero(hour),':', LeadingZero(min),':',
        LeadingZero(sec));
        end;
        end;
        close (f_read);
        end;
        end; {end of read_test}

        begin
        clrscr;
        getdir(0, s_directory);
        write_test;
        read_test;
        end.

        Vielen Dank für Eure Hilfe und einen guten Rutsch wünscht Euch

        Hask

        Comment


        • #5
          Hallo Andreas, Hallo Patrick,

          Vielen Dank für Eure Hilfe bei meinem Problem,

          Zuerst zu Deiner Frage Andreas:

          Das Pascal-Programm ist ein Borland Pascal Version 7.0, es arbeitet im ‚Real-Modus‘ und zwar mit 16-Bit (Bisher tatsächlich immer noch unter DOS).
          Das VisualBasic-Programm habe ich nicht erstellt. Ich gehe jedoch verstärkt davon aus, daß es sich um eine
          32-Bit-Version handelt.

          Deinen Hinweis Patrick mit Datum und Uhrzeit einer Datei habe ich ausprobiert, dies funktioniert mit ‚getftime(...);‘ bzw. ‚unpacktime(...);‘ jedoch nur dann zuverlässig, wenn die Datei schon geöffnet ist. Andernfalls, versucht man dies, so wie Du es beschrieben hast direkt nach ‚assign(...);‘, bekommt man irgendein Datum/Uhrzeit.
          Es ist aber eine sehr gute Methode um festzustellen ob etwas an der Datei geändert wurde. Bisher haben wir dies umständlich über eine Zählvariable in der Datei ausgeführt, die von dem Programm, welches Änderungen vornahm, inkrementiert wurde.
          Ich habe dazu ein kleines Testprogramm geschrieben:

          program dat_test;

          {Dieses Programm schreibt eine Integer-Zahl in eine Datei bzw. liest
          diese wieder aus, wobei Datum/Uhrzeit der Datei sowie Inhalt der
          Integer-Zahl ausgegeben werden.}

          {$F+,O+} {Far-codiert, Overlay ein}
          {$D+} {Debug-Info ein}

          uses
          windos,
          CRT;

          {ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
          ³ Hauptprogramm ³
          ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}

          var
          s_directory : string[80];

          procedure write_test;

          const
          c_zahl = 2001;
          var
          i_zahl : integer;
          f_write : file of integer;

          begin

          i_zahl := c_zahl;

          assign (f_write, s_directory + '\int_zahl.dat');
          {$I-}
          rewrite (f_write);
          {$I+}
          if IOResult = 0 then
          write (f_write, i_zahl);
          close (f_write);

          end; {end of write_test}

          procedure read_test;

          var
          i_zahl : integer;
          f_read : file of integer;
          li_date_time : longint; { For Get/SetFTime}
          rec_date_time: TDateTime; { For Pack/UnpackTime}

          function LeadingZero(w : Word) : String;
          var
          s : String;
          begin
          Str(w:0, s);
          if Length(s) = 1 then
          s := '0' + s;
          LeadingZero := s;
          end;

          begin

          i_zahl := 0;
          {
          getftime (f_read, li_date_time);
          unpacktime(li_date_time, rec_date_time);
          }
          assign (f_read, s_directory + '\int_zahl.dat');
          {
          getftime (f_read, li_date_time);
          unpacktime(li_date_time, rec_date_time);
          }
          {$I-}
          reset (f_read);
          {$I+}
          if IOResult = 0 then
          begin
          getftime (f_read, li_date_time);
          unpacktime(li_date_time, rec_date_time);
          {$I-}
          read (f_read, i_zahl);
          {$I+}
          if IOResult = 0 then
          begin
          with rec_date_time do
          begin
          writeln('Die aus der Datei ''int_zahl.dat'' gelesene Integer- Zahl ist: ', i_zahl);
          writeln('Das Datum und die Uhrzeit der Datei ist: ',
          LeadingZero(day),'|', LeadingZero(month),'|', year,' ',
          LeadingZero(hour),':', LeadingZero(min),':', LeadingZero(sec));
          end;
          end;
          close (f_read);
          end;
          end; {end of read_test}

          begin
          clrscr;
          getdir(0, s_directory);
          write_test;
          read_test;
          end.

          Vielen Dank für Eure Hilfe und einen guten Rutsch wünscht Euch

          Hask

          Comment


          • #6
            Hallo Andreas, Hallo Patrick,

            Vielen Dank für Eure Hilfe bei meinem Problem,

            Zuerst zu Deiner Frage Andreas:

            Das Pascal-Programm ist ein Borland Pascal Version 7.0, es arbeitet im ‚Real-Modus‘ und zwar mit 16-Bit (Bisher tatsächlich immer noch unter DOS).
            Das VisualBasic-Programm habe ich nicht erstellt. Ich gehe jedoch verstärkt davon aus, daß es sich um eine
            32-Bit-Version handelt.

            Deinen Hinweis Patrick mit Datum und Uhrzeit einer Datei habe ich ausprobiert, dies funktioniert mit ‚getftime(...);‘ bzw. ‚unpacktime(...);‘ jedoch nur dann zuverlässig, wenn die Datei schon geöffnet ist. Andernfalls, versucht man dies, so wie Du es beschrieben hast direkt nach ‚assign(...);‘, bekommt man irgendein Datum/Uhrzeit.
            Es ist aber eine sehr gute Methode um festzustellen ob etwas an der Datei geändert wurde. Bisher haben wir dies umständlich über eine Zählvariable in der Datei ausgeführt, die von dem Programm, welches Änderungen vornahm, inkrementiert wurde.
            Ich habe dazu ein kleines Testprogramm geschrieben:

            program dat_test;

            {Dieses Programm schreibt eine Integer-Zahl in eine Datei bzw. liest
            diese wieder aus, wobei Datum/Uhrzeit der Datei sowie Inhalt der
            Integer-Zahl ausgegeben werden.}

            {$F+,O+} {Far-codiert, Overlay ein}
            {$D+} {Debug-Info ein}

            uses
            windos,
            CRT;

            {ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

            Hauptprogramm

            ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}

            var
            s_directory : string[80];

            procedure write_test;

            const
            c_zahl = 2001;
            var
            i_zahl : integer;
            f_write : file of integer;

            begin

            i_zahl := c_zahl;

            assign (f_write, s_directory + '\int_zahl.dat');
            {$I-}
            rewrite (f_write);
            {$I+}
            if IOResult = 0 then
            write (f_write, i_zahl);
            close (f_write);

            end; {end of write_test}

            procedure read_test;

            var
            i_zahl : integer;
            f_read : file of integer;
            li_date_time : longint; { For Get/SetFTime}
            rec_date_time: TDateTime; { For Pack/UnpackTime}

            function LeadingZero(w : Word) : String;
            var
            s : String;
            begin
            Str(w:0, s);
            if Length(s) = 1 then
            s := '0' + s;
            LeadingZero := s;
            end;

            begin

            i_zahl := 0;
            {
            getftime (f_read, li_date_time);
            unpacktime(li_date_time, rec_date_time);
            }
            assign (f_read, s_directory + '\int_zahl.dat');
            {
            getftime (f_read, li_date_time);
            unpacktime(li_date_time, rec_date_time);
            }
            {$I-}
            reset (f_read);
            {$I+}
            if IOResult = 0 then
            begin
            getftime (f_read, li_date_time);
            unpacktime(li_date_time, rec_date_time);
            {$I-}
            read (f_read, i_zahl);
            {$I+}
            if IOResult = 0 then
            begin
            with rec_date_time do
            begin
            writeln('Die aus der Datei ''int_zahl.dat'' gelesene Integer-Zahl ist: ',
            i_zahl);
            writeln('Das Datum und die Uhrzeit der Datei ist: ',
            LeadingZero(day),'|', LeadingZero(month),'|', year,' ',
            LeadingZero(hour),':', LeadingZero(min),':',
            LeadingZero(sec));
            end;
            end;
            close (f_read);
            end;
            end; {end of read_test}

            begin
            clrscr;
            getdir(0, s_directory);
            write_test;
            read_test;
            end.

            Vielen Dank für Eure Hilfe und einen guten Rutsch wünscht Euch

            Hask

            Comment


            • #7
              Hallo Andreas, Hallo Patrick,

              Vielen Dank für Eure Hilfe bei meinem Problem,

              Zuerst zu Deiner Frage Andreas:

              Das Pascal-Programm ist ein Borland Pascal Version 7.0, es arbeitet im ‚Real-Modus‘ und zwar mit 16-Bit (Bisher tatsächlich immer noch unter DOS).
              Das VisualBasic-Programm habe ich nicht erstellt. Ich gehe jedoch verstärkt davon aus, daß es sich um eine
              32-Bit-Version handelt.

              Deinen Hinweis Patrick mit Datum und Uhrzeit einer Datei habe ich ausprobiert, dies funktioniert mit ‚getftime(...);‘ bzw. ‚unpacktime(...);‘ jedoch nur dann zuverlässig, wenn die Datei schon geöffnet ist. Andernfalls, versucht man dies, so wie Du es beschrieben hast direkt nach ‚assign(...);‘, bekommt man irgendein Datum/Uhrzeit.
              Es ist aber eine sehr gute Methode um festzustellen ob etwas an der Datei geändert wurde. Bisher haben wir dies umständlich über eine Zählvariable in der Datei ausgeführt, die von dem Programm, welches Änderungen vornahm, inkrementiert wurde.
              Ich habe dazu ein kleines Testprogramm geschrieben:

              program dat_test;

              {Dieses Programm schreibt eine Integer-Zahl in eine Datei bzw. liest
              diese wieder aus, wobei Datum/Uhrzeit der Datei sowie Inhalt der
              Integer-Zahl ausgegeben werden.}

              {$F+,O+} {Far-codiert, Overlay ein}
              {$D+} {Debug-Info ein}

              uses
              windos,
              CRT;

              {ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

              Hauptprogramm

              ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}

              var
              s_directory : string[80];

              procedure write_test;

              const
              c_zahl = 2001;
              var
              i_zahl : integer;
              f_write : file of integer;

              begin

              i_zahl := c_zahl;

              assign (f_write, s_directory + '\int_zahl.dat');
              {$I-}
              rewrite (f_write);
              {$I+}
              if IOResult = 0 then
              write (f_write, i_zahl);
              close (f_write);

              end; {end of write_test}

              procedure read_test;

              var
              i_zahl : integer;
              f_read : file of integer;
              li_date_time : longint; { For Get/SetFTime}
              rec_date_time: TDateTime; { For Pack/UnpackTime}

              function LeadingZero(w : Word) : String;
              var
              s : String;
              begin
              Str(w:0, s);
              if Length(s) = 1 then
              s := '0' + s;
              LeadingZero := s;
              end;

              begin

              i_zahl := 0;
              {
              getftime (f_read, li_date_time);
              unpacktime(li_date_time, rec_date_time);
              }
              assign (f_read, s_directory + '\int_zahl.dat');
              {
              getftime (f_read, li_date_time);
              unpacktime(li_date_time, rec_date_time);
              }
              {$I-}
              reset (f_read);
              {$I+}
              if IOResult = 0 then
              begin
              getftime (f_read, li_date_time);
              unpacktime(li_date_time, rec_date_time);
              {$I-}
              read (f_read, i_zahl);
              {$I+}
              if IOResult = 0 then
              begin
              with rec_date_time do
              begin
              writeln('Die aus der Datei ''int_zahl.dat'' gelesene Integer-Zahl ist: ',
              i_zahl);
              writeln('Das Datum und die Uhrzeit der Datei ist: ',
              LeadingZero(day),'|', LeadingZero(month),'|', year,' ',
              LeadingZero(hour),':', LeadingZero(min),':',
              LeadingZero(sec));
              end;
              end;
              close (f_read);
              end;
              end; {end of read_test}

              begin
              clrscr;
              getdir(0, s_directory);
              write_test;
              read_test;
              end.

              Vielen Dank für Eure Hilfe und einen guten Rutsch wünscht Euch

              Hask

              Comment


              • #8
                Hallo Andreas, Hallo Patrick,

                Vielen Dank für Eure Hilfe bei meinem Problem,

                Zuerst zu Deiner Frage Andreas:

                Das Pascal-Programm ist ein Borland Pascal Version 7.0, es arbeitet im ‚Real-Modus' und zwar mit 16-Bit (Bisher tatsächlich immer noch unter DOS).
                Das VisualBasic-Programm habe ich nicht erstellt. Ich gehe jedoch verstärkt davon aus, daß es sich um eine
                32-Bit-Version handelt.

                Deinen Hinweis Patrick mit Datum und Uhrzeit einer Datei habe ich ausprobiert, dies funktioniert mit ‚getftime(...);' bzw. ‚unpacktime(...);' jedoch nur dann zuverlässig, wenn die Datei schon geöffnet ist. Andernfalls, versucht man dies, so wie Du es beschrieben hast direkt nach ‚assign(...);', bekommt man irgendein Datum/Uhrzeit.
                Es ist aber eine sehr gute Methode um festzustellen ob etwas an der Datei geändert wurde. Bisher haben wir dies umständlich über eine Zählvariable in der Datei ausgeführt, die von dem Programm, welches Änderungen vornahm, inkrementiert wurde.
                Ich habe dazu ein kleines Testprogramm geschrieben:

                <pre>
                program dat_test;

                {Dieses Programm schreibt eine Integer-Zahl in eine Datei bzw. liest
                diese wieder aus, wobei Datum/Uhrzeit der Datei sowie Inhalt der
                Integer-Zahl ausgegeben werden.}

                {$F+,O+} {Far-codiert, Overlay ein}
                {$D+} {Debug-Info ein}

                uses
                windos,
                CRT;

                {ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

                Hauptprogramm

                ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}

                var
                s_directory : string[80];

                procedure write_test;

                const
                c_zahl = 2001;
                var
                i_zahl : integer;
                f_write : file of integer;

                begin

                i_zahl := c_zahl;

                assign (f_write, s_directory + '\int_zahl.dat');
                {$I-}
                rewrite (f_write);
                {$I+}
                if IOResult = 0 then
                write (f_write, i_zahl);
                close (f_write);

                end; {end of write_test}

                procedure read_test;

                var
                i_zahl : integer;
                f_read : file of integer;
                li_date_time : longint; { For Get/SetFTime}
                rec_date_time: TDateTime; { For Pack/UnpackTime}

                function LeadingZero(w : Word) : String;
                var
                s : String;
                begin
                Str(w:0, s);
                if Length(s) = 1 then
                s := '0' + s;
                LeadingZero := s;
                end;

                begin

                i_zahl := 0;
                {
                getftime (f_read, li_date_time);
                unpacktime(li_date_time, rec_date_time);
                }
                assign (f_read, s_directory + '\int_zahl.dat');
                {
                getftime (f_read, li_date_time);
                unpacktime(li_date_time, rec_date_time);
                }
                {$I-}
                reset (f_read);
                {$I+}
                if IOResult = 0 then
                begin
                getftime (f_read, li_date_time);
                unpacktime(li_date_time, rec_date_time);
                {$I-}
                read (f_read, i_zahl);
                {$I+}
                if IOResult = 0 then
                begin
                with rec_date_time do
                begin
                writeln('Die aus der Datei ''int_zahl.dat'' gelesene Integer-Zahl ist: ',
                i_zahl);
                writeln('Das Datum und die Uhrzeit der Datei ist: ',
                LeadingZero(day),'|', LeadingZero(month),'|', year,' ',
                LeadingZero(hour),':', LeadingZero(min),':',
                LeadingZero(sec));
                end;
                end;
                close (f_read);
                end;
                end; {end of read_test}

                begin
                clrscr;
                getdir(0, s_directory);
                write_test;
                read_test;
                end.
                </pre>

                Vielen Dank für Eure Hilfe und einen guten Rutsch wünscht Euch

                Hask

                Comment


                • #9
                  Hallo Andreas, Hallo Patrick,

                  Vielen Dank für Eure Hilfe bei meinem Problem,

                  Zuerst zu Deiner Frage Andreas:

                  Das Pascal-Programm ist ein Borland Pascal Version 7.0, es arbeitet im ‚Real-Modus' und zwar mit 16-Bit (Bisher tatsächlich immer noch unter DOS).
                  Das VisualBasic-Programm habe ich nicht erstellt. Ich gehe jedoch verstärkt davon aus, daß es sich um eine
                  32-Bit-Version handelt.

                  Deinen Hinweis Patrick mit Datum und Uhrzeit einer Datei habe ich ausprobiert, dies funktioniert mit ‚getftime(...);' bzw. ‚unpacktime(...);' jedoch nur dann zuverlässig, wenn die Datei schon geöffnet ist. Andernfalls, versucht man dies, so wie Du es beschrieben hast direkt nach ‚assign(...);', bekommt man irgendein Datum/Uhrzeit.
                  Es ist aber eine sehr gute Methode um festzustellen ob etwas an der Datei geändert wurde. Bisher haben wir dies umständlich über eine Zählvariable in der Datei ausgeführt, die von dem Programm, welches Änderungen vornahm, inkrementiert wurde.
                  Ich habe dazu ein kleines Testprogramm geschrieben:

                  <pre>

                  program dat_test;

                  {Dieses Programm schreibt eine Integer-Zahl in eine Datei bzw. liest
                  diese wieder aus, wobei Datum/Uhrzeit der Datei sowie Inhalt der
                  Integer-Zahl ausgegeben werden.}

                  {$F+,O+} {Far-codiert, Overlay ein}
                  {$D+} {Debug-Info ein}

                  uses
                  windos,
                  CRT;

                  {ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

                  Hauptprogramm

                  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}

                  var
                  s_directory : string[80];

                  procedure write_test;

                  const
                  c_zahl = 2001;
                  var
                  i_zahl : integer;
                  f_write : file of integer;

                  begin

                  i_zahl := c_zahl;

                  assign (f_write, s_directory + '\int_zahl.dat');
                  {$I-}
                  rewrite (f_write);
                  {$I+}
                  if IOResult = 0 then
                  write (f_write, i_zahl);
                  close (f_write);

                  end; {end of write_test}

                  procedure read_test;

                  var
                  i_zahl : integer;
                  f_read : file of integer;
                  li_date_time : longint; { For Get/SetFTime}
                  rec_date_time: TDateTime; { For Pack/UnpackTime}

                  function LeadingZero(w : Word) : String;
                  var
                  s : String;
                  begin
                  Str(w:0, s);
                  if Length(s) = 1 then
                  s := '0' + s;
                  LeadingZero := s;
                  end;

                  begin

                  i_zahl := 0;
                  {
                  getftime (f_read, li_date_time);
                  unpacktime(li_date_time, rec_date_time);
                  }
                  assign (f_read, s_directory + '\int_zahl.dat');
                  {
                  getftime (f_read, li_date_time);
                  unpacktime(li_date_time, rec_date_time);
                  }
                  {$I-}
                  reset (f_read);
                  {$I+}
                  if IOResult = 0 then
                  begin
                  getftime (f_read, li_date_time);
                  unpacktime(li_date_time, rec_date_time);
                  {$I-}
                  read (f_read, i_zahl);
                  {$I+}
                  if IOResult = 0 then
                  begin
                  with rec_date_time do
                  begin
                  writeln('Die aus der Datei ''int_zahl.dat'' gelesene Integer-Zahl ist: ',
                  i_zahl);
                  writeln('Das Datum und die Uhrzeit der Datei ist: ',
                  LeadingZero(day),'|', LeadingZero(month),'|', year,' ',
                  LeadingZero(hour),':', LeadingZero(min),':',
                  LeadingZero(sec));
                  end;
                  end;
                  close (f_read);
                  end;
                  end; {end of read_test}

                  begin
                  clrscr;
                  getdir(0, s_directory);
                  write_test;
                  read_test;
                  end.

                  </pre>

                  Vielen Dank für Eure Hilfe und einen guten Rutsch wünscht Euch

                  Hask

                  Comment

                  Working...
                  X