Best wishes for a happy & prosperous New Year from the TMS team! |
|
TMS software remains open during holiday season and support is standby for your most urgent questions.
|
|
The Recurrence and RecurringID properties of the TGCalendarItem are explained in the product manual PDF. Below you can find some extended information about these properties. New recurring events: Create a new event and simply assign a recurrence string to the Recurrence property and also fill in the relevant time zone in the TimeZone property. Then add the Event. Example:
var
li: TGCalendarItem;
begin
li := AdvGCalendar1.Items.Add;
li.Summary := 'Summary';
li.Description := 'Description';
li.Location := 'Location';
li.Recurrence := 'RRULE:FREQ=DAILY;COUNT=5';
li.TimeZone := 'Europe/Brussels';
li.StartTime := dtStart;
li.EndTime := dtEnd;
li.CalendarID := sCalendarID;
AdvGCalendar1.Add(li);
Existing recurring events: A recurrent item consists of two types of events. The first is the parent event which contains the Recurrence string. The second are the instances of the recurrent item. By design, only the instances are retrieved when requesting a list of events. To retrieve the parent item separately you can use the RecurringID property value of one of the instances as the ItemID parameter for the GetItemById call. |
|
Call "SearchFolder" with the folder name as a parameter. If that returns true, the first item of the "Drive" collection contains the required folder. Then call "Upload" with the folder object and the filename of the file to upload as parameters. Example:
if AdvGDrive.SearchFolder('FolderName') then
AdvGDrive.Upload(AdvGDrive.Drive.Items[0], 'FileName.ext');
|
|
To draw a custom tickmark at thumb position, drop a default TAdvTrackBar on the form and add following code:
procedure TForm2.AdvTrackBar1Change(Sender: TObject); begin
AdvTrackBar1.Invalidate;
end;
procedure TForm2.AdvTrackBar1DrawTick(Sender: TObject; Canvas: TCanvas;
Location: TPoint; Position: Integer; TickPos: TTickMark; var Length:
Integer;
var Color, TextColor: TColor; var Text: string; var DefaultDraw: Boolean); begin
if Position = AdvTrackBar1.Position then
begin
DefaultDraw := false;
Canvas.MoveTo(Location.X, Location.Y);
Canvas.Pen.Color := cLRed;
Canvas.Pen.Width := 3;
Canvas.LineTo(Location.X, Location.Y + 10);
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clBlack;
end;
end;
This will draw at thumb position a think red tickmark:
|
|
This sample project allows to perform direct & easy drag & drop of PlannerItems between two Planner instances
|
|
Below is an example of how you can add a custom JavaScript function with the OnInitHTML event. You can then call the function by using the ExecJScript call.
procedure TForm1.WebGMaps1InitHTML(Sender: TObject; var HTML: string);
begin
HTML := HTML + '<script>function sampleFunction(msg){alert(msg);}</script>';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebGMaps1.ExecJScript('sampleFunction("Hello World");');
end;
|
|
The TTMSFMXPlanner supports custom drawing in various areas such as the group, timeline and grid area. The code below demonstrates how to draw lines to separate groups which cover multiple positions.
procedure TForm1.TMSFMXPlanner1AfterDrawCellVerticalLine(Sender: TObject;
ACanvas: TCanvas; ARect: TRectF; ACol, ARow: Integer; AStartTime,
AEndTime: TDateTime; APosition: Integer; AKind: TTMSFMXPlannerCacheItemKind);
begin
ACanvas.StrokeThickness := 2;
if ARow = 5 then
begin
ACanvas.Stroke.Color := claRed;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
if ARow = 10 then
begin
ACanvas.Stroke.Color := claBlue;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
if ARow = 15 then
begin
ACanvas.Stroke.Color := claGreen;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
if ARow = 19 then
begin
ACanvas.Stroke.Color := claOrange;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Bottom - 1), PointF(ARect.Right, ARect.Bottom - 1), 1);
end;
end;
procedure TForm1.TMSFMXPlanner1AfterDrawGroup(Sender: TObject;
ACanvas: TCanvas; ARect: TRectF; AGroup, AStartPosition,
AEndPosition: Integer; AKind: TTMSFMXPlannerCacheItemKind);
begin
ACanvas.StrokeThickness := 2;
if AGroup in [1, 2, 3] then
begin
case AGroup of
1: ACanvas.Stroke.Color := claRed;
2: ACanvas.Stroke.Color := claBlue;
3: ACanvas.Stroke.Color := claGreen;
end;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
end;
procedure TForm1.TMSFMXPlanner1AfterDrawGroupEmptySpace(Sender: TObject;
ACanvas: TCanvas; ARect: TRectF; ASpace: TTMSFMXPlannerGroupEmptySpace);
begin
ACanvas.StrokeThickness := 2;
if ASpace = pgesTopRight then
begin
ACanvas.Stroke.Color := claOrange;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
end;
procedure TForm1.TMSFMXPlanner1AfterDrawPosition(Sender: TObject;
ACanvas: TCanvas; ARect: TRectF; APosition: Integer;
AKind: TTMSFMXPlannerCacheItemKind);
begin
ACanvas.StrokeThickness := 2;
if APosition = 5 then
begin
ACanvas.Stroke.Color := claRed;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
if APosition = 10 then
begin
ACanvas.Stroke.Color := claBlue;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
if APosition = 15 then
begin
ACanvas.Stroke.Color := claGreen;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
end;
procedure TForm1.TMSFMXPlanner1AfterDrawPositionEmptySpace(Sender: TObject;
ACanvas: TCanvas; ARect: TRectF; ASpace: TTMSFMXPlannerPositionEmptySpace);
begin
ACanvas.StrokeThickness := 2;
if ASpace = ppesTopRight then
begin
ACanvas.Stroke.Color := claOrange;
ACanvas.DrawLine(PointF(ARect.Left, ARect.Top), PointF(ARect.Right, ARect.Top), 1);
end;
end;
procedure TForm1.TMSFMXPlanner1Paint(Sender: TObject; Canvas: TCanvas;=const ARect: TRectF);
var
r: TRectF;
begin
Canvas.StrokeThickness := 2;
r := TMSFMXPlanner1.GetContentClipRect;
Canvas.Stroke.Color := claOrange;
Canvas.DrawLine(PointF(0, r.Bottom - 0.5), PointF(r.Right, r.Bottom - 0.5), 1);
end;
|
|
You can use the following code to to change the Pressed Color in TMSFMXSpeedButton:
procedure TForm1.TMSFMXSpeedButton1ApplyStyleLookup(Sender: TObject);
var
I: Integer;
c: TFMXObject;
txt: TText;
ca: TColorAnimation;
begin
txt := TMSFMXSpeedButton1.GetText;
txt.Color := claWhite;
c := TMSFMXSpeedButton1.GetBackGround;
for I := 0 to c.ChildrenCount - 1 do
begin
if c.Children[I] is TColorAnimation then
begin
ca := (c.Children[I] as TColorAnimation);
if ca.Trigger = 'IsMouseOver=true;IsPressed=true' then
begin
ca.StartValue := claBlue;
ca.StopValue := claGreen;
end;
if ca.Trigger = 'IsMouseOver=true;IsPressed=false' then
begin
ca.StartValue := claNull;
ca.StopValue := claRed;
end;
end;
end;
end;
![]() |
|
The TTMSFMXNativeUITableView has a toolbar property that can be set to True. When adding an item, you can then add it to the TableViewController instead of the NavigationController. Below is the source code that demonstrates this.
unit UDemo;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, iOSApi.Foundation,
FMX.TMSNativeUIBaseControl, FMX.TMSNativeUIView, FMX.TMSNativeUICore,
FMX.TMSNativeUIViewController, FMX.TMSNativeUINavigationController, FMX.TMSNativeUIToolBar,
MacApi.ObjectiveC, TypInfo, MacApi.ObjcRuntime, FMX.TMSNativeUITableView;
type
IUIToolBarButtonEventHandler = interface(NSObject)
['{1ACF3DFA-A90B-4F06-ACF1-8A40076BC9ED}']
procedure Click(Sender: Pointer); cdecl;
end;
TUIToolBarButtonEventHandler = class(TOCLocal)
protected
function GetObjectiveCClass: PTypeInfo; override;
public
procedure Click(Sender: Pointer); cdecl;
end;
TDemoForm = class(TForm)
TMSFMXNativeUITableView1: TTMSFMXNativeUITableView;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FEventHandler: TUIToolBarButtonEventHandler;
FHideButton: UIBarButtonItem;
public
{ Public declarations }
end;
var
DemoForm: TDemoForm;
implementation
{$R *.fmx}
procedure TDemoForm.FormCreate(Sender: TObject);
begin
FEventHandler := TUIToolBarButtonEventHandler.Create;
FHideButton := TUIBarButtonItem.Wrap(TUIBarButtonItem.Wrap(TUIBarButtonItem.OCClass.alloc).initWithBarButtonSystemItem(integer(siBarButtonSystemItemAdd),
FEventHandler.GetObjectID, sel_getUid('Click:')));
TMSFMXNativeUITableView1.Options.ToolBar := True;
TMSFMXNativeUITableView1.TableViewController.navigationItem.setRightBarButtonItem(FHideButton);
end;
{ TUIToolBarButtonEventHandler }
procedure TUIToolBarButtonEventHandler.Click(Sender: Pointer);
begin
ShowMessage('clicked');
end;
function TUIToolBarButtonEventHandler.GetObjectiveCClass: PTypeInfo;
begin
Result := TypeInfo(IUIToolBarButtonEventHandler);
end;
end.
![]() |
|
You might have some situations where you want to execute an SQL statement directly in the database, bypassing the object manager. Of course you could use the database access component directly (FireDac, dbExpress, ADO, etc.). But in case you want to keep the code abstract when it comes to the database access layer, and benefit from existing Aurelius connection, you can use IDBConnection to do so. Here is how you would do it:
uses {...}, Aurelius.Drivers.Interfaces;
var
Statement: IDBStatement;
Statement := Manager.Connection.CreateStatement;
Statement.SetSQLCommand(TheSQLStatement);
Statement.Execute;
If the statement is queryable, you can retrieve results using ExecuteQuery method which returns an IDBResultSet interface:
var
Statement: IDBStatement;
ResultSet: IDBResultSet;
Statement := Manager.Connection.CreateStatement;
Statement.SetSQLCommand(TheSQLStatement);
ResultSet := Statement.ExecuteQuery;
while ResultSet.Next do
Value := ResultSet.GetFieldValue(SomeFieldName);
Finally, for both types of commands you can set parameter values:
{...}
Params := TObjectList<TDBParam>.Create;
try
Statement := Manager.Connection.CreateStatement;
Params.Add(TDBParam.Create(‘id', ftInteger, 15));
Statement.SetSQLCommand(‘Delete from Customer Where Id = :id’);
Statement.SetParams(Params);
Statement.Execute;
finally
Params.Free;
end;
|
Kind regards,
TMS software team
Email:
info@tmssoftware.com
Web: http://www.tmssoftware.com
Support, FAQ & Manuals: http://www.tmssoftware.com/site/support.asp
|
|
|
|
|
|
|
![]() |