2023年11月28日 星期二

在表單底下空白處,使用LoopBand填滿表格

報表情境1 (未使用GroupBand)


procedure TForm1.DetailBand1AfterPrint(Sender: TQRCustomBand;  BandPrinted: Boolean);
var iCurrencyY, iPaperLength, iPrintY, iCount, iLoopBandHeight, iBottomMargin,
  iPageFooterBand, iQRGroupFooter:Integer;
begin
  //檢查最後一筆
  if ADOQuery1.RecNo=ADOQuery1.RecordCount then
  begin
    iPaperLength := QuickRep1.QRPrinter.PaperLength;  //報表高度
    iCurrencyY := QuickRep1.CurrentY;  //目前輸出的高度
    iLoopBandHeight := Ceil(QRLoopBand1.Size.Length);  //LoopBand 的高度
    iPageFooterBand := Ceil(PageFooterBand1.Size.Length);  //PageFooterBand 的高度
    iBottomMargin := Ceil(QuickRep1.Page.BottomMargin);  //報表邊界Bottom的高度
    iPrintY := iPaperLength - iCurrencyY - iPageFooterBand - iBottomMargin; //LoopBand 輸出的高度
    iCount := iPrintY div iLoopBandHeight;
    QRLoopBand1.PrintCount := iCount;
end;




 報表情境2 (使用GroupBand)



procedure TForm1.QuickRep2StartPage(Sender: TCustomQuickRep);
begin
  //在報表上放置QRExpr1,借來運算QRGroup.Expression運算後的結果
  QRExpr1.Expression := QRGroup2.Expression;
  QRExpr1.Enabled := False;
end;


procedure TForm1.DetailBand1AfterPrint(Sender: TQRCustomBand; BandPrinted: Boolean);
var iCurrencyY, iPaperLength, iPrintY, iCount, iLoopBandHeight, iBottomMargin,
  iPageFooterBand, iQRGroupFooter:Integer;
  sCurValue, sNextValue:String;
begin
  //取得目前以及下一筆資料的運算結果做比對
  sCurValue := QRExpr1.Value.StringVal;
  adoQuery1.Next;
  sNextValue := sCurValue;
  if not adoQuery1.eof then
  begin
    sNextValue := QRExpr1.Value.StringVal;
    adoquery1.Prior;
  end;

  //如果是最後一筆,或是前後筆資料不吻合,就使用LoopBand填滿
  iCount := 0;
  if (ADOQuery1.RecNo=ADOQuery1.RecordCount) or (sCurValue<>sNextValue) then
  begin
    iPaperLength := QuickRep2.QRPrinter.PaperLength;  //報表高度
    iCurrencyY := QuickRep2.CurrentY;  //目前輸出的高度
    iLoopBandHeight := Ceil(QRLoopBand2.Size.Length);  //LoopBand 的高度
    iQRGroupFooter := Ceil(QRGroupFooter2.Size.Length);  //GroupFooter 的高度
    iPageFooterBand := Ceil(PageFooterBand2.Size.Length);  //PageFooter 的高度
    iBottomMargin := Ceil(QuickRep2.Page.BottomMargin);  //報表邊界Bottom的高度
    iPrintY := iPaperLength - iCurrencyY - iPageFooterBand - iQRGroupFooter - iBottomMargin;
    iCount := iPrintY div iLoopBandHeight;
  end;
  QRLoopBand2.PrintCount := iCount;
end;


2023年11月21日 星期二

連線網路磁碟/目錄

Procedure pr_AddConnection(APath, ALocalDriver, AUserName, APassword:String);
var netSource:TNetResource;
  dwResult:DWORD;
  sMsg:String;
begin
  dwResult := WNetCancelConnection2(PWideChar(APath), 
    CONNECT_UPDATE_PROFILE, 
    True);
  if APath<>'' then
  begin
    with netSource do
    begin
      dwType := RESOURCETYPE_DISK;
      lpLocalName := '';  // or H:
      lpRemoteName := PWideChar(APath);
      lpProvider := '';
      dwResult := WNetAddConnection2(netSource, 
        PWideChar(APassword), 
        PWideChar(AUsername), 
        CONNECT_UPDATE_PROFILE);
      if dwResult<>NO_ERROR then
      begin
        sMsg := SysErrorMessage(dwResult);
        raise Exception.Create(sMsg);
      end;
    end;
  end;
end;