Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

TThread: Wie eine Prodedure von Form1 in Thread bringen?

  Alt 14. Dez 2004, 15:06
Hallo,

ich hab folgende Procedure, der in der Form1 liegt.

Diesen möchte ich nun in einen Thread bringen.

Nur wird in diese Procedure eine erzeugte Progressbar benutzt, Strings aus einer ListView gelesen, Dateien kopiert, etc.

Was muss ich beachten, wenn ich diese Procedure in einen Thread bringen will?

Code:
procedure TForm1.Updaten;
var
  Anzahl, i, DateiNr, Info_Code: Integer;
  QuellDatei, Speicherort, Bezeichnung, Datei_Name, SpeicherDatei: String;
  QuellDatei_vorhanden, QuellDatei_unbenutzt, Speicherort_vorhanden,
  Speicherort_Datum_gleich, Speicherort_Datum_aelter, Speicherort_ueberschreiben,
  Datei_kopieren: Boolean;
  PB_Rect: TRect;

begin
  //Variablen leeren
  Info_Code := 0;

  //Variablen beschreiben
  Speicherort_ueberschreiben := CheckBox_Speicherort_ueberschreiben.Checked;

  //Anzahl der ListView-Einträge
  Anzahl := ListView_Dateien.Items.Count;

  //erste Seite anzeigen
  PageControl.ActivePageIndex := 0;

  //Komponenten disablen
  EnDisableComponents(false);

  for i := 0 to Anzahl - 1 do
    with ListView_Dateien do
      begin
        //Wenn die Form beendet wird dann die Schleife unterbrechen
        If Form_schliessen then
          break;

        //Dateinummer angeben
        DateiNr := i + 1;

        //Quell-Datei, Speicherort und Bezeichnung aus ListView auslesen
        QuellDatei   := Items.Item[i].SubItems.Strings[0];
        Speicherort  := Items.Item[i].SubItems.Strings[1];
        Bezeichnung  := Items.Item[i].SubItems.Strings[2];

        //Speicherort mit einem Backslash enden lassen
        Speicherort          := IncludeTrailingPathDelimiter(Speicherort);

        //prüfen ob die Quell-Datei vorhanden ist
        QuellDatei_vorhanden := FileExists(QuellDatei);

        //prüfen ob die Quell-Datei nicht benutzt wird
        QuellDatei_unbenutzt := not IsFileInUse(QuellDatei);

        //prüfen ob der Speicherort vorhanden ist
        Speicherort_vorhanden := DirectoryExists(Speicherort);

        //Dateinamen für Speicherort auslesen
        Datei_Name           := ExtractFilename(QuellDatei);

        //Dateinamen an den Speicherort anhängen, sollte eine Bezeichnung vorhanden
        //sein, dann wird diese angehängt
        If Bezeichnung <> '' then
          SpeicherDatei  := Speicherort + Bezeichnung
        else
          SpeicherDatei  := Speicherort + Datei_Name;

        //Datum prüfen
        If QuellDatei_Vorhanden and FileExists(SpeicherDatei) then
          begin
            Speicherort_Datum_gleich := DateiDatum(QuellDatei) = DateiDatum(SpeicherDatei);
            Speicherort_Datum_aelter := FileAge(SpeicherDatei) > FileAge(QuellDatei);
          end
        else
         begin
            Speicherort_Datum_gleich := false;
            Speicherort_Datum_aelter := false;
          end;

        //prüfen ob der Speicherort überschrieben werder darf
        If Speicherort_ueberschreiben then
          Speicherort_Datum_aelter := false;

        //prüfen ob die Checkbox in der ListView angeklickt wurde
        Datei_kopieren   := Items.Item[i].Checked;

        If Datei_kopieren and QuellDatei_vorhanden and QuellDatei_unbenutzt and
        Speicherort_vorhanden and not Speicherort_Datum_gleich and
        not Speicherort_Datum_aelter then
          begin
            //ListView nach rechts scrollen
            SendMessage(Handle, WM_HSCROLL, SB_RIGHT, 0);

            //kurze Wartezeit
            sleep(500);

            //Progressbar in der jeweiligen Zeile in der Spalte fünf erzeugen
            PB_Rect := Items[i].DisplayRect(drBounds);

            with PB_Rect do
              begin
                Left   := Left + Columns[0].Width + Columns[1].Width +
                                  Columns[2].Width + Columns[3].Width;

                Right  := Left + Columns[4].Width - 1;
                Bottom := Bottom - 1;
              end;

            //ProgressBar beschreiben
            with PB_Status do
              begin
                BoundsRect := PB_Rect;
                Visible    := true;
                Position   := 0;
              end;

            //ProgressBar an die ListView übergeben
            Items[i].Data := PB_Status;

            try
              //
              Application.ProcessMessages;

              //Datei kopieren
              CopyFileWithProgressBar(QuellDatei, SpeicherDatei, PB_Status, true);

              //Code 1
              Info_Code := 1;

              //kurze Wartezeit
              sleep(1000);
            finally
              //Progressbar verstecken
              PB_Status.Visible := false;
            end;
          end
        else
          begin
            If not Datei_kopieren then
              //Code 6
              Info_Code := 6
            else
              If not QuellDatei_vorhanden and not Speicherort_vorhanden then
                //Code 4
                Info_Code := 4
              else
                If not QuellDatei_vorhanden and Speicherort_vorhanden then
                  //Code 3
                  Info_Code := 3
                else
                  If QuellDatei_vorhanden and not Speicherort_vorhanden then
                    //Code 2
                    Info_Code := 2
                  else
                    If Speicherort_Datum_gleich then
                      //Code 5
                      Info_Code := 5
                    else
                      If Speicherort_Datum_aelter then
                        //Code 7
                        Info_Code := 7
                      else
                        If not QuellDatei_unbenutzt then
                          //Code 8
                          Info_Code := 8;
          end;

        //
        ListViewInfos(ListView_Dateien, i, 3, Info_Code);

        try
          Application.ProcessMessages;
        except
          //Meldung anzeigen
          MessageDlg(Msg3, mtInformation, [mbOK], 0);
        end;
      end;

  //Komponenten enablen
  EnDisableComponents(true);
mfg
Helmi
  Mit Zitat antworten Zitat