亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? untactreport.~pas

?? 飛思科技的書不錯
?? ~PAS
?? 第 1 頁 / 共 5 頁
字號:
      strTemp := TQRExpr(bandDetail.Controls[i]).Expression;
      StripFieldName(strTemp);
      lstFieldNames.Add(strTemp);
    end;
  if lstFieldNames.Count = 0 then begin
    lstFieldNames.Free;
    Exit;
  end;

  posPre := -1;
  idxName := -1;
  idxNextField := -1;
  for i := 0 to bandDetail.ControlCount - 1 do
    if bandDetail.Controls[i] is TQRShape then
      with TQRShape(bandDetail.Controls[i]) do
        if Shape <> qrsVertLine then
          Continue
        else if posPre < 0 then
          posPre := 0
        else begin
          posCur := Size.Left;
          Inc(idxName);
          FindIndex(m_strlstFieldNames, lstFieldNames.Strings[idxName], idxNextField);
          if idxNextField = -1 then
            Break;
          m_dlstFieldWidths[idxNextField] := posCur - posPre;
          posPre := posCur;
        end;
  lstFieldNames.Free;
end;

procedure TActReport.ParamsFromReport;
begin
  if not m_bReportReady then
    Exit;
  GlobalParamsFromReport;
  FieldParamsFromReport;
end;

procedure TActReport.GlobalParamsFromForm;
var
  tmpInt: Integer;
begin
  GetEditValueByName(m_grpGlobalContainer, 'edtPaperWidth',
                     m_nPageWidth);
  GetEditValueByName(m_grpGlobalContainer, 'edtPaperHeight',
                     m_nPageHeight);
  GetComboValueByName(m_grpGlobalContainer, 'cmbPageOrientation',
                      tmpInt);
  m_oriPage := TPrinterOrientation(tmpInt);
  GetEditValueByName(m_grpGlobalContainer, 'edtPageHorMargin',
                     m_dPageHorMargin);
  GetEditValueByName(m_grpGlobalContainer, 'edtPageVertMargin',
                     m_dPageVertMargin);
  GetComboValueByName(m_grpGlobalContainer, 'cmbReportAlign',
                      tmpInt);
  m_alnReport := TAlign(tmpInt);
  GetCheckValueByName(m_grpGlobalContainer, 'chkFrameLine',
                      m_bHasFrameLine);
  GetCheckValueByName(m_grpGlobalContainer, 'chkSummary',
                      m_bHasSummary);
  GetEditValueByName(m_grpGlobalContainer, 'edtTitle',
                     m_strTitle);
  GetEditValueByName(m_grpGlobalContainer, 'edtTitleHeight',
                     m_dTitleHeight);
  GetRadioValueByName(m_grpGlobalContainer, 'grpHeaderAlign',
                      tmpInt);
  m_alnHeader := TAlign(tmpInt);
  GetEditValueByName(m_grpGlobalContainer, 'edtHeaderHeight',
                     m_dHeaderHeight);
  GetEditValueByName(m_grpGlobalContainer, 'edtDetailHeight',
                     m_dDetailHeight);
  GetEditValueByName(m_grpGlobalContainer, 'edtDetailMargin',
                     m_dDetailMargin);
end;

procedure TActReport.FieldParamsFromForm;
var
  i: Integer;
  tempStr: string;
  tmpInt: Integer;
begin
  for i := 0 to m_nFieldCount - 1 do begin
    GetCheckValue(m_chklstDisplay, i, m_blstDisplay[i]);
    GetEditValue(m_edtlstWidths, i, m_dlstFieldWidths[i]);
    GetEditValue(m_edtlstDispNames, i, tempStr);
    m_strlstDispNames.Strings[i] := tempStr;
    GetComboValue(m_cmblstAlign, i, tmpInt);
    m_alnlstFields[i] := TAlign(tmpInt);
    GetCheckValue(m_chklstSummary, i, m_blstSummary[i]);
  end;
end;

procedure TActReport.ParamsFromForm;
begin
  if not m_bPrepared then
    Exit;
  GlobalParamsFromForm;
  FieldParamsFromForm;
end;

