轉到Lazarus后發現缺少適合的三層控件,嘗試過國產商業及網上的開源三層控件,但存在或多或少的問題,始終找不到滿意的三層控件(特別是linux aarch64下),決定趁2022年最后一天,開發一個基于RealThinClient SDK簡單實用的lazarus三層控件(參考網上的相關代碼)。
服務端網絡通信組件和數據庫組件決定三層控件性能和穩定可靠的關鍵所在,delphi很多三層使用強大的mORMot作為網絡通信控件,還有部分使用RealThinClient SDK,如全能中間件等,RTC的特點為是輕量/穩定,還有,RealThinClient SDK比mORMot使用更簡單方便,也比較容易實現我想要的功能,最重要的是能在linux(包括amr64/x86_64等CPU)和windows下使用,準備使用RTC作為我的三層控件的網絡通信組件。服務端用數據庫組件測試了unidac、zeosdbo和lazarus自帶的SQLDB等,zeosdbo和lazarus自帶的SQLDB在不同平臺需要各種數據庫驅動,部署難度大;unidac支持直連方式與數據庫連接,不需要數據庫驅動,部署簡單方便,linux服務端首選unidac作為服務端的數據庫控件。
數據庫可以選擇MSSQL2000、MySQL和PostgreSQL,中間件已適配這3種數據庫,其中MSSQL為支持分頁,表需添加ID字段。如果服務端在Linux運行,建議使用MySQL和PostgreSQL,因unidac不支持linux aarch64 for SQLite,所以數據庫沒選擇SQLite。
服務端使用RealThinClient SDK和UNIDAC,客戶端使用RealThinClient SDK和RealThinClient SDK的內存表(TRTCMemdataset),客戶端封裝了TQFRemoteConnection、TQFRemoteTable、TQFRemoteQuery和TQFRemoteStoredProc等4個控件,其中TQFRemoteTable支持分頁功能,如果沒分頁功能,在數據量大時性能下降嚴重,影響用戶體驗,2023-1-20增加自動保存變更后的數據。TQFRemoteConnection包含從服務端返回使用Snowflake方法生成的ID,取服務端時間和上傳/下載文件(沒有進度提示)功能,近日,將QFRemoteDataSet封裝為可視控件,使用更簡單方便。
這個三層控件功能相對簡單,只適合lazarus使用,但非常實用,編寫的應用軟件能在windows和國產信創操作系統(linux)及CPU運行,使用時只需在uses添加QFRemoteDataSet單元,按下面的方法使用就可以,使用起來挺簡單的。
QQ:315175176 秋風
1.直接引用QFRemoteDataSet單元時的代碼:
procedure TForm1.FormCreate(Sender: TObject); var myinifile:Tinifile; begin MYIniFile := TIniFile.Create(Extractfilepath(Paramstr(0)) + 'config.ini'); Edit1.Text:=MyIniFile.readstring('服務器', 'IP', '127.0.0.1'); Edit2.Text:= MyIniFile.readstring('服務器', '端口', '81'); Edit5.Text:=MyIniFile.readstring('服務器', '加密密鑰', ''); MYIniFile.Free; QFConnect1:=TQFRemoteConnection.Create; QFConnect1.server_ip:=edit1.Text; QFConnect1.server_port:=edit2.text; QFConnect1.Compression:=true; //壓縮 QFConnect1.SecureKey:=Edit5.text;//加密key QFTable:=TQFRemoteTable.Create(self); QFTable.DataPagination:=True; QFTable.Connection:=QFConnect1; DataSource1.DataSet:=QFTable; QFTable.TableName:='混凝土試塊數據'; QFTable.KeyFields:='報告編號,序號'; end; procedure TForm1.Button2Click(Sender: TObject); begin FTimeUsed := GetTickCount; if QFConnect1=nil then begin QFConnect1:=TQFRemoteConnection.Create;//創建連接 QFConnect1.server_ip:=edit1.Text; //設置服務端IP QFConnect1.server_port:=edit2.text;//設置服務端端口 end; if QFTable=nil then begin QFTable:=TQFRemoteTable.Create(nil);//創建Table QFTable.Connection:=QFConnect1; //指定Table的connection QFTable.TableName:='混凝土試塊數據'; QFTable.KeyFields:='報告編號,序號'; end; QFTable.DataPagination:=CheckBox1.Checked;//數據分頁 DataSource1.DataSet:=QFTable; QFTable.open; Label2.Caption:= '記錄數:'+QFTable.RecordCount.ToString+' 第'+QFTable.CurPage.ToString+'頁/共'+QFTable.PageNoMax.ToString+'頁'+' '+IntToStr(GetTickCount - FTimeUsed) + '毫秒'; end;
2.用控件時的代碼:
procedure TForm1.FormCreate(Sender: TObject); var myinifile:Tinifile; begin MYIniFile := TIniFile.Create(Extractfilepath(Paramstr(0)) + 'config.ini'); Edit1.Text:=MyIniFile.readstring('服務器', 'IP', '127.0.0.1'); Edit2.Text:= MyIniFile.readstring('服務器', '端口', '81'); Edit5.Text:=MyIniFile.readstring('服務器', '加密密鑰', ''); MYIniFile.Free; QFRemoteConnection1.SecureKey:=Edit5.Text; QFRemoteConnection1.Server_ip:=Edit1.Text; QFRemoteConnection1.Server_port:=Edit2.Text; end; procedure TForm1.Button2Click(Sender: TObject); begin FTimeUsed := GetTickCount; QFRemoteTable1.DataPagination:=CheckBox1.Checked;//數據分頁 DataSource1.DataSet:=QFRemoteTable1; QFRemoteTable1.open; Label2.Caption:= '記錄數:'+QFRemoteTable1.RecordCount.ToString+' 第'+QFRemoteTable1.CurPage.ToString+'頁/共'+QFRemoteTable1.PageNoMax.ToString+'頁'+' '+IntToStr(GetTickCount - FTimeUsed) + '毫秒'; end;
將QFRemoteDataSet封裝為可視控件:

windows服務端:

linux服務端:

客戶端在windows運行時的截圖:

客戶端在銀河麒麟linux arm64運行截圖:

QFRemoteDataSet下載鏈接:通過百度網盤分享的文件:QFRemote...
https://pan.baidu.com/s/16TGs5LWYHBEpoeBM-K1-BA?pwd=G876
提取碼:G876

浙公網安備 33010602011771號