AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Kopieren mit TProgressbar Ausserhalb des gültigen bereiches
Thema durchsuchen
Ansicht
Themen-Optionen

Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

Ein Thema von gee21 · begonnen am 21. Feb 2013 · letzter Beitrag vom 22. Feb 2013
Antwort Antwort
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#1

Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 18:08
Hallo alle zusammen.

Habe im netz (Bei Torry)
Den folgenden Code gefunden und minimal angepasst. Egentlich funktioniert auch alles. (Dateien, respektive Ordner Inhalt kopieren)
Aber je nach Dateigrösse die ich verwende zum kopieren, erhalte ich zum Teil (nicht immer) die Fehlermeldung:

"Eigenschaft TProgressbar ausserhalb der zulässigen Bereiches."

ich vermute das der Max Wert der Progressbar je nach Dateigrösse zu gross ist. Daher versuchte ich einfach den Wert zu dividieren durch 100
Aber irgendwie klappte auch dass nicht und die Fehlermeldung kommt weiterhinn


Delphi-Quellcode:
type
   TCallBack = procedure(Position, Size: Longint); { export; }

procedure FastFileCopy(const InFileName, OutFileName: string;
   CallBack: TCallBack);

implementation

uses Optionen, Unit3, Unit5, Unit6, Unit7, Unit8, uFTPServer;

{$R *.dfm}



procedure TForm1.WMSysCommand;
begin
if (Msg.CmdType = SC_MAXIMIZE) then
button6.Click ;
DefaultHandler(Msg) ;
if form1.WindowState=wsmaximized then form1.WindowState:=wsnormal;
end;


procedure FastFileCopyCallBack(Position, Size: longint);
begin



   Form1.ProgressBar1.Max := Size;
   Form1.ProgressBar1.Position := Position;

// BRINGT nichts
// Form1.ProgressBar1.Max := Size div 100;
// Form1.ProgressBar1.Position := Position div 100;


end;

procedure FastFileCopy(const InFileName, OutFileName: string;
   CallBack: TCallBack);
const
   BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results }
type
   PBuffer = ^TBuffer;
   TBuffer = array[1..BufSize] of Byte;
var
   Size: DWORD;
   Buffer: PBuffer;
   infile, outfile: file;
   SizeDone, SizeFile: LongInt;
begin
   if (InFileName <> OutFileName) then
   begin
     buffer := nil;
     Assign(infile, InFileName);
     Reset(infile, 1);
     try
       SizeFile := FileSize(infile);
       Assign(outfile, OutFileName);
       Rewrite(outfile, 1);
       try
         SizeDone := 0;
         New(Buffer);
         repeat
         application.ProcessMessages;
           BlockRead(infile, Buffer^, BufSize, Size);
           Inc(SizeDone, Size);
           CallBack(SizeDone, SizeFile);
           BlockWrite(outfile, Buffer^, Size)
         until Size < BufSize;
         FileSetDate(TFileRec(outfile).Handle,
         FileGetDate(TFileRec(infile).Handle));
       finally
         if Buffer <> nil then
           Dispose(Buffer);
         CloseFile(outfile)
       end;
     finally
       CloseFile(infile);
     end;
   end
   else
     raise EInOutError.Create('File cannot be copied onto itself')
end; {FastFileCopy}


Aufrufen tu ich es dann so:

Delphi-Quellcode:
 if directoryexists(form2.Edit2.Text+'\'+form1.ListBox1MAINLISTE.Items[form1.ListBox1MAINLISTE.ItemIndex])=false then forcedirectories(form2.Edit2.Text+'\'+form1.ListBox1MAINLISTE.Items[form1.ListBox1MAINLISTE.ItemIndex]);

repeat
application.ProcessMessages;

if fileexists(form1.FileListBox1.Items[0]) then begin
FastFileCopy(form1.FileListBox1.Items[0], form2.Edit2.Text+'\'+form1.ListBox1MAINLISTE.Items[form1.ListBox1MAINLISTE.ItemIndex]+'\'+form1.FileListBox1.Items[0], @FastFileCopyCallBack);
application.ProcessMessages;
end;
if form1.FileListBox1.Items.Count>0 then form1.FileListBox1.Items.Delete(0);

until form1.FileListBox1.Items.Count<1;
PlaySound(PChar(ExtractFilePath(Application.Exename)+'\Sounds\copy.wav'),0,SND_ASYNC);

Könnt ihr mir sagen wo der Fehler passiert? Respektive wie man ihn einfach lösen könnte?

Danke & Gruess
Robert
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 18:18
Ich meine es müsste in dem Callback heissen:
Delphi-Quellcode:
Form1.ProgressBar1.Max := 100;
Form1.ProgressBar1.Position := Position div Size * 100;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 18:33
Ich meine es müsste in dem Callback heissen:
Delphi-Quellcode:
Form1.ProgressBar1.Max := 100;
Form1.ProgressBar1.Position := Position div Size * 100;
Ja Hallo und danke für die Antwort.

So geht's! Leider aber zeigt nun merkwürdigerweise die Progressbar den aktuellen Status nicht mehr an. Die Datei wir kopiert und anschliessend springt die Progressbar von 0 direkt auf 100 ??
Robert
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 18:51
Dann bau doch ein Progressbar1.Update oder Application.Processmessages ein. Das könnte allerdings die Performance vernichten. Oder lass mal ein Debugprotokoll mitlaufen, in dem Du dann sehen kannst wie oft und mit welchen Parameter der Callback aufgerufen wird.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 18:54
Ja ein application.proccessmesages hab ich noch zusätzlich bei deinem code eingebaut. Hat aber leider nichts gebracht.

debug weiss ich leider nicht wie es geht.
Robert
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 19:01
Setz links neben dem Source im "Gutter" einen Breakpoint. Auf dem roten Pünktchen dann die rechte Maustaste klicken und "Haltepunkt Eigenschaften" auswählen.
Dort "erweitert" betätigen. "Anhalten" ausschalten. In Eval-Ausdruck z.b. Position eingeben. Programm starten. Im Protokoll wird dann der Wert jedes Mal geschrieben, wenn diese Stelle ausgeführt wird.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 21. Feb 2013, 20:58
Ich meine es müsste in dem Callback heissen:
Delphi-Quellcode:
Form1.ProgressBar1.Max := 100;
Form1.ProgressBar1.Position := Position div Size * 100;
Das kann so leider nicht funktionieren, denn es wird erst Position div Size berechnet (da kommt immer 0 heraus, Ausnahme Position = Size, dann 1) und das mit 100 multipliziert.

Jetzt sollte auch klar werden, warum die Progressbar-Anzeige so springt

So wird dann auch richtig gerechnet:
Delphi-Quellcode:
Form1.ProgressBar1.Max := 100;
Form1.ProgressBar1.Position := ( 100 * Position ) div Size;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#8

AW: Kopieren mit TProgressbar Ausserhalb des gültigen bereiches

  Alt 22. Feb 2013, 07:12
Delphi-Quellcode:
if Assigned(Callback) then
  Callback(0, SizeFile);
Sollte das Ganze stabiler machen, und man muss nicht zwingend einen Callback mitgeben.
Zitat:
Form1.ProgressBar1.Position := ( 100 * Position ) div Size;
Noch' n Vorschlag:
Form1.ProgressBar1.Position := MulDiv(Position, 100, Size);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz