Avatar billede delphiuser Mester
25. september 2007 - 15:50 Der er 2 kommentarer og
1 løsning

talte poster rykker progressbar

Hej eksperter

Jeg er i mit program i gang med at lave en splashscreen som skal tælle alle mine poster i min database. men jeg ved ikke hvordan man gør lige akurat det. jeg har forsøgt mig frem men uden held.

her kommer lige min splash unit...

unit massplash;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Gauges, StdCtrls, jpeg, ExtCtrls, ComCtrls, DB, ADODB;

type
  TForm2 = class(TForm)
    Image1: TImage;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    Timer1: TTimer;
    ProgressBar1: TProgressBar;
    ADOConnection1: TADOConnection;
    ADOConnection2: TADOConnection;
    ADOTable1: TADOTable;
    ADOTable2: TADOTable;
    ADOTable3: TADOTable;
    ADOTable4: TADOTable;
    ADOTable5: TADOTable;
    ADOTable6: TADOTable;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses masmain;

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
progressbar1.Step:=1;
progressbar1.Max:=100;
timer1.Interval:=1000;
timer1.Enabled:=true;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
I:integer;
begin
  timer1.Enabled:=false;
  for i := 1 to 100 do
    begin
      progressbar1.Position:=1;
      statictext2.Caption:='Tæller Møder';
      progressbar1.StepIt:=inttostr(adotable2.RecordCount);
      progressbar1.Position:=20;
      statictext2.Caption:='Tæller Opgaver';
      progressbar1.StepIt:=inttostr(adotable3.RecordCount);
      progressbar1.Position:=40;
      statictext2.Caption:='Tæller Kunder';
      progressbar1.StepIt:=inttostr(adotable5.RecordCount);
      progressbar1.Position:=60;
      statictext2.Caption:='Tæller Kontakter';
      progressbar1.StepIt:=inttostr(adotable6.RecordCount);
      progressbar1.Position:=80;
      statictext2.Caption:='Åbner programmet';
      progressbar1.StepIt;
      sleep(50);
    end;
  form1.show;
  close;
end;

end.

Den vil ikke gøre det på denne måde. altså har jeg gjort noget helt forkert. Den skal fungere sådan at det den tæller af poster skal den rykke i progressbaren men det tror jeg nok forekommer i mit forsøg på at lave det. håber meget i kan hjælpe mig.
Avatar billede hrc Mester
25. september 2007 - 23:55 #1
Du mangler at sætte Max til summen af tabllernes RecordCount, men dem skal du glemme og i stedet køre det procentvis. Men umiddelbart giver konstruktionen alligevel ingen mening. Når du tager RecordCount fra en tabel sker det øjeblikkeligt og du ser ikke trinene. Der hvor pauserne er, er ved åbning af tabellerne:

Jeg forstiller mig en form med en TMemo og en TProgressBar:

type
  TfrmSplash = class(TForm) // Husk: FormStyle := fsStayOnTop;
    mStatus: TMemo;
    pbStatus: TProgressBar;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    function GetMax: integer;
    function GetPosition: integer;
    procedure SetMax(const Value: integer);
    procedure SetPosition(const Value: integer);
  public
    function Add(const aString: string): integer; overload;
    function Add(const aString: string; const aArgs: array of const): integer; overload;
    property Max: integer read GetMax write SetMax;
    property Position: integer read GetPosition write SetPosition;
  end;

var
  frmSplash: TfrmSplash;

implementation

function TfrmSplash.Add(const aString: string; const aArgs: array of const): integer;
begin
  result := mStatus.Lines.Add(format(aString,aArgs));
  Application.ProcessMessages; // Opdaterer skærmen
end;

function TfrmSplash.Add(const aString: string): integer;
begin
  result := Add(aString,[]);
end;

procedure TfrmSplash.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TfrmSplash.FormDestroy(Sender: TObject);
begin
  frmSplash := nil;
end;

function TfrmSplash.GetMax: integer;
begin
  result := pbStatus.Max;
end;

function TfrmSplash.GetPosition: integer;
begin
  result := pbStatus.Position;
end;

procedure TfrmSplash.SetMax(const Value: integer);
begin
  pbStatus.Max := Value;
  pbStatus.Position := 0;
  Application.ProcessMessages;
end;

procedure TfrmSplash.SetPosition(const Value: integer);
begin
  pbStatus.Position := Value;
  Application.ProcessMessages;
end;

// i programmet ser det således ud:

  frmSplash := TfrmSplash.Create(nil);
  frmSplash.Max := 100;
  frmSplash.Position := 0;
 
  frmSplash.Show;
  try
    Table1.Open;
    frmSplash.Add('Åbner tabel 1 (%d)',[Table1.RecordCount]);
    frmSplash.Postion := 33;
 
    Table2.Open;
    frmSplash.Add('Åbner tabel 2 (%d)',[Table2.RecordCount]);
    frmSplash.Postion := 66;
 
    Table3.Open;
    frmSplash.Add('Åbner tabel 3 (%d)',[Table3.RecordCount]);
    frmSplash.Postion := 100;
  finally
    frmSplash.Release; // alternativt denne: frmSplash.Close
  end;
Avatar billede hrc Mester
25. september 2007 - 23:59 #2
Kan selvfølgelig også lave endnu et par overloads af Add funktionen:

function Add(const aString: string; const aPosition: integer): integer; overload;

function Add(const aString: string; const aArgs: array of const; const aPosition: integer): integer; overload;

// Implementeret

function Add(const aString: string; const aPosition: integer): integer;
begin
  result := Add(aString,[],aPosition);
end;

function Add(const aString: string; const aArgs: array of const; const aPosition: integer): integer;
begin
  result := Add(aString,aArgs);
  pbStatus.Position := aPosition;
  Application.ProcessMessages;
end;

... så sparer du en linje hver gang
Avatar billede hrc Mester
26. september 2007 - 00:01 #3
For din egen skyld, giv dog dine objekter nogle fornuftige navne. Du løber alt for let sur i det og mister overblikket når du har ADOTable1, ADOTable2, ADOTable3, ... Et stykke tid væk fra programmet og du har ingen anelse om hvad de indeholder.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester