IPC_________________________________________________

Need to be able to communicate with another application on the same machine, no problem, just do:

[code=delphi]// init IPC server
srv := TPGIPCServer.Create;

// init IPC client
cli := TPGIPCClient.Create;

// event handler
procedure OnData(aData: Pointer; aSize: Integer; aHWnd: HWND); virtual;
procedure OnConnect(aHWnd: HWND); virtual;
procedure OnDisconnect(aHWnd: HWND); virtual;

// send data
procedure SendMessage(aData: Pointer; aSize: Integer; aHWnd: HWND); virtual;
[/code]

Using these classes and the event handlers you can do inter-process communication. An example of this is how I communicated between the command-line compiler and the IDE. Rather than capturing the output (which proved to be error prone) switching to IPC gave me more precise control in logical OOP fashion and worked much better.

Database_________________________________________________
Need to communicate with a database on a remote server, locally or just create a local database? No problem, you can do:

[code=delphi]// create database object
db := TPGDatabase.Create;

// set the type of database
db.Kind := dtMySQL; // or dtSQLite3

// use open for local database
db.Open(...);

// use connect for local & remoate mysql database
db.Connect(...);

// execute a query
db.ExecSQL(...)

// get a query result
tbl := GetTable(....)
[/code]

If you've done any remote database work you know that it can take some time to make the connection which will normally block your application, again PG has a solution, threaded support:

[code=delphi]function ThreadConnect(const aHost, aUser, aPassword, aDatabase: TPGString; aEventHandler: TPGDbThreadConnectEvent): Boolean; virtual;
function ThreadExecSQL(const aSQL: TPGString; const aArgs: array of const; aEventHandler: TPGDbThreadQueryEvent): Boolean; virtual;
function ThreadGetTable(const aSQL: TPGString; const aArgs: array of const; aEventHandler: TPGDbThreadQueryEvent): Boolean; virtual;
function ThreadStatus: TPGDbThreadStatus; virtual;
[/code]
These methods allow you to connect and query the database by pushing the operation in a background thread and allowing your application to continue running. When the operation completes or fails and event will fire.

Highscores_________________________________________________
The threaded support allows the TPGHighscore object to send and retrieve high scores without blocking your game. Oh yea, if you want high score support for your game, you can use the TPGHighscore class, which gives basic HS functionality. If you need more you can use the database support to make your own, locally or remote. Using the Highscore feature you can send your scores to a remote database then on your website you can use php for example to display those scores.

[code=delphi] TPGHighscore = class(TPGObject)
public
constructor Create; override;
destructor Destroy; override;
function Connect(const aHost, aUser, aPassword, aDatabase, aTable: TPGString): Boolean; virtual;
function Connected: Boolean; virtual;
procedure Close; virtual;
procedure ClearResults; virtual;
function DropTable: Boolean; virtual;
function Post(const aName: TPGString; aScore: Integer; aSkill: Integer; const aLocation, aDate: TPGString): Boolean; virtual;
function List(aSkill: Integer; const aStartDate, aEndDate: TPGString; aLimit: Integer): TPGDatabaseTable; virtual;
function LastError: TPGString; virtual;

function ThreadConnect(const aHost, aUser, aPassword, aDatabase, aTable: TPGString): Boolean; virtual;
function ThreadList(aSkill: Integer; const aStartDate, aEndDate: TPGString; aLimit: Integer): Boolean; virtual;
function ThreadPost(const aName: TPGString; aScore: Integer; aSkill: Integer; const aLocation, aDate: TPGString): Boolean; virtual;

function ThreadState: TPGHighscoreThreadState; virtual;
procedure ClearThreadState; virtual;

public
function GetDB: TPGDatabase; virtual;
property DB: TPGDatabase read GetDB;

function GetDBResults: TPGDatabaseTable; virtual;
property DBResults: TPGDatabaseTable read GetDBResults;
end;
[/code]

Data_________________________________________________
Need to handle large data sets in a sparse fashion, no problem, use a TPGSparseArray:

[code=delphi]// create array
dat := TPGSparseArray.Create;
...
// set some data
dat.Cells[99999,13443] := "Wow, this is HUGE";
dat.Cells[2343, 13] := 1234567;[/code]

A sparse array is what I use to handle the Unicode character set for the included FontStudio utility. By default a massive array would have to be created to hold the entire Unicode set (max int I think it was using) for each loaded font. NO, no that was to much. Sparse arrays to the rescue.