画廊(图库)展示

用Intraweb开发图片管理的云平台,其中一个关键的功能是建画廊,根据用户搜索出来的数据,以画廊形式展示这些资料对应的图片。本文记录实际案例,用IWAdvWebGrid展示产品清单的画廊。

一、绘制画廊的代码。变量说明:iID–第几笔记录;iColSum–画廊分几栏展示;sPicFile–图片文件的完整地址;sUrlFile–图文件的URI地址;图片文件NoPhoto.png用于某产品没有图片时的替代图。

procedure TfmwpdPhoto.myDrawGrid;
var
  iID,iCol,iRow:Integer;
  sPicFile,sUrlFile,sValue:String;
begin
  awGrid.ClearCells;
  qMaster.First;
  awGrid.TotalRows:=ceil(qMaster.RecordCount/iColSum);
  awGrid.RowCount:=awGrid.TotalRows;
  iID:=0;
  iCol:=0;
  iRow:=0;
  while not qMaster.Eof do
  begin
    iCol:=(iID mod iColSum);
    iRow:=floor(iID/iColSum);
    sValue:=qMaster.FieldByName('RecId').AsString+'.jpg';
    sPicFile:=IWServerController.ContentPath+'ProdFiles\'+sValue;
    if FileExists(sPicFile) then
      sUrlFile:='/ProdFiles/'+sValue
    else
      sUrlFile:='/ProdFiles/NoPhoto.png';
    sValue:='';
    sValue:=sValue+' <img data-id="'+qMaster.FieldByName('RecId').AsString+'"';
    sValue:=sValue+' title="电压V:'+qMaster.FieldByName('pdVoltage').AsString;
    sValue:=sValue+' 功率w:'+qMaster.FieldByName('pdPower').AsString;
    sValue:=sValue+' 风量ft:'+qMaster.FieldByName('pdWindVol').AsString;
    sValue:=sValue+' 风重g:'+qMaster.FieldByName('pdWindNW').AsString;
    sValue:=sValue+' 噪音dB:'+qMaster.FieldByName('pdNoise').AsString+'"';
    sValue:=sValue+' src="'+sUrlFile+'" width="232" height="232" style="margin:0px;">';
    sValue:=sValue+'<br>'+qMaster.FieldByName('pdNum').AsString;
    sValue:=sValue+' '+qMaster.FieldByName('pdType').AsString;
    awGrid.AsyncSetCell(iCol,iRow,sValue);
    qMaster.Next;
    iID:=iID+1;
  end;
  if awGrid.TotalRows>5 then awGrid.RowCount:=5;
  awGrid.AsyncUpdateAllCells;
end;

二、PC用户端点击图片,展示产品完整图片及产品详细信息的代码

procedure TfmwpdPhoto.awGridAsyncLinkClick(Sender: TObject;
  EventParams: TStringList; RowIndex, ColumnIndex: Integer);
var
  sValue,sLine:String;
  i1,i2:Integer;
  slData:TStringList;
  sFileName,sTmpFile,sTmpUrl:String;
begin
  inherited;
  sValue:=awGrid.Cells[ColumnIndex,RowIndex];
  sValue:=StringReplace(sValue,' ','',[rfReplaceAll]);
  i1:=14;
  i2:=pos('title=',sValue);
  sValue:=copy(sValue,i1,i2-i1-1);
  qMaster.Locate('RecId',sValue,[]);
  slData:=TStringList.Create;
  slData.Add('<!DOCTYPE html><html><head>');
  slData.Add('<title>产品细节@产品管理</title>');
  slData.Add('<style>img{margin:0 20px;}</style></head>');
  sLine:='<img src="/ProdFiles/'+qMaster.FieldByName('RecId').AsString+'.jpg" align="left">';
  slData.Add(sLine);
  sLine:='<p>编号:'+qMaster.FieldByName('pdNum').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>類型:'+qMaster.FieldByName('pdType').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>日期:'+qMaster.FieldByName('pdDate').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>品牌:'+qMaster.FieldByName('pdBrand').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>型号:'+qMaster.FieldByName('pdDesc').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>电压:'+qMaster.FieldByName('pdVoltage').AsString+'V</p>';
  slData.Add(sLine);
  sLine:='<p>功率:'+qMaster.FieldByName('pdPower').AsString+'W</p>';
  slData.Add(sLine);
  sLine:='<p>风量:'+qMaster.FieldByName('pdWindVol').AsString+'ft/min</p>';
  slData.Add(sLine);
  sLine:='<p>风重:'+qMaster.FieldByName('pdWindNW').AsString+'g</p>';
  slData.Add(sLine);
  sLine:='<p>噪音:'+qMaster.FieldByName('pdNoise').AsString+'dB</p>';
  slData.Add(sLine);
  sLine:='<p>存放:'+qMaster.FieldByName('pdLocation').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>备注:'+qMaster.FieldByName('Remark').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<p>规格:'+qMaster.FieldByName('pdSpecs').AsString+'</p>';
  slData.Add(sLine);
  sLine:='<br><a rel="nofollow" href="javascript:window.close()">【关闭】</a >';
  slData.Add(sLine);
  sLine:='</body></html>';
  slData.Add(sLine);
  sFileName:=UserSession.sys_UsID + FormatDateTime('HHMMSS',now())+'.html';
  sTmpFile:=webApplication.UserCacheDir+sFileName;
  if FileExists(sTmpFile) then SysUtils.DeleteFile(sTmpFile);
  slData.SaveToFile(sTmpFile,TEncoding.UTF8);
  slData.Free;
  sTmpUrl:=StringReplace(sTmpFile,IWServerController.ContentPath,'/',[]);
  webApplication.NewWindow(sTmpUrl);
