Zeus64에서 개발한 Alcinoe 컴포넌트 라이브러리는 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 버전을 사용하는 경우 해당 디렉토리를 선택하십시오). 프로젝트의 검색 경로에 {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(Desugaring은 빌드 프로세스 중에 새로운 바이트 코드 및 언어 API를 이전 버전으로 대체하여 이전 장치에서도 이러한 기능을 사용할 수 있도록 합니다)을 수행해야 합니다. d8.bat(dx.bat의 대체)을 사용하면 desugaring이 기본적으로 활성화됩니다. 따라서 이전 장치를 대상으로 하면서 최신 언어 변경 사항을 대부분 사용할 수 있습니다. 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-ORDER를 지원하므로 원하는 모든 컨트롤을 위에 배치할 수 있기 때문입니다. 공식 Delphi 비디오 플레이어는 단순히 폼 위에 있는 기본 비디오 플레이어 창이며, Z-ORDER를 지원하지 않습니다.
Android에서는 ExoPlayer를 사용합니다. ExoPlayer는 MediaPlayer에서 지원하지 않는 동적 적응 스트리밍(DASH), HLS, SmoothStreaming 및 Common Encryption과 같은 기능을 지원합니다. 사용하기 쉽고 확장 가능하도록 설계되었습니다. iOS에서는 ExoPlayer와 마찬가지로 HLS를 지원하는 AVPlayer를 사용합니다.
FireMonkey 비디오 플레이어 FireMonkey 비디오 플레이어 FireMonkey 비디오 플레이어
WebRTC 델파이 래퍼
WebRTC(Web Real-Time Communications)는 웹 애플리케이션 및 사이트가 오디오 및/또는 비디오 미디어를 캡처하고 선택적으로 스트리밍하며, 브라우저와 모바일 애플리케이션 간에 임의의 데이터를 교환할 수 있도록 하는 기술입니다. WebRTC를 구성하는 표준 세트는 사용자가 플러그인이나 기타 타사 소프트웨어를 설치하지 않고도 데이터를 공유하고 P2P(peer-to-peer) 화상 회의를 수행할 수 있도록 합니다.
TALWebRTC 컴포넌트는 비디오 및 오디오 채팅을 애플리케이션에 쉽게 추가할 수 있도록 하여, 완전히 새로운 수준의 상호 작용을 제공합니다.
델파이 WebRTC 래퍼
Firemonkey 네이티브 iOS/Android TEdit 및 TMemo
목표는 FireMonkey 컨트롤과 네이티브 플랫폼 컨트롤을 혼합하여, 특정 컨트롤의 기능 구현이 매우 어려워지는 경우(예: 웹 브라우저, 편집기, 메모, 날짜 선택기 등)에 네이티브 컨트롤을 사용하는 것입니다. 하지만, TurboCocoa와 같이 여러 플랫폼에 대해 여러 개의 별도 폼을 만드는 것이 아닙니다(하지만 이 옵션도 어느 정도 좋은 대안이 될 수 있으며, 사용자가 결정할 문제입니다).
델파이(베를린)에서는 이미 iOS 플랫폼 컨트롤이 잘 구현되어 있지만, Android 플랫폼 컨트롤은 거의 없습니다. 그래서 TEdit/TMemo와 같은 네이티브 Android/iOS 컨트롤을 개발하기 시작했습니다. 이러한 컨트롤은 폼 위에 배치된 창처럼 작동하며, 따라서 FireMonkey 컨트롤과의 Z-순서 호환성은 없습니다.
그리기
그리기
네이티브 드로잉을 사용하는 빠른/더블 버퍼 FireMonkey 컨트롤
사각형
원
텍스트 (iOS/Android/Windows/macOS에서 HTML 텍스트도 그릴 수 있습니다)
글리프
기타
TALRectangle
TALRectangle
사실
FireMonkey 컨트롤의 렌더링 속도가 때때로 느릴 수 있으며, 이는 부드러운 스크롤에 충분히 빠르지 않음을 의미합니다. 예를 들어, 가장 기본적인 둥근 모서리를 가진 TRectangle의 경우, 렌더링 과정에 3ms가 소요될 수 있습니다! 따라서 화면에 20개의 TRectangle이 표시되어 있다면, 전체 화면을 다시 렌더링하는 데 약 60ms가 소요됩니다 (물론 TRectangle만 있는 것은 아니며, TLabel, TCheckbox 등도 있습니다). 이렇게 100ms가 걸리는 렌더링 속도라면, 초당 약 10프레임만 표시할 수 있으므로 스크롤이 부드럽게 보이지 않습니다 🙁
해결책
저는 FireMonkey 컨트롤을 완전히 재구축하고 싶지 않았습니다. 그건 너무 큰 작업이기 때문에, 대신 중간적인 해결책을 찾으려고 했습니다. 제가 찾은 방법은 FireMonkey 컨트롤에 "더블 버퍼링" 속성을 추가하는 것입니다. 스크롤박스의 작은 움직임마다 컨트롤을 계속 렌더링하는 대신, 먼저 컨트롤을 "버퍼"에 렌더링합니다. 이 버퍼는 GPU 메모리에 직접 저장되며 (TTexture를 통해), 시스템이 컨트롤을 다시 렌더링하도록 요청하면 렌더링 알고리즘을 다시 호출하는 대신, 버퍼에 저장된 TTexture를 다시 그립니다.
결과
이전에 말씀드린 것처럼, 둥근 모서리를 가진 간단한 TRectangle을 렌더링하는 데 3ms가 걸렸습니다. 하지만 더블 버퍼링 속성을 사용하면 0.1ms 정도밖에 걸리지 않습니다! 이제 스크롤이 훨씬 더 부드럽게 보입니다!
OpenGL 그리기 => 네이티브 iOS/Android 그리기 방식으로 대체되었습니다.
대부분의 기본 도형(예: TRectangle, TCircle 등)은 OpenGL을 사용하여 그리므로 효율성이 좋지 않습니다. 예를 들어, OpenGL을 사용하여 원을 그릴 때 실제로 50개의 삼각형을 그립니다. 이는 종종 품질 저하를 초래합니다: https://quality.embarcadero.com/browse/RSP-15206. TRoundRect의 경우 더욱 심각합니다. 왜냐하면 먼저 경로를 계산한 다음 그려야 하므로 TCircle보다 훨씬 느립니다.
또 다른 문제는 이러한 모든 그리기 작업이 Form.quality에 의존한다는 것입니다. Form.quality를 highquality로 설정하면 캔버스에서 수행하는 모든 작업이 멀티샘플링 방식으로 처리됩니다(예: 이미지 그리기). 이는 문제가 될 수 있습니다. 왜냐하면 이미지가 안티앨리어싱 처리되기 때문입니다. Form.quality를 highperformance로 설정하면 그리기 작업이 매우 거칠어집니다(안티앨리어싱 없음).
이 문제를 해결하기 위해 제 컨트롤의 버퍼를 네이티브 Android/iOS API를 사용하여 생성했습니다. 이렇게 하면 폼의 품질 설정에 의존하지 않고도 고품질의 빠른 그리기 작업을 수행할 수 있습니다.
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 파서를 지원합니다 (SAX 대신 JSON에 대한 Simple API라는 더 나은 이름을 사용할 수 있지만, SAX 개념이 널리 알려져 있으므로 이 이름을 유지합니다). BSON 형식을 지원하며 TALXMLDocument / TXMLDocument와 유사한 구문을 사용합니다. TALJsonDocument는 또한 TALStringList에 JSON/Bson 데이터를 내보낼 수 있습니다.
텍스트 콘텐츠를 파싱할 때 일반적으로 두 가지 방향이 고려됩니다. JSON 세계에서는 일반적으로 다음 중에서 선택해야 합니다.
DOM 파서는 JSON 콘텐츠를 메모리 내 객체 트리 구조로 변환합니다.
SAX 파서는 JSON 콘텐츠를 읽고, 각 JSON 콘텐츠 요소에 대해 미리 정의된 이벤트를 호출합니다.
실제로, DOM 파서는 JSON 콘텐츠를 읽기 위해 내부적으로 SAX 파서를 사용합니다. 따라서 객체 생성 및 속성 초기화에 따른 오버헤드로 인해, DOM 파서는 일반적으로 SAX 파서보다 3배에서 5배 정도 느리고, 모든 노드를 저장하는 데 훨씬 더 많은 메모리를 사용합니다. 하지만 DOM 파서는 데이터를 처리하는 데 훨씬 강력합니다. 데이터가 네이티브 객체로 매핑되면 코드는 특정 노드에 즉시 액세스할 수 있지만, SAX 기반 액세스는 전체 JSON 콘텐츠를 다시 읽어야 합니다.
Delphi에서 사용 가능한 대부분의 JSON 파서는 DOM 방식과 유사한 접근 방식을 사용합니다. 예를 들어, Delphi 2010부터 포함된 DBXJSON 유닛 또는 SuperObject 라이브러리는 각 JSON 노드에 대한 클래스 인스턴스를 생성합니다. 최상의 속도를 달성하기 위해, TALJsonDocument는 DOM 파서와 SAX 파서를 모두 구현합니다.
TALJsonDocument는 JSON 소스 내의 주석을 지원하며, 이는 JSON 사양의 확장입니다.
TALJsonDocument의 구문은 TALXMLdocument / TXMLDocument와 매우 유사합니다.
TALJsonDocument는 2가지 변형으로 제공됩니다. ansiString(UTF-8)을 기반으로 하는 TALJsonDocument와 unicode string(UTF-16)을 기반으로 하는 TALJsonDocumentU가 있습니다.
예시:
{
_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: “Turing 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) -> [[1]] NodeSubType: TALJSONNodeSubType)
begin
case NodeSubType of -> [[3]] case NodeSubType of
nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings)); -> [[4]] nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings));
nstText: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString)); -> [[5]] nstText: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstObjectID: Writeln(Path + ‘=’ + ‘ObjectId(“‘+ALBinToHex(ansiString(Args[0].VAnsiString))+'”)’); -> [[6]] nstObjectID: Writeln(Path + ‘=’ + ‘ObjectId(“‘+ALBinToHex(ansiString(Args[0].VAnsiString))+'”)’);
nstBoolean: Writeln(Path + ‘=’ + ALBoolToStr(Args[0].VBoolean,’true’,’false’)); -> [[7]] 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)); -> [[8]] 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®을 사용하여 비트맵 이미지를 생성, 편집, 합성 또는 변환합니다. PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF 및 SVG를 포함하여 다양한 형식(200가지 이상)의 이미지를 읽고 쓸 수 있습니다. ImageMagick을 사용하여 이미지 크기 조정, 뒤집기, 미러링, 회전, 왜곡, 기울기 및 변환, 이미지 색상 조정, 다양한 특수 효과 적용 또는 텍스트, 선, 다각형, 타원 및 베지어 곡선 그리기 기능을 사용할 수 있습니다.
예시:
var aWand: PMagickWand;
begin
//ImageMagick 라이브러리 생성
alCreateImageMagickLibrary({alcinoe_rootdir} + ‘\lib\dll\imagemagick\win32\imagemagick’, min(2, System.CPUCount){aThreadLimit});
try
//wand 포인터 생성
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 클라이언트
MongoDB 데이터베이스를 위한 Delphi 클라이언트. MongoDB 서버에 접근하기 위한 Delphi 드라이버(연결 풀 포함). 연결 풀은 향후 데이터베이스에 대한 요청이 필요할 때 재사용할 수 있도록 유지되는 데이터베이스 연결의 캐시입니다. 연결 풀에서 연결이 생성되면, 해당 연결은 풀에 저장되어 재사용되며, 새로운 연결을 생성할 필요가 없습니다. 모든 연결이 사용 중인 경우, 새로운 연결이 생성되어 풀에 추가됩니다. 연결 풀은 사용자가 데이터베이스에 연결하는 데 필요한 시간을 줄여줍니다.
예시:
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;
예시: 꼬리(tail) 모니터링
aMongoDBTailMonitoringThread := TAlMongoDBTailMonitoringThread.Create(
aDBHost,
aDBPort,
‘test.cappedCollectionExemple’
‘{}’, // 쿼리
‘{fieldA:1, fieldB:1}’, // 반환 필드 선택자
절차 (Sender: TObject; JSONRowData: TALJSONNode)
begin
writeln('cappedCollectionExemple에 새 항목이 추가되었습니다: ' + JSONRowData.childnodes['fieldA'].text);
end,
절차 (Sender: TObject; Error: Exception)
begin
writeln(Error.message);
end);
….
aMongoDBTailMonitoringThread.free;
WebSocket 클라이언트
WinHTTP 기반으로 구현된 Delphi용 WebSocket 클라이언트입니다. WebSocket은 사용자의 브라우저와 서버 간에 양방향 대화형 통신 세션을 가능하게 하는 통신 프로토콜입니다. 이를 통해 서버에 메시지를 보내고 서버 응답을 폴링하지 않고도 이벤트 기반 응답을 받을 수 있습니다.
Fast TStringList
TALStringList는 Delphi의 TStringList와 동일하게 작동하지만, 목록이 정렬된 경우 빠른 정렬 알고리즘을 사용하여 이름=값 쌍을 검색할 수 있습니다. 또한 TALStringList는 Delphi의 TStringList에서 사용하는 AnsiCompareText 및 AnsiCompareStr 대신 로케일 독립적인 알고리즘(각 문자의 8비트 순서 값 기반)을 사용합니다. 결과적으로 TALStringList의 정렬 속도는 Delphi TStringList보다 최대 10배 빠릅니다. 또한 TALStringList는 Unicode TStringList가 아닌 100% Ansi StringList입니다.
TALNVStringList (NV는 NameValue의 약자)는 TALStringList와 동일하며(빠른 정렬 알고리즘 사용), 하지만 최적화가 문자열 목록 대신 이름/값 목록에 맞춰져 있습니다.
TALHashedStringList는 TALStringList와 동일하지만, 빠른 정렬 알고리즘 대신 내부 해시 테이블을 사용합니다. TALHashedStringList를 TALStringList 대신 사용하면 목록에 많은 문자열이 포함된 경우 성능을 향상시킬 수 있습니다(하지만 목록에 문자열이 많지 않은 경우 해시 계산 비용으로 인해 성능이 TALStringList보다 낮을 수 있습니다).
PHP 런너
ALPHPRunnerEngine는 Delphi 애플리케이션에서 PHP(모든 버전)를 스크립트 언어로 쉽게 사용할 수 있도록 하는 간단하지만 유용한 구성 요소입니다. ALPHPRunnerEngine을 사용하면 웹 서버 없이 Delphi 프로그램 내에서 PHP 스크립트를 실행할 수 있습니다. ALPHPRunnerEngine은 PHP 엔진과 통신하기 위해 PHP의 CGI/FastCGI 인터페이스(php-cgi.exe)를 사용합니다.
Memcached 클라이언트
memcached 데이터베이스를 위한 Delphi 클라이언트.
Memcached이란 무엇입니까? 무료 및 오픈 소스, 고성능, 분산 메모리 객체 캐싱 시스템으로, 일반적인 특성을 가지고 있지만 동적 웹 애플리케이션의 데이터베이스 부하를 줄여 성능을 향상시키는 데 사용됩니다.
Memcached는 데이터베이스 호출, API 호출 또는 페이지 렌더링 결과에서 얻은 작은 크기의 임의 데이터(문자열, 객체)를 저장하는 메모리 기반 키-값 저장소입니다.
Memcached는 간단하지만 강력합니다. 간단한 설계로 인해 빠른 배포, 쉬운 개발이 가능하며, 대용량 데이터 캐시에 대한 많은 문제를 해결합니다.
GSM 구성 요소
TAlGSMComm 구성 요소는 GSM 기술 사양 07.05, 버전 5.1.0(1996년 12월)에 정의된 텍스트 모드 인터페이스를 통해 SMS 문자 메시지를 구현합니다. 이 사양의 여러 변형이 있으며, Nokia, Siemens, Ericsson 등 다양한 모델에서 사용됩니다. 당사에서는 Nokia 6230 모델을 내부적으로 테스트했지만, Nokia 7190, 8890, 6210 및 9110 모델도 작동해야 합니다. 다른 제조업체의 전화기도 텍스트 모드 인터페이스를 구현하는 경우에도 작동합니다. 현재 전화기의 약 1/4가 PC에 연결할 수 있으며(IR 또는 시리얼 케이블을 통해), 이 중 약 1/3은 텍스트 모드만 지원하고, 1/3은 PDU 모드만 지원하며, 나머지 1/3은 텍스트 및 PDU 모드를 모두 지원합니다. 일부 전화기(예: Nokia 5190)는 SMS를 지원하지만, 독점 프로토콜을 사용하며, TALGSMComm에서는 해당 프로토콜을 지원하지 않습니다.
전화기를 테스트하려면, 전화기를 시리얼 케이블 또는 IR 장치를 통해 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/를 실행하여 속도 차이를 확인해 보세요.