procedure TActReport.GlobalParamsToForm;
begin
  SetEditValueByName(m_grpGlobalContainer, 'edtPaperWidth',
                     m_nPageWidth);
  SetEditValueByName(m_grpGlobalContainer, 'edtPaperHeight',
                     m_nPageHeight);
  SetComboValueByName(m_grpGlobalContainer, 'cmbPageOrientation',
                      Integer(m_oriPage));
  SetEditValueByName(m_grpGlobalContainer, 'edtPageHorMargin',
                     m_dPageHorMargin);
  SetEditValueByName(m_grpGlobalContainer, 'edtPageVertMargin',
                     m_dPageVertMargin);
  SetComboValueByName(m_grpGlobalContainer, 'cmbReportAlign',
                      Integer(m_alnReport));
  SetCheckValueByName(m_grpGlobalContainer, 'chkFrameLine',
                      m_bHasFrameLine);
  SetCheckValueByName(m_grpGlobalContainer, 'chkSummary',
                      m_bHasSummary);
  SetEditValueByName(m_grpGlobalContainer, 'edtTitle',
                     m_strTitle);
  SetEditValueByName(m_grpGlobalContainer, 'edtTitleHeight',
                     m_dTitleHeight);
  SetRadioValueByName(m_grpGlobalContainer, 'grpHeaderAlign',
                      Integer(m_alnHeader));
  SetEditValueByName(m_grpGlobalContainer, 'edtHeaderHeight',
                     m_dHeaderHeight);
  SetEditValueByName(m_grpGlobalContainer, 'edtDetailHeight',
                     m_dDetailHeight);
  SetEditValueByName(m_grpGlobalContainer, 'edtDetailMargin',
                     m_dDetailMargin);
  btnTitleFont.Font.Assign(m_fntTitle);
  btnHeaderFont.Font.Assign(m_fntHeader);
  btnDetailFont.Font.Assign(m_fntDetail);
end;

procedure TActReport.FieldParamsToForm;
var
  i: Integer;
begin
  for i := 0 to m_nFieldCount - 1 do begin
    SetCheckValue(m_chklstDisplay, i, m_blstDisplay[i]);
    SetEditValue(m_edtlstFieldNames, i, m_strlstFieldNames.Strings[i]);
    SetEditValue(m_edtlstWidths, i, m_dlstFieldWidths[i]);
    SetEditValue(m_edtlstDispNames, i, m_strlstDispNames.Strings[i]);
    SetComboValue(m_cmblstAlign, i, Integer(m_alnlstFields[i]));
    SetCheckValue(m_chklstSummary, i, m_blstSummary[i]);
  end;
end;

procedure TActReport.ParamsToForm;
begin
  if not m_bPrepared then
    Exit;
  GlobalParamsToForm;
  FieldParamsToForm;
end;

procedure TActReport.GlobalParamsFromFile(stream: TFileStream);
begin
  stream.Read(m_nPageWidth, SizeOf(m_nPageWidth));
  stream.Read(m_nPageHeight, SizeOf(m_nPageHeight));
  stream.Read(m_oriPage, SizeOf(m_oriPage));
  stream.Read(m_dPageHorMargin, SizeOf(m_dPageHorMargin));
  stream.Read(m_dPageVertMargin, SizeOf(m_dPageVertMargin));
  stream.Read(m_alnReport, SizeOf(m_alnReport));
  stream.Read(m_bHasFrameLine, SizeOf(m_bHasFrameLine));
  stream.Read(m_bHasSummary, SizeOf(m_bHasFrameLine));
  ReadString(stream, m_strTitle);
  stream.Read(m_dTitleHeight, SizeOf(m_dTitleHeight));
  ReadFont(stream, m_fntTitle);
  stream.Read(m_alnHeader, SizeOf(m_alnHeader));
  stream.Read(m_dHeaderHeight, SizeOf(m_dHeaderHeight));
  ReadFont(stream, m_fntHeader);
  stream.Read(m_dDetailHeight, SizeOf(m_dDetailHeight));
  stream.Read(m_dDetailMargin, SizeOf(m_dDetailMargin));
  ReadFont(stream, m_fntDetail);
end;

