Pasek 'podstępu'

0

Mam taki mały problem.
Jestem w trakcie modernizacji swojego
programu, jest to baza danych. Problem
jest tego typu: podczas wyświetlania danych
w tabeli, a jest ich dopiero 200 pozycji,
programowi zajmuje jakiś czas żeby je wyświetlić.
Chciałbym w tym miejscu zamontować jakiś Progressbar,
żeby pokazywał stan przetwarzanych danych do wyświetlenia.
Jak to zobić?
Proszę o kawałeczek kodu.
Martinezo.

0

Potrzebne Ci będą tylko dwie właściwości progressBar'a:
ProgressBar.Max:=tu ustaw ilość rekordów w Twojej bazie
ProgressBar.Position:=nr rekordu aktualnie wczytywanego do tabeli.

0

No dobrze, ale jak to zrobić (nr rekordu aktualnie wczytywanego do tabeli.)
w SQLu.
Martinezo.

0

Ech... Musisz jakoś kombinować i rzucać zapytania kawałkami. Tylko nie ma sensu rzucać po jednym, tylko np. po 10 ładować i w progress barze dać max:=ilosc_rekordow div 10.

0

Zapytanie jest realizowane przez sterowniki bazy danych a nie przez aplikacje wiec nie mozesz go sledzic, a jesli podzielisz zapytanie na kawalki to zwolnisz znaczaco czas odczytywania, to nie ma sensu. Jakiej bazy danych urzywasz? Przy 200 regordach nie powinienes miec czasu aby cokolwiek zobaczyc. ja testowalem tabele liczaca 120 000 rekordow i 30 kolumn i wszystko dzialalo bardzo szybko.

0

Wyświetlasz wyniki chyba w jakiejś pętli, to zrób tak:

PrograssBar.Max := xxx;
ProgressBar.Position := 0;
for i := 1 to xxx do begin
    //wyświetlasz rekord;
    ProgressBar.Position := ProgressBar.Position + 1;
end;
0

Wyświetlanie rekordów w pętli mija się z celem! Bedzie to rzeczywiście trwało koszmarnie dużo czasu. Zamiast zajmować się tworzeniem ProgressBar'u, przejrzyj konstrukcję bazy i polecenie wyświetlające. Nie jest możliwe, aby wyświetlanie 200 rekordów zajmowało tyle czasu! SQL jest szybki i takie rzeczy są rzeczą niemożliwą!

0

Wszysko się zgadza, tylko że
ja wyświetlam tylko trzy kolumny w tabeli,
ale do każdego rekordu dołączony jest obrazek
w jpg.
Może to ma wpływ na długość wczytywanych danych?.
Martinezo.

0

A może wpływ ma to, że dodajesz dane do listview i za każdym razem listview jest odrysowywany? Nie wiem, z czego korzystasz, ale jeśli z listview, to radzę się zainteresować beginupdate() i endupdate() :).

0

Już wyjaśniam:
Dane wyświetlam w tabeli dbgrid,
do tego dochodzi komponent dbmemo i
komponent do wyświetlania obrazków dbimage.
Tabele są w formacie Paradox 7.
A wsztstko chodzi w Delphi 3.
Trudno mi powiedzieć dlaczego te dane się wczytują tak długo,
ale wygenerowanie raportu (quickrep), dla wszystkich danych z
tabeli zajmuje też sporo czasu (ok. 10s).
p.s.
Dla wyświetlenia danych używam zapytania w SQL.
Martinezo.

0

Spruboj wykluczyc z zapytania SQL kolumne z oprazkiem i wysylac zapytanie do qazy tylko o obrazek za karzdym razem gdy zmienia sie aktywny rekord (pytasz wtedy tylko o jeden obrazek z jednego rekordu), tyle ze dla raportu bedziesz musial zrobic osobne zapytanie i to bedzi juz wolne.

0

Napisalem juz raz to co teraz i po opublikowaniu sie nie pojawilo na forum. Jesli sie pojawi teraz dwa razy wybaczce.

ort! wykluczyc z zapytania kolumne z ort! i wysylac zapytanie (z drugiego Querry) tylko o jeden obrazek za karzdym razem gdy sie zmieniasz rekord. Tyle ze dla QR bedziesz musial uzyc starego zapytania.

0

procedure TForm1.Button1Click(Sender: TObject);
var
r: TRect;
pb: TProgressBar;
begin
Listview1.Columns.Add.Width := 100;
Listview1.Columns.Add.Width := 200;
Listview1.ViewStyle := vsReport;
Listview1.Items.Add.Caption := 'Text';

r := Listview1.Items[0].DisplayRect(drBounds);
r.Left := r.Left + Listview1.columns[0].Width;
r.Right := r.Left + Listview1.columns[1].Width;

pb := TProgressBar.Create(Self);
pb.Parent := Listview1;
pb.BoundsRect := r;
pb.Position := 30;
Listview1.Items[0].Data := pb;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
pb: TProgressBar;
begin
pb := TProgressBar(Listview1.Items[0].Data);
pb.StepIt;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1