end;

三、手机端点击图片,展示产品完整图片及产品详细信息的代码

procedure TfmmpdPhoto.awGridAsyncLinkClick(Sender: TObject;
  EventParams: TStringList; RowIndex, ColumnIndex: Integer);
var
  sValue,sLine:String;
  i1,i2:Integer;
  slData:TStringList;
begin
  inherited;
  sValue:=awGrid.Cells[ColumnIndex,RowIndex];
  sValue:=StringReplace(sValue,' ','',[rfReplaceAll]);
  i1:=14;
  i2:=pos('title=',sValue);
  sValue:=copy(sValue,i1,i2-i1-1);
  qMaster.Locate('RecId',sValue,[]);
  UserSession.sys_Value1:=sValue; //记录ID
  slData:=TStringList.Create;
  slData.Add('<table border="0" width="100%"><tr>');
  sLine:='<th width="50%"></th><th width="50%"></th>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'编号:'+qMaster.FieldByName('pdNum').AsString+'</td>';
  sLine:=sLine+'<td>'+'类型:'+qMaster.FieldByName('pdType').AsString+'</td></tr>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'品牌:'+qMaster.FieldByName('pdBrand').AsString+'</td>';
  sLine:=sLine+'<td>'+'型号:'+qMaster.FieldByName('pdDesc').AsString+'</td></tr>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'电压:'+qMaster.FieldByName('pdVoltage').AsString+'V</td>';
  sLine:=sLine+'<td>'+'功率:'+qMaster.FieldByName('pdPower').AsString+'W</td></tr>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'风量:'+qMaster.FieldByName('pdWindVol').AsString+'ft/min</td>';
  sLine:=sLine+'<td>'+'风重:'+qMaster.FieldByName('pdWindNW').AsString+'g</td></tr>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'噪音:'+qMaster.FieldByName('pdNoise').AsString+'dB</td>';
  sLine:=sLine+'<td>'+'存放:'+qMaster.FieldByName('pdLocation').AsString+'</td></tr>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'日期:'+qMaster.FieldByName('pdDate').AsString+'</td>';
  sLine:=sLine+'<td>'+'RecId:'+qMaster.FieldByName('RecID').AsString+'</td></tr>';
  slData.Add(sLine);
  sLine:='<tr><td>'+'备注:'+qMaster.FieldByName('Remark').AsString+'</td>';
  sLine:=sLine+'<td>'+'规格:'+qMaster.FieldByName('pdSpecs').AsString+'</td></tr>';
  slData.Add(sLine);
  slData.Add('</table>');
  UserSession.sys_Value2:=slData.Text;
  TfmmpdProd.Create(webApplication).Show;
end;
procedure TfmmpdProd.IWAppFormCreate(Sender: TObject);
var
  jpg:TJpegImage;
  sFile:String;
begin
  regBack.Align:=alClient;
  self.ExtraHeader.Clear;
  self.ExtraHeader.Add(UserSession.sys_ExtraHeader);
  imfProd.ImageFile.URL:='ProdFiles/'+UserSession.sys_Value1+'.jpg';
  hlbProd.HTMLText:=UserSession.sys_Value2;
  dRate:=1;
  sFile:=IWServerController.sys_AppPath+'wwwroot\ProdFiles\'+UserSession.sys_Value1+'.jpg';
  if not FileExists(sFile) then exit;
  jpg:=TJpegImage.Create;
  try
    jpg.LoadFromFile(sFile);
    dRate:=(jpg.Height*100/jpg.Width)/100;
  finally
    jpg.Free;
  end;
end;

渲染时指定一下图片的高度

procedure TfmmpdProd.IWAppFormRender(Sender: TObject);
begin
  imfProd.Height:=trunc(imfProd.Width*dRate);  //按比例缩放
end;

发表评论