Autor Beitrag
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: 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:
ausblenden 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)+'%';//Prozentanzeige
    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
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: Sa 26.02.05 12:59 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: 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



BeitragVerfasst: Sa 26.02.05 14:07 
das von Keldorn müsste dir da doch weiterhelfen:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Sa 26.02.05 14:36 
OneOfTen hat folgendes geschrieben:
das von Keldorn müsste dir da doch weiterhelfen:

ausblenden 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



BeitragVerfasst: 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
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: Sa 26.02.05 16:36 
muß es nicht genau andersrum sein? :gruebel:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Sa 26.02.05 23:54 
Oki Doki ich hab es nun so gelöst:

ausblenden 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//zweiter und höherer Durchlauf
        altprozent:=prozent;        
    progressbar1.position:=i;
    end;
  Anzeige;
  end;


So wird das Apllication nur bei jeder Prozent änderung aufgerufen....