procedure TActReport.FieldParamsFromFile(stream: TFileStream);
var
  i: Integer;
  cntFieldsInFile: Integer;
  cntFieldsRead: Integer;
  tempStr: string;
begin
  stream.Read(cntFieldsInFile, SizeOf(cntFieldsInFile));
  cntFieldsRead := Min(cntFieldsInFile, m_nFieldCount);
  for i := 0 to cntFieldsRead - 1 do begin
    stream.Read(m_blstDisplay[i], SizeOf(m_blstDisplay[i]));
    stream.Read(m_dlstFieldWidths[i], SizeOf(m_dlstFieldWidths[i]));
    ReadString(stream, tempStr);
    m_strlstDispNames[i] := tempStr;
    stream.Read(m_alnlstFields[i], SizeOf(m_alnlstFields[i]));
    stream.Read(m_blstSummary[i], SizeOf(m_blstSummary[i]));
  end;
  for i := cntFieldsRead to m_nFieldCount - 1 do begin
    m_blstDisplay[i] := True;
    m_dlstFieldWidths[i] := c_band_width;
    m_strlstDispNames.Add(m_dstActive.FieldDefs[i].Name);
    m_alnlstFields[i] := a_left;
    m_blstSummary[i] := False;
  end;
end;

procedure TActReport.ParamsFromFile(strFileName: string);
var
  stream: TFileStream;
  strFileHeader: string;
begin
  if not m_bPrepared then
    Exit;
  try
    stream := TFileStream.Create(strFileName, fmOpenRead);
  except
    // ShowMessage('file load error : ' + strFileName);
    Exit
  end;

  ReadString(stream, strFileHeader);
  if strFileHeader = c_file_id then begin
    GlobalParamsFromFile(stream);
    FieldParamsFromFile(stream);
  end;
  stream.Destroy;
end;

procedure TActReport.GlobalParamsToFile(stream: TFileStream);
begin
  stream.Write(m_nPageWidth, SizeOf(m_nPageWidth));
  stream.Write(m_nPageHeight, SizeOf(m_nPageHeight));
  stream.Write(m_oriPage, SizeOf(m_oriPage));
  stream.Write(m_dPageHorMargin, SizeOf(m_dPageHorMargin));
  stream.Write(m_dPageVertMargin, SizeOf(m_dPageVertMargin));
  stream.Write(m_alnReport, SizeOf(m_alnReport));
  stream.Write(m_bHasFrameLine, SizeOf(m_bHasFrameLine));
  stream.Write(m_bHasSummary, SizeOf(m_bHasFrameLine));
  WriteString(stream, m_strTitle);
  stream.Write(m_dTitleHeight, SizeOf(m_dTitleHeight));
  WriteFont(stream, m_fntTitle);
  stream.Write(m_alnHeader, SizeOf(m_alnHeader));
  stream.Write(m_dHeaderHeight, SizeOf(m_dHeaderHeight));
  WriteFont(stream, m_fntHeader);
  stream.Write(m_dDetailHeight, SizeOf(m_dDetailHeight));
  stream.Write(m_dDetailMargin, SizeOf(m_dDetailMargin));
  WriteFont(stream, m_fntDetail);
end;

procedure TActReport.FieldParamsToFile(stream: TFileStream);
var
  i: Integer;
begin
  stream.Write(m_nFieldCount, SizeOf(m_nFieldCount));
  for i := 0 to m_nFieldCount - 1 do begin
    stream.Write(m_blstDisplay[i], SizeOf(m_blstDisplay[i]));
    stream.Write(m_dlstFieldWidths[i], SizeOf(m_dlstFieldWidths[i]));
    WriteString(stream, m_strlstDispNames[i]);
    stream.Write(m_alnlstFields[i], SizeOf(m_alnlstFields[i]));
    stream.Write(m_blstSummary[i], SizeOf(m_blstSummary[i]));
  end;
end;

procedure TActReport.ParamsToFile(strFileName: string);
var
  stream: TFileStream;
begin
  if not m_bPrepared then
    Exit;
  try
    stream := TFileStream.Create(strFileName, fmCreate);
  except
    ShowMessage('file save error : ' + strFileName);
    Exit;
  end;

  WriteString(stream, c_file_id);
  GlobalParamsToFile(stream);
  FieldParamsToFile(stream);
  stream.Destroy;
