PDA

View Full Version : استفاده از ProgressBar زمان Load شدن اطلاعات یک ADOQuery در Grid



behzadboloori
سه شنبه 13 مهر 1389, 17:28 عصر
چون دیتابیس من بزرگه زمان لود شدن نتیجه جستجو در گرید خیلی طول میکشه. برای این مدت میخواستم کاربر روند لود کردن رو مشاهده کنه. توی راهنمای خود برنامه از این روش استفاده کرده:



procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Caption := 'Percent complete: ' + IntToStr(Trunc(Progress / MaxProgress * 100)) + '%';
Application.ProcessMessages;
end;


اما من نفهمیدم این Caption و process messages چیه؟ علاوه بر این، من هنگام Trace کردن اصلا به این دستورات نمیرسم. حتی اگه یه MessageDlg هم بذارم چیزی رو نه در زمان لود و چه بعد از اون (onfetchcomplete) باز هم پیغامی نمایش داده نمیشه.

behzadboloori
دوشنبه 03 آبان 1389, 08:35 صبح
یعنی تا حالا کسی در زمان لود شدن دیتابیس های سنگین از هیچ بروگرس باری استفاده نکرده؟

حسین خانی
دوشنبه 03 آبان 1389, 22:42 عصر
با سلام :لبخندساده:

with ProgressBar1 do
begin
Min := 0;
Max := 100;
Max := ADOQuery1.RecordCount;
ADOQuery1.First;
for i := Min to Max do
begin
Position := i;
ADOQuery1.Next;
end;
end;

موفق باشید ...

babak869
سه شنبه 04 آبان 1389, 00:24 صبح
یه راه بهتر و ساده تر اینه که یه فرم مثل اسپلش بسازید و قبل از انجام پروسه اونو نمایش بدید و در پایان پروسه ببندید .مثل این:

Begin
Splash_frm.showmodal;
//your Transaction
splash_frm.close;
end;
موفق باشید

behzadboloori
چهارشنبه 05 آبان 1389, 08:06 صبح
من این دستورات رو کجا باید بدارم؟

حسین خانی
چهارشنبه 05 آبان 1389, 23:05 عصر
با سلام :لبخندساده:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from Table1 where jensiat like '''+ComboBox1.Text+'''');
ADOQuery1.Active:=True;
//-----------
ProgressBar1.Visible:=True;

with ProgressBar1 do
begin
Min := 0;
Max := 100;
Max := ADOQuery1.RecordCount;
ADOQuery1.First;
for i := Min to Max do
begin
Position := i;
ADOQuery1.Next;
end;
end;
//-----------------
ProgressBar1.Visible:=False;
end;

موفق باشید ...

Felony
پنج شنبه 06 آبان 1389, 06:18 صبح
با سلام :لبخندساده:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from Table1 where jensiat like '''+ComboBox1.Text+'''');
ADOQuery1.Active:=True;
//-----------
ProgressBar1.Visible:=True;

with ProgressBar1 do
begin
Min := 0;
Max := 100;
Max := ADOQuery1.RecordCount;
ADOQuery1.First;
for i := Min to Max do
begin
Position := i;
ADOQuery1.Next;
end;
end;
//-----------------
ProgressBar1.Visible:=False;
end;

موفق باشید ...
کدی که قرار دادید روی رکوردهای بانک حرکت میکنه و وضعیت ProgressBar رو تعیین میکنه ، ربطی به نمایش روند جست و جو نداره .

khoshblagh
پنج شنبه 06 آبان 1389, 08:01 صبح
کدی که قرار دادید روی رکوردهای بانک حرکت میکنه و وضعیت ProgressBar رو تعیین میکنه ، ربطی به نمایش روند جست و جو نداره .
با سلام
جناب تاجیک در صورت امکان کد صحیح را با نمونه مانند پست 6 ارائه نمائید.متشکرم

smmhch
یک شنبه 16 آبان 1389, 11:08 صبح
سلام
البته شاید دیر شده ولی قبلا هم در مورد فریز شدن برنامه هنگام لود از پایگاه تاپیکی بود.
مشکل اصلی این است که در لحظه ی اجرای query کلیه کارها متوقف میشوند.
س: آیا با نخ ها میشود کاری کرد؟:متفکر:

nilidelphi
سه شنبه 18 آبان 1389, 13:56 عصر
من هم دقیقا می خوام این کار رو انجام بدم ولی هر کدی در در رویداد OnFetchProgress می نویسم اصلا انگار کدی نوشته نشده و اجرا نمیشه و نتیجه ای هم نداره.
و مثل چیزی که دوستمون گفت هر چقدر Help دلفی رو زیررو می کنم چیز بدر بخوری پیدا نمیکنم.
فقط یه جایی تو هلپ گفته شده که یه هندلر باید ساخته بشه.

کسی اگه بتونه کمک کنه ممنون.

nilidelphi
دوشنبه 01 آذر 1389, 11:30 صبح
با سلام خدمت دوستان گرامی

از کاربری که این تاچیک را ساخته نیز تشکر می کنم چون این سوال چندی بود که ذهن من رو مشغول خود کرده بود و من خودم هم در این تاپیک سوالم رو مطرح کردم ولی از دوستان مثل این که کسی از این روش استفاده نکرده بود
من تحقیق کردم و به نتیجه رسیدم و جواب هم داد و برای استفاده ی دوستان هم اینجا میزارمش :
دوستان دقت کنند که تنها کاری که باید انجام دهید اینه که در خاصیت ExecuteOptions (http://docwiki.embarcadero.com/VCL/en/ADODB.TCustomADODataSet.ExecuteOptions)
ویژگی eoAsyncFetch (http://docwiki.embarcadero.com/RADStudio/en/Fetching_Records_Asynchronously) را اضافه می کنید و بعد هم هر کدی در رویداد OnFetchProgress بنویسید اجرا خواهد شد.
اینم یک مثال :





procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
ProgressBar1.Max :=MaxProgress;
ProgressBar1.Position :=Progress;
Application.ProcessMessages;
end;





procedure TّForm1.Button1Click(Sender: TObject);
begin
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('select * from tbl1 where id = '+Edit1.Text);
ExecuteOptions:=[eoAsyncFetch];
Open;
end;
edn;



امیدوارم تونسته باشم کمک کنم.


موفق و موئد باشید.

behzadboloori
یک شنبه 28 آذر 1389, 16:55 عصر
من به یه مشکل دیگه برخورد کردم.
میخواستم ببینم آیا برای هر رکورد یکبار OnFetchProgress اجرا میشه یا نه؟
با کمال تعجب دیدم که برای مثلا 500 تا رکورد فقط دوبار اجرا میشه.
آیا راه حلی وجود داره که برای هر رکورد OnFetchProgress یکبار اجرا بشه؟