Alcinoe 元件庫,由 Zeus64 開發,是一個為 Delphi 提供的開源視覺和非視覺元件庫。
完整的 OpenGL 影片播放器、WebRTC Delphi 封裝、原生 iOS/Android TEdit 元件、改進的 FireMonkey 控制元件、Firebase 雲訊息推送、Android/iOS Facebook SDK 登入、Json/Bson 解析器、ImageMagick 封裝、MongoDB 客戶端。
Alcinoe 相容 Delphi Rio 10.3.3 和 Delphi Sydney 10.4.2。
https://github.com/Zeus64/alcinoe
Delphi Alexandria 11.1 支援 MOD 下載(已移除)。
Alcinoe 現在已完全相容 Delphi Athens 12.3。.
安裝 Alcinoe
如果您計劃在設計時使用任何 Alcinoe 視覺元件,則您無需安裝任何內容,只需將 {alcinoe_rootdir}\source 新增到您的專案的搜尋路徑中。
如果您計劃在設計時使用視覺元件,則需要安裝 BPL。 啟動 Delphi,進入“元件”>“安裝包...”,然後選擇位於 {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\sydney\Alcinoe_sydney.bpl 的 BPL 檔案(如果您使用的是 Delphi Sydney 版本,否則請選擇與您的 Delphi 版本對應的目錄)。 您仍然需要將 {alcinoe_rootdir}\source 新增到您的搜尋路徑中。
Alcinoe 也會對原始 Delphi 原始碼進行一些改進。 這樣,您需要進入 {alcinoe_rootdir}\embarcadero\sydney\10_4_2 目錄,並執行 update.bat 來獲取並修補原始 Delphi 原始碼。 該批處理檔案假定原始原始碼位於 “c:\Program Files (x86)\Embarcadero\Studio\21.0\source”,並且您已將 GIT 新增到您的路徑中。 在批處理檔案複製並修補 Delphi 原始碼後,您需要在您的專案搜尋路徑中包含此原始碼。
為了支援更多庫使用 Java 1.8 的特性(例如 webRTC、exoplayer 等),我們需要進行反編譯(Desugaring,反編譯允許您在構建過程中,通過將新的位元組碼和語言 API 替換為舊的,在較舊的裝置上使用這些特性)。 使用 d8.bat(dx.bat 的替代品)時,反編譯預設已啟用。 因此,您現在可以使用大多數最新的語言更改,同時針對較舊的裝置。 在 Embarcadero 切換到 D8.bat 之前,我們需要將 DX.bat 設定為 D8.bat 的“代理”。為此,只需將原始的 DX.bat(我的位於 c:\SDKs\android\build-tools\30.0.3\d8.bat)替換為位於 {alcinoe_rootdir}\tools\D8Proxy\dx.bat 的檔案。 更多詳細資訊請參考:https://quality.embarcadero.com/browse/RSP-24155
用於 FireMonkey 的完整 OpenGL 影片播放器
ALVideoPlayer 會將影片渲染到紋理 (TEXTURE) 上。 這非常重要,因為您可以完全將影片整合到 Delphi 窗體中,並且可以在其上方放置任何控制元件,因為它支援 Z 順序。 官方 Delphi 影片播放器只是在窗體頂部的本機影片播放器視窗,因此不支援 Z 順序。
在 Android 上,我使用 ExoPlayer。 ExoPlayer 支援 MediaPlayer 不支援的功能,例如動態自適應 HTTP 傳輸 (DASH)、HLS、SmoothStreaming 和通用加密。 它的設計易於定製和擴充套件。 在 iOS 上,我使用 AVPlayer,它也支援與 ExoPlayer 相同的 HLS 功能。
FireMonkey 影片播放器 FireMonkey 影片播放器 FireMonkey 影片播放器
WebRTC Delphi 封裝
WebRTC(Web 即時通訊)是一種技術,它使 Web 應用程式和網站能夠捕獲並可選地流式傳輸音訊和/或影片媒體,以及在瀏覽器和移動應用程式之間交換任意資料,而無需中間環節。WebRTC 組成的標準集使得可以進行點對點的資料共享和視訊會議,而無需使用者安裝外掛或其他第三方軟體。
TALWebRTC 元件使您可以輕鬆地將影片和音訊聊天功能新增到您的應用程式中,從而開啟全新的互動世界。
Delphi WebRTC 封裝
Firemonkey 原生 iOS/Android TEdit 和 TMemo 元件
目標是,當某個控制元件的功能變得難以實現時,將 FireMonkey 控制元件與原生平臺控制元件相結合(例如,Web 瀏覽器、編輯框、記事本、日期選擇器等)。但這並不是為了為不同的平臺建立多個不同的表單,例如 http://www.turbococoa.com/ 提供的方案(但這在某種程度上也是一個不錯的替代方案,您可以根據自己的需要進行選擇)。
在 Delphi (berlin) 中,已經存在相當完善的 iOS 平臺控制元件,但幾乎沒有 Android 平臺控制元件,因此我開始構建原生 Android/iOS 控制元件,例如 TEdit/TMemo。這些控制元件的工作方式類似於放置在表單頂部的視窗(因此,它們不能與 FireMonkey 控制元件進行 Z 順序調整)。
Drawing Drawing
Drawing
快速/雙緩衝的 FireMonkey 控制元件,具有原生繪製功能。
Rectangle
Circle
Text (也可以在 iOS/android/win/macOS 上繪製 HTML 文本)
Glyph
等。
TALRectangle
TALRectangle
這個事實
繪製 FireMonkey 控制元件有時可能很慢,或者說,速度不夠快,無法實現流暢的滾動。 例如,如果只是檢視一個帶有圓角的 TRectangle,繪製過程可能需要 3 毫秒! 如果螢幕上有大約 20 個可見的 TRectangle,那麼重新整理整個螢幕就需要大約 60 毫秒(通常你不僅有 TRectangle,還有 TLabel、TCheckbox 等)。 重新整理螢幕需要 100 毫秒,這意味著你只能達到大約 10 幀每秒(實際上會更少),因此滾動效果無法流暢 🙁
解決方案
我不想重構 FireMonkey 控制元件,那是一項非常龐大的工作,而是嘗試尋找一箇中間解決方案。 我通過為 FireMonkey 控制元件新增“雙緩衝”屬性找到了這個解決方案。 這樣,我不再為每個滾動框的畫素移動而重複繪製控制元件,而是首先將控制元件繪製到一個“緩衝區”上,該緩衝區直接儲存在 GPU 記憶體中(通過 TTexture),當系統要求我重新繪製控制元件時,我不再呼叫繪製演算法,而是簡單地重繪該緩衝區 TTexture。
結果
如前所述,繪製一個帶有圓角的簡單 TRectangle 需要 3 毫秒。 使用我的雙緩衝屬性,現在只需要大約 0.1 毫秒! 現在滾動效果看起來更流暢了!
OpenGL draw => 替換為原生的 iOS/Android 繪圖。
大部分基本形狀(如 TRectangle、TCircle 等)使用 OpenGL 繪圖,效率不高。例如,在 OpenGL 下繪製一個圓實際上需要繪製 50 個三角形。這通常會導致質量問題:https://quality.embarcadero.com/browse/RSP-15206。對於圓角矩形,情況更糟,因為它需要先計算路徑,然後再繪製(比繪製圓形慢得多)。
另一個問題是,所有這些繪圖都依賴於 Form.quality。如果將 form.quality 設定為 highquality,那麼在畫布上執行的所有操作都將進行多采樣,例如繪製圖像,這可能會導致問題,因為影像會被抗鋸齒處理。如果將 form.quality 設定為 highperformance,則繪製效果會非常粗糙(沒有抗鋸齒)。
為了解決這個問題,我使用 NATIVE ANDROID/IOS API 構建了控制元件的緩衝區。這樣,我們可以在保證高質量的同時,以高速度進行繪製,並且不依賴於 form.quality。
TALCircle
改進的 FireMonkey 控制元件
ScrollBox
TabControl
RangeTrackBar
RangeTrackBar
FireMonkey 影片播放器 FireMonkey 影片播放器 FireMonkey 影片播放器
Confetti Falling Animation
ALConfetti 是一個原生的 Delphi 庫,用於建立可配置的高效能飄落式綵帶動畫。
綵帶
Firebase 雲訊息傳遞
一種跨平臺方法,使用 Firebase Cloud Messaging (FCM) 接收推送通知。通過 FCM,您可以通知客戶端應用程式,有新的電子郵件或其他資料可供同步。您可以傳送通知訊息來提高使用者參與度和留存率。對於諸如即時訊息之類的用例,一條訊息可以將最多 4KB 的資料傳輸到客戶端應用程式。
Android/iOS VKontakte/Facebook SDK 登入
Android 平臺的 VKontakte/Facebook SDK 允許使用者使用 VKontakte/Facebook 登入您的應用程式。當用戶使用 VKontakte/Facebook 登入您的應用程式時,他們可以授予您的應用程式許可權,以便您可以在他們的 VKontakte/Facebook 賬戶上檢索資訊或執行操作。
Android/iOS 平臺的照片編輯濾鏡
使用 TALColorAdjustEffect,只需一鍵即可自動增強照片,讓您的照片在幾分鐘內變得美麗而富有表現力!
FireMonkey 影片播放器
JSON 解析器
TALJsonDocument 是一個用於 JSON / BSON 資料格式的 Delphi 解析器/寫入器。它支援 DOM 和 SAX 解析器(注意,一個更好的名稱可能是 SAJ,即 Simple API for JSON,而不是 SAX,即 Simple API for XML,但由於 SAX 的概念廣為人知,我保留了這個名稱),支援 BSON 格式,並且使用與 TALXMLDocument / TXMLDocument 相似的語法。TALJsonDocument 還可以將 JSON / Bson 資料匯出到 TALStringList 中。
在處理解析某些(文本)內容時,通常會考慮兩種方向。在 JSON 世界中,您通常需要選擇:
一個 DOM 解析器,它會建立一個記憶體中的物件樹結構,用於對映 JSON 內容。
一個 SAX 解析器,它會讀取 JSON 內容,然後為每個 JSON 內容元素呼叫預定義的事件。
實際上,DOM 解析器在內部使用一個 SAX 解析器來讀取 JSON 內容。因此,由於物件建立和屬性初始化帶來的開銷,DOM 解析器通常比 SAX 解析器慢三到五倍(並且使用更多的記憶體來儲存所有節點)。但是,DOM 解析器在處理資料方面功能更強大:一旦資料對映到原生物件,程式碼可以隨時訪問任何節點,而基於 SAX 的訪問需要再次讀取整個 JSON 內容。
大多數 Delphi 中可用的 JSON 解析器都採用類似於 DOM 的方法。例如,自 Delphi 2010 以來包含的 DBXJSON 單元或 SuperObject 庫會為每個 JSON 節點建立一個類例項。為了實現最佳速度,TALJsonDocument 實現了 DOM 解析器,也實現了 SAX 解析器。
TALJsonDocument 還可以支援 JSON 原始檔中的註釋,這是一種對 JSON 規範的擴充套件。
TALJsonDocument 的語法與 TALXMLdocument / TXMLDocument 非常相似。
TALJsonDocument 有兩個變體:TALJsonDocument,它基於 ansiString(即 UTF-8),以及 TALJsonDocumentU,它基於 unicode 字串(即 UTF-16)。
示例:
{
_id: 1, // comments
name: { first: “John”, last: “Backus” },
birth: new Date(‘1999-10-21T21:04:54.234Z’),
contribs: [ “Fortran”, “ALGOL”, “Backus-Naur Form”, “FP” ],
awards: [
{ award: “National Medal of Science”,
year: 1975,
by: “National Science Foundation” },
{ award: “圖靈獎”,
year: 1977,
by: “ACM” }
],
spouse: “”,
address: {},
phones: []
}
要訪問文件節點:
MyJsonDoc.loadFromJson(AJsonStr, False);
MyJsonDoc.ParseOptions := [poAllowComments]; // 允許在 JSON 原始檔中包含註釋
MyJsonDoc.childnodes['_id'].int32;
MyJsonDoc.childnodes['name'].childnodes['first'].text;
MyJsonDoc.childnodes['name'].childnodes['last'].text;
MyJsonDoc.childnodes['birth'].datetime;
for i := 0 to MyJsonDoc.childnodes['contribs'].ChildNodes.count – 1 do
MyJsonDoc.childnodes['contribs'].childnodes[i].text;
for i := 0 to MyJsonDoc.childnodes['awards'].ChildNodes.count – 1 do begin
MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['award'].text;
MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['year'].text;
MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['by'].text;
end;
或者,如果您不確定在訪問節點之前節點是否存在,或者您不想檢查它,您也可以這樣做:
MyJsonDoc.GetChildNodeValueInt32(' _id', 0{預設值,如果節點不存在});
MyJsonDoc.GetChildNodeValueText(['name', 'first'], ""{預設值,如果節點不存在});
MyJsonDoc.GetChildNodeValueDateTime('birth', Now{預設值,如果節點不存在});
用於建立文件節點:
MyJsonDoc.addchild('_id').int32 := 1;
with MyJsonDoc.addchild('name', ntObject) do begin
addchild('first').text := 'John';
addchild('last').text := 'Backus';
end;
MyJsonDoc.addchild('birth').dateTime := Now;
with MyJsonDoc.addchild('contribs', ntArray) do begin
addchild.text := ‘Fortran’;
addchild.text := ‘ALGOL’;
addchild.text := ‘Backus-Naur Form’;
addchild.text := ‘FP’;
end;
with MyJsonDoc.addchild(‘awards’, ntArray) do begin
with addchild(ntObject) do begin
addchild(‘award’).text := ‘National Medal of Science’;
addchild('year').int32 := 1975;
addchild('by').text := 'National Science Foundation';
end;
with addchild(ntObject) do begin
addchild('award').text := 'Turing Award';
addchild('year').int32 := 1977;
addchild('by').text := 'ACM';
end;
end;
MyJsonDoc.addchild('spouse');
MyJsonDoc.addchild('address', ntObject);
MyJsonDoc.addchild('phones', ntArray);
您也可以像這樣建立/更新節點:
MyJsonDoc.SetChildNodeValueInt32('_id', 0);
MyJsonDoc.SetChildNodeValueText(['name', 'first'], 'John');
MyJsonDoc.SetChildNodeValueDateTime('birth', Now);
用於從 BSON 載入和儲存:
MyJsonDoc.LoadFromFile(aBSONFileName, False{saxMode}, True{BSON});
MyJsonDoc.SaveToFile(aBSONFileName, False{saxMode}, True{BSON});
用於以 SAX 模式解析 JSON 文件:
MyJsonDoc.onParseText := procedure (Sender: TObject;
const Path: AnsiString;
const name: AnsiString;
const Args: array of const;
NodeSubType: TALJSONNodeSubType) -> NodeSubType: TALJSONNodeSubType)
begin
case NodeSubType of -> case NodeSubType of
nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings)); -> nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings));
nstText: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString)); -> nstText: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstObjectID: Writeln(Path + ‘=’ + ‘ObjectId(“‘+ALBinToHex(ansiString(Args[0].VAnsiString))+'”)’); -> nstObjectID: Writeln(Path + ‘=’ + ‘ObjectId(“‘+ALBinToHex(ansiString(Args[0].VAnsiString))+'”)’);
nstBoolean: Writeln(Path + ‘=’ + ALBoolToStr(Args[0].VBoolean,’true’,’false’)); -> nstBoolean: Writeln(Path + ‘=’ + ALBoolToStr(Args[0].VBoolean,’true’,’false’));
nstDateTime: Writeln(Path + ‘=’ + ALFormatDateTime(”’ISODate(“”yyyy”-”mm”-”dd”T”hh”:”nn”:”ss”.”zzz”Z”)”’, Args[0].VExtended^, ALDefaultFormatSettings)); -> nstDateTime: Writeln(Path + ‘=’ + ALFormatDateTime(”’ISODate(“”yyyy”-”mm”-”dd”T”hh”:”nn”:”ss”.”zzz”Z”)”’, Args[0].VExtended^, ALDefaultFormatSettings));
nstNull: Writeln(Path + ‘=’ + ‘null’);
nstRegEx: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstBinary: Writeln(Path + ‘=’ + ‘BinData(‘+inttostr(Args[1].VInteger)+’, “‘+ansiString(ALBase64EncodeStringNoCRLF(ansiString(Args[0].VAnsiString)))+'”)’);
nstJavascript: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstInt32: Writeln(Path + ‘=’ + ‘NumberInt(‘+inttostr(Args[0].VInteger)+’)’);
nstTimestamp: Writeln(Path + ‘=’ + ‘Timestamp(‘+inttostr(int64(cardinal(Args[0].VInteger)))+’, ‘+inttostr(int64(cardinal(Args[1].VInteger)))+’)’);
nstInt64: Writeln(Path + ‘=’ + ‘NumberLong(‘+inttostr(Args[0].VInt64^)+’)’);
end;
end;
MyJsonDoc.LoadFromJSON(AJsonStr, true{saxMode});
Delphi 的 ImageMagick 封裝。
使用 ImageMagick® 建立、編輯、合成或轉換點陣圖影像。它可以讀取和寫入多種格式的影像(超過 200 種),包括 PNG、JPEG、GIF、HEIC、TIFF、DPX、EXR、WebP、Postscript、PDF 和 SVG。使用 ImageMagick 可以調整影像大小、翻轉、映象、旋轉、扭曲、剪下和變換影像,調整影像顏色,應用各種特殊效果,或繪製文本、線條、多邊形、橢圓和貝塞爾曲線。
示例:
var aWand: PMagickWand;
begin
//建立 ImageMagick 庫
alCreateImageMagickLibrary({alcinoe_rootdir} + ‘\lib\dll\imagemagick\win32\imagemagick’, min(2, System.CPUCount){aThreadLimit});
try
//建立魔棒指標
aWand := ALImageMagickLib.NewMagickWand;
try
//載入影像
if ALImageMagickLib.MagickReadImage(aWand, pansiChar(aInputFilename)) <> MagickTrue then RaiseLastMagickWandError(aWand);
//設定壓縮質量
如果 ALImageMagickLib.MagickSetImageCompressionQuality(aWand, 80) 不等於 MagickTrue,則呼叫 RaiseLastMagickWandError(aWand)。
//自動調整影像大小
如果 ALImageMagickLib.MagickAutoOrientImage(aWand) 不等於 MagickTrue,則呼叫 RaiseLastMagickWandError(aWand)。
//使用 Lanczos 濾波器調整影像大小
如果 ALImageMagickLib.MagickResizeImage(aWand, 640, 480, LanczosFilter) 不等於 MagickTrue,則呼叫 RaiseLastMagickWandError(aWand)。
//儲存影像
ALImageMagickLib.MagickWriteImage(aWand, pansiChar(aOutputFilename))。
finally
ALImageMagickLib.DestroyMagickWand(aWand);
end;
finally
alFreeImageMagickLibrary;
end;
end;
MongoDB 客戶端
Delphi 客戶端,用於訪問 MongoDB 資料庫。一個 Delphi 驅動程式(帶連線池),用於訪問 MongoDB 伺服器。連線池是一種快取,用於維護資料庫連線,以便在將來需要連線到資料庫時可以重用這些連線。在連線池中,連線建立後會被放入池中,以便重複使用,而無需每次都建立新的連線。如果所有連線都在使用中,則會建立一個新的連線並將其新增到池中。連線池還可以減少使用者建立資料庫連線所需的時間。
示例:
aJSONDoc := TALJSONDocument.create;
aMongoDBClient := TAlMongoDBClient.create;
try
aMongoDBClient.Connect("", 0);
aMongoDBClient.SelectData('test.exemple',
'{fieldA:123}', // 查詢條件
‘{fieldA:1, fieldB:1}’, // 返回欄位選擇器
aJSONDoc.node);
aMongoDBClient.disconnect;
for i := 0 to aJSONDoc.node.childnodes.count – 1 do
with aJSONDoc.node.childnodes[i] do
writeln(aJSONDoc.node.childnodes[i].nodename + ‘=’ + aJSONDoc.node.childnodes[i].text)
finally
aMongoDBClient.free;
aJSONDoc.free;
end;
示例,帶有連線池:
aMongoDBConnectionPoolClient := TAlMongoDBConnectionPoolClient.create(aDBHost, aDBPort);
try
::Thread1::
aMongoDBConnectionPoolClient.SelectData('test.example',
'{fieldA:123}', // 查詢條件
‘{fieldA:1, fieldB:1}’, // 返回欄位選擇器
aLocalVarJSONDOC.node);
::Thread2::
aMongoDBConnectionPoolClient.SelectData('test.example',
'{fieldA:999}', // 查詢條件
‘{fieldA:1, fieldB:1}’, // 返回欄位選擇器
aLocalVarJSONDOC.node);
finally
aMongoDBClient.free;
end;
示例尾資料監控:
aMongoDBTailMonitoringThread := TAlMongoDBTailMonitoringThread.Create(
aDBHost,
aDBPort,
‘test.cappedCollectionExemple’
‘{}’, // 查詢條件
‘{fieldA:1, fieldB:1}’, // 返回欄位選擇器
procedure (Sender: TObject; JSONRowData: TALJSONNode)
begin
writeln('New item added in cappedCollectionExemple: ' + JSONRowData.childnodes['fieldA'].text);
end,
procedure (Sender: TObject; Error: Exception)
begin
writeln(Error.message);
end);
….
aMongoDBTailMonitoringThread.free;
WebSocket 客戶端
基於 WinHTTP 實現的 Delphi WebSocket 客戶端。WebSocket 是一種通訊協議,它允許在使用者的瀏覽器和伺服器之間建立雙向互動通訊會話。通過此協議,您可以向伺服器傳送訊息,並在無需輪詢伺服器以獲取回覆的情況下接收基於事件的響應。
快速 TStringList
TALStringList 的工作方式與 Delphi 的 TStringList 相同,但它允許使用快速排序演算法搜尋名稱=值,當列表已排序時。此外,TALStringList 使用一種與 Delphi TStringList 中使用的 AnsiCompareText 和 AnsiCompareStr 不同的、與本地無關的演算法(基於每個字元的 8 位序數值)。因此,TALStringList 中的排序速度比 Delphi TStringList 快 10 倍。此外,TALStringList 不是一個 Unicode TStringList,而是一個 100% 的 Ansi 字串列表。
TALNVStringList(NV 表示名稱/值)與 TALStringList 相同(也使用快速排序演算法),但這裡的最佳化面向名稱/值列表,而不是字串列表。
TALHashedStringList:TALHashedStringList 與 TALStringList 相同,不同之處在於它使用內部雜湊表,而不是快速排序演算法。通過使用 TALHashedStringList 代替 TALStringList,可以在列表包含大量字串時提高效能(否則,如果列表不包含大量字串,則效能會低於 TALStringList,因為計算雜湊的成本)。
PHP 執行時
ALPHPRunnerEngine 是一個簡單但有用的元件,可用於在 Delphi 應用程式中輕鬆使用 PHP(任何版本)作為指令碼語言。ALPHPRunnerEngine 允許在 Delphi 程式中執行 PHP 指令碼,而無需 Web 伺服器。ALPHPRunnerEngine 使用 PHP 的 CGI/FastCGI 介面 (php-cgi.exe) 與 PHP 引擎進行通訊。
Memcached 客戶端
Delphi 客戶端,用於 memcached 資料庫。
什麼是 Memcached? 這是一個免費且開源的高效能分散式記憶體物件快取系統,具有通用性,但主要用於通過減輕資料庫負載來加速動態 Web 應用程式。
Memcached 是一個記憶體鍵值儲存,用於儲存來自資料庫呼叫、API 呼叫或頁面渲染的小塊任意資料(字串、物件)。
Memcached 簡單但功能強大。 它的簡單設計促進了快速部署、易於開發,並解決了大型資料快取面臨的許多問題。
GSM 元件
TAlGSMComm 元件實現了通過文本模式介面進行簡訊傳送,該介面定義在 GSM 技術規範 07.05,版本 5.1.0,日期為 1996 年 12 月。 此規範有多種變體,廣泛應用於諾基亞、西門子、愛立信等型號的手機。 我們內部測試了諾基亞 6230 型號,但諾基亞 7190、8890、6210 和 9110 型號也應該可以工作。 來自其他製造商的手機也可以工作,只要它們實現了文本模式介面。 大約 1/4 的當前手機可以連線到 PC(通過紅外線或序列電纜),其中約 1/3 僅支援文本模式,1/3 僅支援 PDU 模式,而另一 1/3 同時支援文本和 PDU 模式。 一些手機(例如諾基亞 5190)支援簡訊,但它們使用專有協議,TALGSMComm 不支援該協議。
為了測試您的手機,請通過序列埠線或紅外裝置將手機連線到您的PC(請參閱您的手機文件,瞭解如何連線)。在終端視窗中輸入“AT”以驗證連線是否已建立(您應該從手機收到“OK”),然後輸入“AT+CMGF=?”。響應應包含“1”,表示它支援文本模式。如果這兩個測試都通過,則您的手機滿足基本要求。
SQLite3 客戶端
查詢 SQLite3 資料庫並以 XML 格式或 JSON/BSON 格式獲取結果。
更多功能
CGI 執行器
HTTP 客戶端 (WinInet/WinHTTP)
MySQL 客戶端
NNTP 客戶端
POP3 客戶端
SMTP 客戶端
XML 解析器
WIN64
不幸的是,在 win64 中,我們失去了所有 FastCode 的技術。 (這主要基於彙編)。 這意味著大多數函式的速度會慢 2 到 10 倍。 您可以嘗試在 win64 和 Win32 上執行 /demo/ALStringBenchMark/,以檢視速度差異。