09. november 2006 - 00:14Der 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;
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;
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;
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.
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;
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.
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).
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...
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.'.
Synes godt om
Ny brugerNybegynder
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.