end;

function TActReport.BuildRep(strTitle: String;
                             bHasFrameLine: Boolean;
                             bHasSummary: Boolean;
                             nPageWidth, nPageHeight: Integer;
                             oriPage: TPrinterOrientation;
                             alnHeader: TAlign;
                             dHeightTitle, dHeightHeader, dHeightDetail: Currency;
                             dDetailMargin: Currency;
                             nSegbarWidth: Integer;
                             dPageHorMargin, dPageVertMargin: Currency;
                             fntTitle, fntHeader, fntDetail: TFont;
                             dftPageWidth, dftPageHeight: Integer;
                             dftWidth, dftHeight, dftMargin: Currency;
                             dftPageHorMargin, dftPageVertMargin: Currency;
                             lstIdxs: TIndexList;
                             lstDispNames: TStringList;
                             lstWidths: TCurrencyList;
                             lstAlign: TAlignList;
                             lstSummary: TBooleanList;
                             alnReport: TAlign)
                             : Boolean;
var
  i: Integer;
  tmpSize: TQRPrintableSize;

  upFields, initupFields: Integer;
  tmpStr: string;
  lstFieldNames: TStringList;

  posx: Currency;
  idxSummary: Integer;
  bandTitle, bandHeader, bandDetail, bandSummary: TQRCustomBand;

  sizeReportPos: TQRPrintableSize;
