Avatar billede janbb Juniormester
09. november 2006 - 00:14 Der er 14 kommentarer og
1 løsning

slow progressBar

X Ved et gennemløb af en query - kan man så
bevirke at der stoppes et par sec. ved hver record
i denne procedure ?
En eller anden 'wait' kommando eller sådan noget.
Så man lige får et lille glimt af hver rec..





procedure TForm1.Button11Click(Sender: TObject);
var
i: integer;
begin
with ProgressBar1 do
begin
Min:=0;
Max:= ADOQuery1.RecordCount;
ADOQuery1.First;
for i:= min to max do
begin
Position:=i;
ADOQuery1.next;
end;
end;
Label5.Caption := IntToStr(adoQuery1.RecordCount);
end;
Avatar billede jensfudge Nybegynder
09. november 2006 - 08:32 #1
Du kan kalde sleep(xxx) hvor xxx er antal millisekunder...
Du kan desuden kalde application.processmessages der bevirker at skærmbilledet for lov at tegne sig selv igen (men pas på... Den KAN i visse tilfælde sløve det du vil opnå, nemlig at gennemløbe din ADOQuery).
Og endelig kan du kalde update eller refresh (husker ikke hvilken) på din progressbar:
Progressbar1.update;

/Jens
Avatar billede janbb Juniormester
09. november 2006 - 12:41 #2
Meget god effekt - tusind tak.
Kan man putte en slags 'afbryderknap' ind osse ?.
Laver et 50 points spm. mere - hvis det er ladesiggøreligt.
Avatar billede martinlind Nybegynder
09. november 2006 - 12:52 #3
VAR
  Slut : Boolean;

Slut := FALSE;
ADOQuery1.First;
while not ADOQuery1.eof and not Slut do
begin
// skriv din kode her ;
Application.ProcessMessages;
ADOQuery1.Next;
end;

// Lav så en knap der sætter slut til TRUE;
// og vupti så er du ude;
Avatar billede martinlind Nybegynder
09. november 2006 - 12:53 #4
RecordCount er IKKE til at regne med på alle DB platforme :)
Avatar billede jensfudge Nybegynder
09. november 2006 - 13:40 #5
Martin har en god pointe... RecordCount er kun brugbar hvis du har hentet alle records som opfylder SQL'en... Klares i (næsten?) alle tilfælde med:

AdoQuery.Open;
AdoQuery.Last;
AdoQuery.First;

For at Slut := true virker, KRÆVER det at du har application.Processmesages i koden...
Ellers løber den loopen igennem først, og først derefter kommer det event der sætter slut:= true.
Avatar billede martinlind Nybegynder
09. november 2006 - 14:03 #6
det har jeg også puttet ind :)
Avatar billede jensfudge Nybegynder
09. november 2006 - 14:24 #7
Ja Martin. Det så jeg godt.. Jeg ville blot gøre opmærksom på at det er et KRAV, og ikke en option.
Avatar billede janbb Juniormester
10. november 2006 - 13:31 #8
Synes ikke lige jeg kan få det til at virke - knappen må da skulle ligge i den samme procedure ? og hvordan det ( on keypressed - eller sådan noget ?) eller skal variable lægges op i toppen af unit'en ?.


procedure TForm1.Button11Click(Sender: TObject);
var
i: integer;
Slut : Boolean;
begin
Slut := FALSE;
ADOQuery1.First;
while not ADOQuery1.eof and not Slut do

begin
with ProgressBar1 do
begin
Min:=0;
Max:= ADOQuery1.RecordCount;
ADOQuery1.First;
for i:= min to max do
begin
Position:=i;
ADOQuery1.next;
application.processmessages;
sleep(2000);
end;
end;
//Label5.Caption := IntToStr(adoQuery1.RecordCount);
end;
Application.ProcessMessages;
ADOQuery1.Next;
end;
procedure TForm1.Button12Click(Sender: TObject);
var
Slut : Boolean;
begin
Slut := TRUE;
end;
Avatar billede jensfudge Nybegynder
10. november 2006 - 13:42 #9
Du har oprettet to procedurer med hver deres LOKALE variabel der hedder slut. De to slut variabler du har kan ikke se hinanden.
I stedet skal du have en variabel i klassens Interface del.
Der hvor der står:
{private declarations}
slut : Boolean; 

Og på Button11Click starter du med at sætte den til False.

Sørg nu for at slette de to lokale variabler du har der hedder slut, ellers virker det ikke da lokale variabler har fortrinsret overfor medlemsvariabler.

/Jens
Avatar billede jensfudge Nybegynder
10. november 2006 - 13:45 #10
Og en anden ting... Der gør det pænere... Kald nu dine knapper og variabler i det hele taget noget fornuftigt.

Button11 = btnLoopRecords
AdoQuery1 = aqryUsers    //hvis det er en users table du gennemløber
Label5  = lblRecordCount

Og hvis du skal gøre det rigtig pænt gør du det på engelsk, hvor du ikke har en variable der hedder slut, men finished, eller aborted...
Avatar billede janbb Juniormester
10. november 2006 - 14:32 #11
Har forsøgt med at sætte slut i public declarations, men der er ingen reaktion på nogen tastetryk mens processen løber.
(Har haft svært ved at rename knapper - de skal jo ind på formen og bagefter hvis
man ændrer det skriver de at knappen er declareret osse hvis man sletter det og mm).
Avatar billede jensfudge Nybegynder
10. november 2006 - 14:53 #12
Public er det forkerte sted, sæt den private i stedet (ikke at det internt i klassen giver forskel, men det er en privat ting det her)

Hvis du har application.processmessages er der reaktion selvom processen løber.
Hvis du har glemt at slette de lokale definerede variabler, vil det se ud som om dine events ikke kommer frem mens processen løber, da du i så fald tester på den forkerte variabel.

I ObjectInpsectoren ændrer du navnet på knappen (Iøvrigt som det allerførste du gør), og den retter selv op på alle dine OnButtonClick ting...
Avatar billede martinlind Nybegynder
10. november 2006 - 15:21 #13
Godt jensfudge, vi skal ha' noget god opdragelse :)
Avatar billede janbb Juniormester
11. november 2006 - 14:03 #14
martinlinds proc.:

Slut := FALSE;
ADOQuery1.First;
while not ADOQuery1.eof and not Slut do
begin
// skriv din kode her ;
Application.ProcessMessages;
ADOQuery1.Next

Stiller betingelserne op -
Men mangler der ikke et ELSE (eller noget) ?

Og I skal endelig bare være pædagogiske (jeg har aldrig modtaget nogen formel undervisnig) jeg vil gerne lære lidt proff. - style :).
Avatar billede janbb Juniormester
11. november 2006 - 14:21 #15
Ved ikke om det er af betydning, men i programmet indgår 5 faste SQL-valg plus een valgfri - sql og progressbarproc. behandler altsaa den på et givet tidspunkt 'åbne' SQL.Så jeg har ikke umiddelbart mulighed for at lægge martinlinds proc. ind som en del af 'hovedproc.'.
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