Autor Beitrag
zacki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 07.01.05 18:45 
Hallo!

Wieder einmal was neues in Delphi gelernt... Das Behandeln von untypsierten Dateien!!!
Eigentlich sollen wir damit nur ein einfaches Kopierprogramm mit zwei EditFeldern und einem Button erstellen, aber ich fand es besser, das dann gleich mit mehreren Dateien hintereinander, Forschrittsanzeige, Dateiinformationsanzeige, etc. zu machen. :D

Das ganze funktioniert auch wunderbar, aaaaber...
Wenn ich die LabelCaption zur Dateigrößenanzeige ändere, passiert das erst nach dem Vorgang des Kopierens, bzw wird erst dann sichtbar.
Ausgeholfen habe ich mir mit einem Timer, den ich auf 10ms gestellt habe, und dann einen Teil eben "ausgelagert" habe (das hat wunderbar funktioniert!).
Das Problem ist bloss, dass dann nicht mehr das Kopieren von mehreren Dateien nacheinander möglich ist (wegen der Auslagerung).

Hier ein bsichen Code ;D
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Label1.Caption:=FloatToStr(size)+' MB kopiert';
Progressbar1.Max:=Filesize(vonf) DIV 1000;
Assignfile(nachf,nach);
Rewrite(nachf,1);
durchgang:=0;
REPEAT
inc(durchgang);
Blockread(vonf,Puffer,SizeOf(Puffer),gelesen);
Blockwrite(nachf,Puffer,gelesen,geschrieben);


Kann mir jemand sagen, wie ich Delphi da irgendwie 10ms oder ähnlich warten lassen kann (vor dem REPEAT)?

Thx schonmal!
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 07.01.05 18:50 
innerhalb der schleife bewirkt ein application.processmessages wunder. beachte aber, das du das nicht zu oft aufrufst, da es auch zeit kostet.

mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
zacki Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 07.01.05 19:02 
Okay, vielen Dank, das funktioniert jetzt...
Was meinst du mit "nicht zu oft"?

10mal?
100mal?

Thx nochmal :D
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Fr 07.01.05 19:12 
du kannst ja mal die zeit messen, die die routine mit application.processmessages benötigt und ohne !
also garad bei vielen schleifen durchläufen würde ich schauen, dass das nur bei jedem 5. oder 10. mal ausgeführt wird.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 07.01.05 19:16 
achso, und damit wir uns nicht mißverstehen, den timer brauchst du natürlich bei application.processmaeesage nicht mehr.

wieviel zeit das kostest, siehst du auch "optisch" an einem kleinem Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button2Click(Sender: TObject);
Var i:integer;
begin
  for i:=1 to 100000 do
    begin
      Label2.Caption:=inttostr(i);
      Application.ProcessMessages;
    end;
  for i:=1 to 100000 do
    begin
      Label2.Caption:=inttostr(i);
      if (i mod 1000)=0 then Application.ProcessMessages; //nur alle 1000 aktualisieren
    end;
end;

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)