begin
  Result := False;
  ResetRep;
  // if dataset not prepared, return false
  if not m_bPrepared then
    Exit;

  upFields := High(lstIdxs);
  DefaultIfZero(nPageWidth, dftPageWidth);
  DefaultIfZero(nPageHeight, dftPageHeight);
  DefaultIfZero(dHeightTitle, dftHeight);
  DefaultIfZero(dHeightHeader, dftHeight);
  DefaultIfZero(dHeightDetail, dftHeight);
  DefaultIfZero(dDetailMargin, dftMargin);
  for i := 0 to upFields do
    DefaultIfZero(lstWidths[i], dftWidth);
  DefaultIfZero(dPageHorMargin, dftPageHorMargin);
  DefaultIfZero(dPageVertMargin, dftPageVertMargin);

  m_strTitle := strTitle;
  m_bHasFrameLine := bHasFrameLine;
  m_bHasSummary := bHasSummary;
  lstFieldNames := TStringList.Create;
  for i := 0 to upFields do
    lstFieldNames.Add(m_dstActive.FieldDefs[lstIdxs[i]].Name);
  // create the report
  QRCreateList(m_rptActive, nil, m_dstActive,
               strTitle, lstFieldNames);

  with m_rptActive.Page do begin
    PaperSize := Custom;
    Width := nPageWidth;
    Length := nPageHeight;
    Orientation := oriPage;
  end;

  with m_rptActive.Bands do begin
    HasPageHeader := False;
    HasPageFooter := False;
    bandTitle := TitleBand;
    bandHeader := ColumnHeaderBand;
    bandDetail := DetailBand;
    HasSummary := bHasSummary;
    bandSummary := SummaryBand;

    bandTitle.Size.Height := dHeightTitle;
    bandHeader.Size.Height := dHeightHeader;
    bandHeader.Height := bandHeader.Height + nSegbarWidth;
    bandDetail.Size.Height := dHeightDetail;
    if bHasSummary then begin
      bandSummary.Size.Width := bandDetail.Size.Width;
      bandSummary.Size.Height := bandDetail.Size.Height;
      bandSummary.Height := bandSummary.Height + nSegbarWidth;
    end;
  end;

  TQRLabel(bandTitle.Controls[0]).ParentFont := True;
  bandTitle.Font.Assign(fntTitle);
  bandHeader.Font.Assign(fntHeader);
  bandDetail.Font.Assign(fntDetail);
  if bHasSummary then
    bandSummary.Font.Assign(fntDetail);

  // delete created fields
  // because QuickReport does not create the fields with the
  //  correct order!
  initupFields := bandHeader.ControlCount - 1;
  for i := 0 to initupFields do begin
    bandHeader.Controls[0].Free;
    bandDetail.Controls[0].Free;
  end;

  // create the fields
  for i := 0 to upFields do begin
    with TQRLabel.Create(bandHeader) do begin
      Parent := bandHeader;
      AutoSize := True;
      Caption := lstDispNames[i];
    end;
    with TQRExpr.Create(bandDetail) do begin
      Parent := bandDetail;
      AutoSize := True;
      tmpStr := lstFieldNames.Strings[i];
      StripFieldName(tmpStr, False);
      Expression := tmpStr;
    end;
  end;

  // create the summary items here
  if bHasSummary then
    for i := 0 to upFields do
      if lstSummary[i] then
        with TQRExpr.Create(bandSummary) do begin
          Parent := bandSummary;
          AutoSize := True;
          Expression := 'Sum(' + lstFieldNames[i] + ')';
        end;
  lstFieldNames.Free;

  // set the items' pos
  posx := 0;
  idxSummary := 0;
  for i := 0 to upFields do begin
    with TQRLabel(bandHeader.Controls[i]) do begin
      AutoSize := False;
      tmpSize := Size;
      SetPosition(tmpSize, posx, lstWidths[i], dHeightHeader,
                  alnHeader, dDetailMargin);
      Size := tmpSize;
      Alignment := CustomToStandardAlign(alnHeader);
    end;
    with TQRExpr(bandDetail.Controls[i]) do begin
      AutoSize := False;
      tmpSize := Size;
      SetPosition(tmpSize, posx, lstWidths[i], dHeightDetail,
                  lstAlign[i], dDetailMargin);
      Size := tmpSize;
      Alignment := CustomToStandardAlign(lstAlign[i]);
    end;
    if bHasSummary and lstSummary[i] then
      with TQRExpr(bandSummary.Controls[idxSummary]) do begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产激情视频一区二区在线观看 | 韩日av一区二区| 91 com成人网| 青青草原综合久久大伊人精品优势 | 91天堂素人约啪| 亚洲激情男女视频| 欧美日韩一区二区三区在线 | 欧美在线一区二区| 日韩高清不卡一区二区| 精品国产一区二区三区忘忧草| 国产一区视频导航| √…a在线天堂一区| 欧美午夜精品久久久久久超碰 | 欧美日韩一区久久| 精品无人码麻豆乱码1区2区 | 久久日一线二线三线suv| 成人精品视频一区二区三区 | 国产欧美日韩视频在线观看| 色婷婷综合久久久久中文| 午夜不卡在线视频| 国产亚洲va综合人人澡精品| 色综合一区二区三区| 三级久久三级久久| 久久久精品综合| 欧美性猛交一区二区三区精品 | 国产成人亚洲综合a∨婷婷| 亚洲视频1区2区| 日韩欧美一区在线| 99re热视频精品| 美女视频黄久久| 亚洲视频一区二区免费在线观看| 911国产精品| 国产成人免费在线| 九一久久久久久| 成人久久久精品乱码一区二区三区| 国产成人精品www牛牛影视| 在线免费观看视频一区| 日韩高清一级片| 日本一区二区三区电影| 欧美系列在线观看| 风间由美性色一区二区三区| 日韩在线一区二区| 18成人在线观看| 久久久久99精品一区| 欧美精品视频www在线观看 | 亚洲黄色小视频| 久久精品在这里| 91精品国产综合久久香蕉的特点| aaa亚洲精品| 国产一级精品在线| 免费在线观看日韩欧美| 欧洲激情一区二区| 国产乱一区二区| 亚洲精品videosex极品| 亚洲天堂福利av| 欧美日韩激情一区二区三区| 国内精品久久久久影院色 | 不卡高清视频专区| 日韩精品色哟哟| 国产精品情趣视频| 久久久精品黄色| 欧美成人一区二区| 欧美一区二区久久久| 欧美日韩精品欧美日韩精品一| jlzzjlzz欧美大全| 国产精品亚洲一区二区三区妖精| 久久精品国产99| 日产国产高清一区二区三区| 午夜精品福利一区二区三区av| 一区二区三区国产豹纹内裤在线| 一区二区三区蜜桃网| 激情综合色综合久久综合| 亚洲v精品v日韩v欧美v专区| 精品日韩一区二区三区免费视频| 青青草国产精品97视觉盛宴| 一区二区三区精品| 亚洲精品国产一区二区精华液 | 久久超碰97人人做人人爱| 午夜影院久久久| 亚洲电影激情视频网站| 天天综合天天综合色| 日本aⅴ亚洲精品中文乱码| 日日夜夜精品视频天天综合网| 亚洲va天堂va国产va久| 午夜不卡av在线| 国产精品一区三区| 日本三级亚洲精品| 亚洲综合小说图片| 自拍偷拍国产精品| 亚洲精品国产第一综合99久久 | 在线这里只有精品| 欧美影院一区二区| 欧美日韩一区二区在线观看| 91.com在线观看| 日韩免费一区二区三区在线播放| 欧美刺激午夜性久久久久久久| 精品剧情在线观看| 国产人成亚洲第一网站在线播放| 国产精品卡一卡二| 一区二区三区免费看视频| 免费黄网站欧美| 国产成人自拍高清视频在线免费播放| 成人美女视频在线观看| 日本高清不卡在线观看| 欧美一区二区美女| 亚洲猫色日本管| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲成人777| 免费观看91视频大全| 国产一区二区三区久久久| 91玉足脚交白嫩脚丫在线播放| 欧美三级电影在线看| 日韩无一区二区| 国产精品免费aⅴ片在线观看| 亚洲一区影音先锋| 国产综合久久久久久鬼色| 色婷婷综合久久久久中文| 日韩欧美国产午夜精品| 亚洲欧洲一区二区三区| 日本不卡不码高清免费观看| 成人午夜电影久久影院| 69久久99精品久久久久婷婷 | 久久久青草青青国产亚洲免观| 亚洲丝袜自拍清纯另类| 极品尤物av久久免费看| 在线观看不卡一区| 中国av一区二区三区| 久久精品国产亚洲aⅴ| 色菇凉天天综合网| 国产日韩精品一区二区三区 | 国产日韩欧美综合一区| 中文字幕一区二区三区色视频 | 激情图片小说一区| 色综合久久综合中文综合网| 日韩欧美成人午夜| 一区二区在线免费观看| 国产成人精品午夜视频免费 | 91网站最新网址| 久久精品视频一区二区| 日日夜夜精品视频免费| 欧美自拍偷拍一区| 亚洲国产精品激情在线观看| 久久超碰97中文字幕| 6080yy午夜一二三区久久| 亚洲精品久久7777| 99久久综合狠狠综合久久| 久久久久久久电影| 美女视频一区在线观看| 欧美日韩一区高清| 亚洲午夜日本在线观看| 日本高清不卡一区| 亚洲天堂福利av| 99久久精品免费精品国产| 日韩电影免费在线看| 91亚洲永久精品| 精品国产免费一区二区三区香蕉| 亚洲人亚洲人成电影网站色| 国产成人免费视频网站| 日韩视频免费观看高清完整版在线观看| 一级女性全黄久久生活片免费| 99久精品国产| 国产精品成人网| 成人午夜在线免费| 国产精品理伦片| 99久久婷婷国产综合精品| 中文字幕一区日韩精品欧美| 99视频一区二区三区| 亚洲日韩欧美一区二区在线| 91色porny蝌蚪| 亚洲精选一二三| 色哟哟亚洲精品| 亚洲精品一二三| 欧美三级电影网| 免费精品视频在线| 日韩三级在线免费观看| 精品一区二区三区在线播放| 2023国产一二三区日本精品2022| 国产剧情一区在线| 欧美一区二区三区四区视频| 五月婷婷另类国产| 欧美一区二区观看视频| 国产一区中文字幕| 国产精品全国免费观看高清| 色综合久久久久综合体| 亚洲va天堂va国产va久| 欧美一区二区三区免费大片| 激情五月婷婷综合| 国产精品拍天天在线| 色婷婷激情一区二区三区| 日韩高清一级片| 国产欧美中文在线| 91精品福利视频| 美女尤物国产一区| 国产精品久久毛片| 在线中文字幕一区二区| 美女视频黄久久| 亚洲色图制服诱惑| 日韩精品一区在线| 99国产精品久| 久久精品国产精品青草|