我在Delphi XE3中工作。我制作了一个循环,该循环通过一个带有6个选项卡的Pagecontrol,该控件的框架带有许多加载mdb数据的编辑框。
遍历页面时,我为活动选项卡制作了一个“屏幕截图”图像,并将其放置在fastreport图像中。
一切都很好,但是在较慢的计算机上进行测试时,它可以制作所有帧,但尚未加载数据。在转到下一页之前,如何检查所有数据是否已加载到位于选项卡上的框架编辑组件中?
代码如下:
begin
Screen.Cursor := crHourGlass;
p := PageControlKalkyl.ActivePageIndex; // Get page index
for i := 0 to 7 do begin
MyPage := frxReport1.FindObject('Page' + IntToStr(i)) as TfrxPage;
MyPage.Visible := True;
end;
try
for i := 0 to PageControlKalkyl.PageCount - 1 do
If PageControlKalkyl.Pages[i].TabVisible then
Begin
PageControlKalkyl.ActivePageIndex := i;
PageControlKalkyl.ActivePage.Repaint;
Bilder := 'Pic' + IntToStr(i);
if FLaddardata = False then //Check if page changed
Try
Bitmap := TBitmap.Create;
Assert(HandleAllocated);
DC := GetWindowDC(Handle);
Win32Check(DC <> 0);
Bitmap.SetSize(Width, Height);
Win32Check(BitBlt(Bitmap.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY));
//Load data in to Images in Fastreport
if PageControlKalkyl.ActivePageIndex > 0 then
Begin
Ver:= 'Version NR: ' + Trim(DataModuleTrakop.ADOTableKALKYL.FieldByName('VERSION').AsString);
Raid:= 'Kalkyl ID: ' + Trim(DataModuleTrakop.ADOTableKALKYL.FieldByName('DENH').AsString);
RepImage := frxReport1.FindObject('Pic'+IntTostr(i)) as TfrxPictureView;
RepImage.Picture.Assign(Bitmap);
Rappid := frxReport1.FindObject('Rapdata' + IntToStr(i)) as TfrxMemoView;
Rappid.Font.Style:= [fsBold];
Rappid.Text := Ver +' '+Raid;
end;
Finally
ReleaseDC(Handle, DC);
Bitmap.Free;
End;
end
else
begin
MyPage := frxReport1.FindObject('Page' + IntToStr(i)) as TfrxPage;
MyPage.Visible := False;
end;
if Fskaparapport = True then
begin
Fskaparapport := False;
frxReport1.PrepareReport;
if FEpost = False then
frxReport1.ShowPreparedReport;
Screen.Cursor := crDefault;
end;
PageControlKalkyl.ActivePageIndex := p;
except
on E: Exception do
ShowMessage(E.Message);
end;
end;
由于您正在使用TADOTable
,我怀疑您的表已配置为异步操作。
这可以通过 property ExecuteOptions: TExecuteOptions;
当然,如果您设置ExecuteOptions := [];
,您的数据应该同步加载,但是具有阻塞UI的令人不快的副作用。
“更友好”的选项将是挂接OnFetchComplete事件,该事件按如下方式进行缩放: procedure (DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus) of object;
具体细节要求您提供有关您要达到的目标的更多信息。你可以:
OnFetchComplete
处理程序中调用报告方法。TSimpleEvent
),并在OnFetchComplete
处理程序中向事件发出信号。然后,其他代码可以简单地调用WaitFor
方法阻塞代码,直到发出事件信号为止。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句