Results 1 to 5 of 5

Thread: Form update probleem

  1. #1
    John van Dijk
    Join Date
    Aug 2006
    Location
    Belfeld
    Posts
    51

    Question Form update probleem

    Een applicatie voert gedurende een aantal minuten diverse acties uit, en daarvan wil ik de status weergeven middels een panel caption en een progress bar.
    Progressbar en panel worden na wijziging geupdate.
    Dat werkt, totdat de form de focus verliest.
    Hoe kan ik dit opvangen?
    Ik heb begrepen dat Application.processMessages niet zo'n goeie oplossing is?

    Update van de progress bar en panel:

    Code:
    // Write info on panel
    procedure TfrmMain.ShowEWonPanelInfo(strComment: String);
    begin
      pnlSelectedEWon.Caption := strComment;
      pnlSelectedEWon.Update;
    end;
    Code:
        .......
        pBarReadEWonData.Visible := True;
        pBarReadEWonData.Max     := lvEwons.items.Count-1;
    
        for iX := 0 to lvEwons.items.Count-1 do
        begin
          pBarReadEWonData.Position := iX;
          pBarReadEWonData.Update;
    
          strGetData_EWonID := lvEwons.Items[iX].Caption;
    
          if (IsEwonActive(strGetData_EWonID)) then
          begin
            ShowEWonPanelInfo( lvEwons.Items[iX].SubItems[0] );
            .......
            .......
          end;
          frmMain.Refresh;
          frmMain.Update;
      end;

  2. #2
    Het hangt er helemaal van af wat je doet. Application.ProcessMessages heeft wat nadelen, maar in heel veel situaties volstaat het ook wel.

    Vaak is het beter om de tijdrovende bewerking in een aparte thread uit te voeren, mits dat kan.
    Niet heel lang geleden hadden we de vergelijkbare vraag: Update ProgressBar, en wat langer geleden ook nog onderwerpen als Hoe toon je gebruiker dat de appl bezig is, Progressbars werken niet correct, Tekst doorgeven in een thread, en vast nog meer.
    1+1=b

  3. #3
    Je zou eens kunnen kijken naar een TTask in combinatie met een Queue, zie voorbeeldje hieronder:
    Code:
    unit Unit1;
    
    interface
    
    uses
      System.Threading,
      Winapi.Windows,
      Winapi.Messages,
      System.SysUtils,
      System.Variants,
      System.Classes,
      Vcl.Graphics,
      Vcl.Controls,
      Vcl.Forms,
      Vcl.Dialogs,
      Vcl.ComCtrls,
      Vcl.StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        ProgressBar1: TProgressBar;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Task: ITask;
    begin
      Task := TTask.Create(
        procedure
        var
          I: Integer;
        begin
          for I := 1 to 100 do
          begin
            Sleep(300);
            TThread.Queue(nil,
              procedure
              begin
                ProgressBar1.Position := I;
              end);
          end;
        end);
      Task.Start;
    end;
    
    end.

  4. #4
    John van Dijk
    Join Date
    Aug 2006
    Location
    Belfeld
    Posts
    51

    Thumbs up

    Bedankt voor de feedback.
    Ik ga eens wat experimenteren met Threading (heb ik nog niet echt veel mee gedaan), en TTask (had ik nog nooit van gehoord).
    Voor nu kwam ik ook de optie
    Code:
    if GetQueueStatus(QS_ALLINPUT) <> 0 then Application.ProcessMessages;
    tegen.
    Dat werkt zonder problemen, daarmee kunnen we in ieder geval vooruit.
    Thanks!

  5. #5
    Als je met threading bezig wilt gaan, kan ik je echt dit boek aanraden delphi-high-performance (Primož Gabrijelčič)

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •