Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Progressbar wird nicht aktualisiert (https://www.delphipraxis.net/138137-progressbar-wird-nicht-aktualisiert.html)

Mongfice 4. Aug 2009 09:18


Progressbar wird nicht aktualisiert
 
Moin!

Ich hab folgendes Problem:

Ich habe eine Patch-Datei eine größere Änderung an einer DB geschrieben.

Da ich sowohl ne Test-Datenbank habe als auch eine "echte" kann ich über eine Checkbox nach Programmstart auswählen, ob ich die "echte" DB patchen will oder die Test-DB. Der eigentliche Patch wird über einen Timer gestartet. Alles kein Ding und der Patch läuft auch einwandfrei durch.

Da das Ganze nun aber etwas länger dauert hab ich zwei Progressbars eingebaut, eine die den Gesamtfortschritt anzeigt und eine die den Fortschritt der aktuellen Aufgabe anzeigen soll. Zusätzlich gibts noch ne Label, das die aktuelle Aufgabe anzeigt.

Das Problem ist, dass die zweite Progressbar und das Label nicht aktualisiert werden.
Das Label hab ich inzwischen ans laufen gebracht, indem ich explizit einen Refresh des Hauptformulars eingesetzt habe, nachdem das Label geändert wurde.
Das Gleiche bringt bei der zweiten Progressbar aber leider keinen Erfolg, die wird schlichtweg nie aktualisiert (bzw. aktualisiert wird sie, nur sieht man davon nichts).

Der Aufbau ist an sich wie folgt:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   timer1.enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Progressbar1.Step:= 100 div 25;
  timer1.enabled:=false;
  label1.Caption:='Verbindung zur Datenbank wird hergestellt.';
  try
    //"echte DB"
    if cbDB.Checked then
      connectDatenDB;
    // TestDB
    else
      connectDatenTestDB;
    MyConnection1.Connected:=true;
  except
    if MessageDlg('Verbindung zur Datenbank fehlgeschlagen!',mtError, [mbOK], 0) = mrOK then
      close;
  end;
  label1.Caption:='Patch wird ausgeführt.';


  try
    // SQL-Scripte ausführen (Tabellen anpassen/anlegen etc.)

    aktAufgabe.Caption:= 'Aufgabe 1';
    Form1.Refresh; //diese Refreshes brauch ich damit wenigstens das Label aktualisiert wird.
    {1.}Script1.Execute;
    Progressbar1.StepIt;
    aktAufgabe.Caption:= 'Aufgabe 2';
    Form1.Refresh;
    {2.}WKABerichtTexte.execute;
    Progressbar1.StepIt;
    .
    .
    .


    //Änderungen durchführen

    {14.}Aenderungen1;
    Progressbar1.StepIt;
    {15.}Anderungen2;
    Progressbar1.StepIt;
    .
    .
    .

    aktAufgabe.Caption:= '';

    MessageDlg('Datenbankaktualisierung erfolgreich!',mtInformation, [mbOK], 0);
    close;
  except
    MessageDlg('Fehler bei der Datenbankaktualisierung!',mtError, [mbOK], 0);
    close;
  end;
end;


procedure TForm1.Aenderungen1;
begin
  with qTemp do
  begin
    sql.Text:= 'Select * from tabelle1';
    open;
    aktAufgabe.Caption:= 'Änderungen 1';
    Progressbar2.Step:= 100 div RecordCount;
    Progressbar2.Position:=0;
    Form1.Refresh; //Refresh für die Aktualisierung des Labels (ohne klappt auch das nicht)
    for i:= 0 to RecordCount-1 do
    begin
      //Hier stehen die Änderungen;
      next;
      Progressbar2.StepIt;
      Form1.Refresh; //Wird zwar in jedem Durchlauf ausgeführt, aber zu sehen ist nix. Warum?
    end;
    close;
  end;
end;
Hab das ganze auch schon debugged, die Refreshes werden alle durchgeführt, und der Patch läuft wie gesagt einwandfrei durch, nur man sieht keine einzige Änderung an der Progressbar2. Ohne die Refreshes wird auch das Label "aktAufgabe" nicht aktualisiert. Die Progressbar1 funktioniert einwandfrei.

Hat jemand ne Idee, warum das mit der 2. Progressbar und dem Label nicht klappt, mit der 1. allerdings schon?

Gruß
Mongfice

BUG 4. Aug 2009 09:25

Re: Progressbar wird nicht aktualisiert
 
Form1.Refresh sendet nur die Message, das die Form neu gezeichnet werden soll. Brauchst du aber eigentlich gar nicht. Probiere mal Application.ProcessMessages, das gibt der Progressbar Zeit sich neu zu zeichnen.

MfG,
Bug

Mongfice 4. Aug 2009 09:40

Re: Progressbar wird nicht aktualisiert
 
Mhh, hab jetzt alle Refreshes durch das Application.ProcessMessages ersetzt.
Das hat zwar den ungeahnten Vorteil, dass die Anwendung nicht als "Reagiert nicht" im Taskmanager steht und (vollkommen unnütz) auch das animierte Logo das noch drauf ist dauerhaft funktioniert.

Nur am eigentlichen Problem ändert sich nix. Das Label wird zwar auch so aktualisiert, die 2. Progressbar aber leider nicht :-(

BUG 4. Aug 2009 09:49

Re: Progressbar wird nicht aktualisiert
 
Kann es sein das RecordCount > 100 ist? Dann wäre Progressbar2.Step nämlich 0.
Wenn ja, dann lass Progressbar2.Step mal bei 1 und setze Progressbar2.Max auf RecordCount.

MfG,
Bug

Mongfice 4. Aug 2009 09:55

Re: Progressbar wird nicht aktualisiert
 
Jo, genau das ist mir grad selbst auch aufgegangen.

Ich bin so blöde...

Der ist sogar sehr deutlich größer als 100, deshalb brauch ich ja überhaupt die Progressbar...

Sorry, für's Zeitverschwenden und danke!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz