Autor Beitrag
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 08.09.06 14:24 
Hallo!
Ich nehme an, das Problem ist hinlänglich bekannt, aber ich finde im Forum leider keinen Ansatz, hier also nochmal die Geschichte.

Ich habe eine eigene Klasse von TObjekt abgeleitet und berechne dort irgendwas. Um den Fortschritt der Berechnung mitteilen
zu können, habe ich ein Ereignis
ausblenden Delphi-Quelltext
1:
TOnProcess = procedure(PercFinished:Integer) of object					

definiert, das ich zum geeigneten Zeitpunkt per
ausblenden Delphi-Quelltext
1:
if assigned(fOnProcess) then fOnProcess(<ausdruck>);					

aufrufe.
nun habe ich auf einer form einen button und eine Progress-Bar, die mir den fortschritt anzeigen soll.
beim klick passiert (metacode) folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  procedure button1Click;
    pbar.Max := 100;
    myobject.OnProcess := updateBar(perc:Integer);
    myobject.berechne;
  procedure updateBar(perc:Integer);
    pbar.Position := round(perc*100);

wenn ich auf den button clicke, fängt die PB bei 0 an und macht lange nichts, bis sie am Ende auf 100 springt.
Ich habe so etwas ähnliches schonmal gehabt, allerdings für ein Label mit Textänderung, und damals
hat
Application.ProcessMessages;
geholfen.
dies hilft in diesem Fall aber nicht, egal ob ich es in updateBar packe, oder die procedur in myobject, die
fOnProcess aufruft.

Wer kennt abhilfe?
Danke schonmal!
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Fr 08.09.06 14:46 
Application.ProcessMessages; sollte aber durchaus helfen. Und zwar nach dem setzen der Position in updateBar. Application.ProcessMessages; zwingt deine Anwendung ja, erstmal alle Windows-Messages, die so anstehen abzuarbeiten. Darunter sollte nach einer repositionierung der PBar auch eine Message zum Neuzeichnen der PBar sein. Also erzwingst du die Abarbeitung der Message und damit sollte der Fortschritt sichtbar sein.


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 08.09.06 14:53 
Hallo!
Zitat:
dies hilft in diesem Fall aber nicht, egal ob ich es in updateBar packe,

wie bereits geschrieben, auch wenn ich
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TfrmM.PBProcess(PercentFinished: Integer);
begin
  PBMain.Position := PercentFinished;
  Application.ProcessMessages;
end;

schreibe, tut sich an der während der berechnung rein gar nichts.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Fr 08.09.06 14:58 
Sollte aber. Setz doch mal hier einen Breakpoint und schau, ob er überhaupt vorbei kommt.... Und falls ja, ob PercentFinished den richtigen Wert hat.


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 08.09.06 15:05 
wie wärs mit: component.update ??

mfg el

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 08.09.06 15:20 
Hallo!
Ich habe gerade den Fehler bemerkt, er hatte mit dem berechneten Wert zu tun, dieser
war wegen einem vorzeichenfehler immer zwischen 0 und -99, nur am ende 100. daher die anzeige.
Fazit:
1. Sorry für meine Dämlichkeit
2. Ich brauche weder Application.ProcessMessages; noch Component.Update;, es geht so.
zumal wird Update automatisch aufgerufen, wenn man die eigenschaft "Position" ändert.

Grüße, thx 4 hlp