| Autor |
Beitrag |
Kroni
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 26.02.05 12:46
Guten Morgen!
Ich möchte, damit der User weiß, dass das Programm noch läuft, ne PRogressbar einsetzen...diese spreche ich mit folgendem Code an:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| if (max>0) then begin progressbar1.max:=max; for i:=1 to max do begin application.ProcessMessages; label7.caption:=floattostrF(i/max*100,fffixed,18,0)+'%'; progressbar1.position:=i; end; Anzeige; end; |
Anzeige ist ne Anzeige Procedur, die cih geschrieben habe, unwichtig....dazwischen werden noch ein paar Berechnungen durchgeführt..hjab eich nur zur übersichtlichkeit rausgelassen.
Nun ist es ja so, dass das apllication.ProcessMessages verdammt viel zeit kostet.
Repainten bzw Refresehen schaut verdammt "dumm" aus....
gibt es da ne andere Prozedur, oder muss cih da wirklcih per Hand reinschreiben, dass die Application.ProcessMessages nur selten aufgerufen wird??
Ich meine, ich bekomm nämlich gerade nicht raus, wie ich herausfinden kann, dass wieder ein Prozent dazugekommen ist, und dadurch ein ProcessMessages, Repaint oder sonst was aufgerufen wird??
Ist es da die beste Lösung, dass man sich den alten Prozentwert speichert, und guckt, ob der sich nun verändert hat oder so etwas???
Danke für die Antowrten, hoff, ihr könnt mich verstehen!
Gruß, Kroni
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Sa 26.02.05 12:59
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (i mod 100)=0 then begin "Labelanzeige"; application.processmessages end; |
100, 1000, 555 was immer du willst. Dann wird nur aller z.B. 100 Schleifendurchläufe ein processmessages durchgeführt. Den unterschied wirst du merken.
Mfg frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 26.02.05 13:32
Jo, das stimmt ja schon, aber ich will ja, dass er mir jedes Prozent anzeigt...d.h. wenn ich alle 100 Durchläufe das application aufrufe, kann es ja sein, dass innerhalb der hundert durchläugfe schon zwei prozent aufmal erhöhrt werden!
also....es wäre ja gut, wenn man erkennt, ob sich die anzeige um eins herhöht hat, und dann ein application aufgerufen wird.........
nur dafür bräuchte ich normal no ch ne speicehrvariable, die speichert, wie er wert beim durchlauf davor war, kann man das nich irgendwie verhindern
|
|
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 26.02.05 14:07
das von Keldorn müsste dir da doch weiterhelfen:
Delphi-Quelltext 1: 2:
| if ((100*i) Mod Max = 0) then |
dann sollte nur aktualisiert werden, wenn 1,0%, 2,0% usw erreicht sind
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 26.02.05 14:36
| OneOfTen hat folgendes geschrieben: | das von Keldorn müsste dir da doch weiterhelfen:
Delphi-Quelltext 1: 2:
| if ((100*i) Mod Max = 0) then |
dann sollte nur aktualisiert werden, wenn 1,0%, 2,0% usw erreicht sind |
nein, das funktioniert zb bei max=23 nicht!
bei 100 funktioniert das ganze wunderbar, aber sobald man eine ungerade zahl verwendet ist schluss!
|
|
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 26.02.05 15:34
ja du has recht, bei zB Primzahlen gehts nicht.
dann musst du wohl doch auf eine variable, die immer den prozentwert speichert und prüft, ob sie um eins größer geworden ist, zurückgreifen
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Sa 26.02.05 16:36
muß es nicht genau andersrum sein?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| max2:=math.max(1,max div 100); for i:=1 to max do begin ProgressBar1.Position:=i; if (i mod max2)=0 then begin mach was bei jedem 100. Durchlauf end; |
Ansonsten: gugg dir auch mal die Gauge-komponente an (Reiter Beispiel), die hat schon eine Prozentanzeuge drin
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Kroni 
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: Sa 26.02.05 23:54
Oki Doki ich hab es nun so gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| if (max>0) then begin progressbar1.max:=max;
for i:=1 to max do begin prozent:=trunc(i/max*100); if (prozent>altprozent) then begin label7.caption:=floattostrF(prozent,fffixed,18,0)+'%'; application.ProcessMessages; end; if (i>1) then altprozent:=prozent; progressbar1.position:=i; end; Anzeige; end; |
So wird das Apllication nur bei jeder Prozent änderung aufgerufen....
|
|
|