// // 退出... procedure TMainForm.Button1Click(Sender: TObject); begin MessageDlg(#13#10+'退出就看不到爽歪歪的新闻了!'+#13#10#13#10+'是否确认退出樵夫新闻速递?' +#13#10, System.UITypes.TMsgDlgType.mtInformation, [ System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo ], 0, procedure(const AResult: TModalResult) begin if AResult = mrYES then begin mbconn.Disconnect; close; end; end); end;
// // 关于... procedure TMainForm.Button2Click(Sender: TObject); var tmpstr: string; begin if mbconn.connect then begin if mba.ReadSimpleResult('select count(*) from todaynews',tmpstr) then ShowMessage('@@@ 樵夫新闻速递 @@@'+#13#10+'版权所有(C) 樵夫工作室' +#13#10#13#10+'[ 当前已有'+tmpstr+'条新闻!]') else ShowMessage('** 无法获取新闻条数 **'); mbconn.Disconnect; end else ShowMessage('** 无法连接应用服务器 **'); end;
// // 查找... procedure TMainForm.Button3Click(Sender: TObject); begin ComboEdit1Change(nil); end;
// // 回退... procedure TMainForm.Button5Click(Sender: TObject); begin if browser.CanGoBack then browser.GoBack; end;
// // 前进... procedure TMainForm.Button6Click(Sender: TObject); begin if browser.CanGoForward then browser.GoForward; end;
// // 刷新... procedure TMainForm.Button7Click(Sender: TObject); begin ComboEdit1Change(nil); end;
// // 清除关键字,重新显示... procedure TMainForm.Button9Click(Sender: TObject); begin edit1.text:=''; ComboEdit1Change(nil); end;
// // 频道切换... procedure TMainForm.ComboEdit1Change(Sender: TObject); var newstype: integer; begin browser.EnableCaching:=false; newstype:=0; if comboedit1.Text='推荐' then newstype:=0; if comboedit1.Text='国内' then newstype:=1; if comboedit1.Text='国际' then newstype:=2; if comboedit1.Text='财经' then newstype:=3; if comboedit1.Text='科技' then newstype:=4; if comboedit1.Text='军事' then newstype:=5; if comboedit1.Text='体育' then newstype:=6; if comboedit1.Text='社会' then newstype:=7; if comboedit1.Text='时尚' then newstype:=8; if comboedit1.Text='娱乐' then newstype:=9; if trim(edit1.Text)='' then browser.Navigate('http://www.quickburro.org/newsdigger/newsdigger.asq' +'?taskid=1&newstype='+inttostr(newstype)) else browser.Navigate('http://www.quickburro.org/newsdigger/newsdigger.asq' +'?taskid=1&newstype='+inttostr(newstype)+'&keyword='+trim(edit1.Text)); browser.EnableCaching:=true; end;
// // 按硬回退时... procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = vkHardwareBack then begin // // 可回退时... if browser.CanGoBack then begin browser.GoBack; key:=0; exit; end; // // 退出程序... key:=0; Button1Click(nil); end; end;
// // 主函数,此函数由应用程序员编写... function MainFunction(InParcel: TQBParcel; OutParcel: TQBParcel): boolean; var ok: boolean; sql: string; tmpstr,newstype,keyword,responsebody: ansistring; AdoConn: TAdoConnection; SysDataset: TAdoDataset; Stream: TMemoryStream; j,taskid: integer; News: NewsRecord; ParamParcel: TQBParcel; begin Stream:=nil; AdoConn:=nil; // // 若无参数... ParamParcel:=TQBParcel.Create; if not InParcel.GetParcelGoods('Parameters',ParamParcel) then begin if assigned(ParamParcel) then freeandnil(ParamParcel); ResponseBody:='<html><body>Invalid web requestion.</body></html>'; try OutParcel.PutAnsiStringGoods('ResponseBody',ResponseBody); result:=true; except result:=false; end; exit; end; // // 分不同功能调用... tmpstr:=ParamParcel.GetAnsiStringGoods('TaskId'); if trim(tmpstr)='' then taskid:=-1 else try taskid:=strtoint(string(tmpstr)); except taskid:=-1; end; case taskid of // // 显示页面... 1: begin // // 取类别、关键词... newstype:=ParamParcel.GetAnsiStringGoods('NewsType'); keyword:=ansistring(utf8tostring(ParamParcel.GetAnsiStringGoods('Keyword'))); if newstype='' then j:=0 else try j:=strtoint(string(newstype)); except j:=0; end; case j of 0: newstype:=''; 1: newstype:='国内'; 2: newstype:='国际'; 3: newstype:='财经'; 4: newstype:='科技'; 5: newstype:='军事'; 6: newstype:='体育'; 7: newstype:='社会'; 8: newstype:='时尚'; 9: newstype:='娱乐'; end; // // 模板文件不存在... if not fileexists(s_defaultdir+'templates\todaynews.qtml') then begin if assigned(ParamParcel) then freeandnil(ParamParcel); ResponseBody:='<html><body>Template file not found.</body></html>'; try OutParcel.PutAnsiStringGoods('ResponseBody',ResponseBody); result:=true; except result:=false; end; exit; end; // // 读入模板... Stream:=TMemoryStream.Create; try Stream.LoadFromFile(s_defaultdir+'templates\todaynews.qtml'); SetLength(ResponseBody,Stream.size); Stream.Position:=0; Stream.Read(ResponseBody[1],Stream.Size); ok:=true; except ok:=false; end; FreeAndNil(Stream); if not ok then begin if assigned(ParamParcel) then freeandnil(ParamParcel); ResponseBody:='<html><body>Read template file failed.</body></html>'; try OutParcel.PutAnsiStringGoods('ResponseBody',ResponseBody); result:=true; except result:=false; end; exit; end; // // 分配数据库连接... AdoConn:=QBServiceAPI.CreateAdoConnection(InParcel,DatabaseId); if AdoConn<>nil then begin // // 生成SQL... if NewsType='' then sql:='' else sql:='SubTypeId='''+string(NewsType)+''''; if keyword<>'' then begin if sql<>'' then sql:=sql+' and '; sql:=sql+'(Title like ''%'+string(keyword)+'%'' or Author like ''%'+string(keyword)+'%'')'; end; if sql='' then sql:='select top 50 * from todaynews order by newsid desc' else sql:='select top 50 * from todaynews where '+sql+' order by newsid desc'; // // 创建对象... SysDataset:=TAdoDataset.Create(nil); SysDataset.DisableControls; SysDataset.Connection:=AdoConn; SysDataset.CommandText:=sql; try SysDataset.Active:=true; ok:=true; except ok:=false; end; // // 输出列表信息... if ok then begin tmpstr:=''; try SysDataset.First; while not SysDataset.Eof do begin news.NewsId:=trim(sysdataset.FieldByName('NewsId').AsString); news.TypeId:=trim(sysdataset.FieldByName('TypeId').AsString); news.SubTypeId:=trim(sysdataset.FieldByName('SubTypeId').AsString); news.Title:=trim(sysdataset.FieldByName('Title').AsString); news.Author:=trim(sysdataset.FieldByName('Author').AsString); news.ThumbUrl1:=trim(sysdataset.FieldByName('ThumbUrl1').AsString); news.ThumbUrl2:=trim(sysdataset.FieldByName('ThumbUrl2').AsString); news.ThumbUrl3:=trim(sysdataset.FieldByName('ThumbUrl3').AsString); news.NewsUrl:=trim(sysdataset.FieldByName('NewsUrl').AsString); news.NewsDate:=trim(sysdataset.FieldByName('NewsDate').AsString); news.SaveDate:=trim(sysdataset.FieldByName('SaveDate').AsString); if (news.ThumbUrl2<>'') and (news.ThumbUrl3<>'') then tmpstr:=tmpstr+ansistring(GetTopicHtml3(news)) else tmpstr:=tmpstr+ansistring(GetTopicHtml(news)); SysDataset.Next; end; SysDataset.Active:=false; except tmpstr:=''; end; j:=pos(ansistring('`嵌入列表`'),ResponseBody); delete(responsebody,j,10); insert(tmpstr,ResponseBody,j); end else responsebody:='<html><body>Open news table failed.</body></html>'; // // 释放对象... FreeAndNil(SysDataset); if assigned(AdoConn) then QBServiceAPI.FreeAdoConnection(AdoConn); end else ResponseBody:='<html><body>Allocate ADOConnection object failed.</body></html>'; end; // // 其他请求... else ResponseBody:='<html><body>Invalid web requestion.TaskId='+ansistring(inttostr(taskid))+'</body></html>'; end; // // 返回... try OutParcel.PutAnsiStringGoods('Content-Type','text/html;charset=utf-8'); OutParcel.PutAnsiStringGoods('ResponseBody',Utf8Encode(ResponseBody)); except end; // // 释放对象、完成... FreeAndNil(ParamParcel); result:=true; end;
// // 接口初始化... function ApiInitialize(ApiParcelPtr: integer): boolean; stdcall; var tmpParcel: TQBParcel; FileName: string; Json: TQBJson; ok: boolean; TransferKey: ansistring; BasePtr: integer; begin Json:=nil; // // 得到接口参数... try TmpParcel:=TQBParcel(pointer(ApiParcelPtr)); except result:=false; exit; end; BasePtr:=TmpParcel.GetIntegerGoods('Callback_Proc_List'); TransferKey:=TmpParcel.GetAnsiStringGoods('Transfer_Key'); ApiParcel:=TQBParcel.Create; ApiParcel.PutIntegerGoods('Callback_Proc_List',BasePtr); ApiParcel.PutAnsiStringGoods('Transfer_Key',TransferKey); Misc:=TAPIMisc.Create(ApiParcel); // // 取配置参数... FileName:=s_defaultdir+'config\newsdigger.sys'; if not fileexists(filename) then begin Misc.LogMsg('*** NewsDigger.dll: Config file [newsdigger.sys] not found!'); Result:=false; exit; end; try Json:=TQBJson.Create(filename,true); databaseid:=Json.GetString('DatabaseId'); ok:=true; except ok:=false; databaseid:=''; end; if assigned(json) then FreeAndNil(Json); if not ok then begin Misc.LogMsg('*** NewsDigger.dll: Read from config file failed!'); Result:=false; exit; end else Misc.LogMsg('NewsDigger.dll: Initialize interface successful!'); // // 完成... result:=true; end;
// // 导出函数(应用程序员不用改)... function WebpageProcess(InParcelPtr: integer; var OutParcelPtr: integer): boolean; stdcall; var aInParcel: TQBParcel; aOutParcel: TQBParcel; begin try aInParcel:=TQBParcel(InParcelPtr); except result:=false; OutParcelPtr:=0; exit; end; aOutParcel:=TQBParcel.Create; try Result:=MainFunction(aInParcel,aOutParcel); if Result then begin if aOutParcel.GoodsCount<=0 then OutParcelPtr:=0 else OutParcelPtr:=Parcel2Mem(aOutParcel); end else OutParcelPtr:=0; except OutParcelPtr:=0; result:=false; end; FreeAndNil(aOutParcel); end;
// // DLL 出入口过程... procedure DLLHandler(Reason: integer); var Buffer: array [0..255] of char; begin case Reason of DLL_Process_Attach: begin GetModuleFileName(0, Buffer, SizeOf(Buffer)); s_DefaultDir:=ExtractFilePath(string(Buffer)); Misc:=nil; end; DLL_PROCESS_DETACH: begin if assigned(Misc) then FreeAndNil(Misc); if assigned(ApiParcel) then FreeAndNil(ApiParcel); end; end; end;