Example: WebGMapsLookupEdit1.LocationBias.Latitude := WebGMaps1.MapOptions.DefaultLatitude; WebGMapsLookupEdit1.LocationBias.Longitude := WebGMaps1.MapOptions.DefaultLongitude; WebGMapsLookupEdit1.LocationBias.Radius := 5000; WebGMapsLookupEdit1.LocationBias.BiasType := btStrict; |
This example uses the the Argon2, ed25519 and AES algorithms with the TArgon2KeyDerivation, TECCEncSign and TAESEncryption components. Alice wants to send a message to Bob, so she has his public key (he uses the ed25519 algorithm). The password can be requested to Alice using a dialog box. Alice can use the following function to encrypt a message to Bob : function EncryptMessageToBob(password: string; input: string; BobPublicKey: string): string; var aesKey: string; eccCipher, aesCipher : string; begin Argon2.StringSalt := '0123456789012345'; Argon2.outputFormat := raw; aesKey := Argon2.GenerateKey(password); ECC.PublicKey := BobPublicKey; eccCipher := ecc.Encrypt(aesKey); aes.Key := aesKey; aesCipher := aes.Encrypt(input); Result := eccCipher + '+' + aesCipher; end; To decrypt Alice’s message, Bob can use the following function: function DecryptMessageFromAlice(input: string; BobPrivateKey: string): string; var eccCipher, aesCipher: string; aesKey: string; begin eccCipher := input.subString(0, Pos('+', input) - 1); aesCipher := input.subString(Pos('+', input), input.Length); ECC.PrivateKey := BobPrivateKey; aesKey := ecc.Decrypt(eccCipher); aes.Key := aesKey; Result := aes.Decrypt(aesCipher); end; In the subsequent messages, Alice and Bob can save the aesKey and not send the eccCipher string. |
You can use PlannerMonthView.DateAtXY() to convert mouse coordinates to a date clicked. Example: procedure TForm3.PlannerMonthView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var dt: TDateTime; begin if Button = mbRight then begin PlannerMonthView1.DateAtXY(x,y,dt); caption := DateToStr(dt); end; end; |
This requires putting the memo control on the memo dropdown editor for TAdvStringGrid in readonly mode after it was displayed. Default, this memo is not in readonly mode. To do this, the event handler for the dropdown on the dropdown editor can be assigned via: AdvStringGrid1.MemoDropDown.OnDropDown := MemoDropDown; and from this MemoDropDown event handler, the memo can be set in read only mode. The full code becomes: TForm1 = class(TForm) AdvStringGrid1: TAdvStringGrid; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure MemoDropDown(Sender: TObject; var acceptdrop: boolean); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AdvStringGrid1.DefaultEditor := edMemoDropDown; AdvStringGrid1.Options := advstringgrid1.Options + [goEditing]; AdvStringGrid1.Cells[1,1] := 'This is a long text in a cell that can be viewed (readonly) in the dropdown editor'; AdvStringGrid1.MemoDropDown.OnDropDown := MemoDropDown; end; procedure TForm1.MemoDropDown(Sender: TObject;var acceptdrop: boolean); begin AdvStringGrid1.MemoDropDown.Memo.ReadOnly := true; end; |
It is possible to move rows around in the grid via OLE drag & drop and the nice extra the user gets is a drag image of the rows being dragged during the drag & drop operation. This operation is enabled with the settings under grid.DragDropSettings. To drag entire rows within the grid, this is enabled via: grid.DragDropSettings.OleDropTarget := true; grid.DragDropSettings.OleDropSource := true; grid.DragDropSettings.OleEntireRows := true; To enable that rows within the grid are being moved with this drag & drop operation, these additional settings are required: grid.DragDropSettings.OleInsertRows := true; grid.DragDropSettings.OleRemoveRows := true; As this drag & drop operation is based on OLE drag & drop and makes as such interoperability with other Windows applications possible, the default information involved in the drag & drop is the cell text. This implies that with default settings, objects associated with cells are not moved within the grid. To enable this, set grid.Navigation.AllowFmtClipboard = true. With this flag, the full cell settings, i.e. text & properties and associated object are copied via the clipboard. The entire code to demonstrate this becomes: // event handler to show where cell objects are used procedure TForm1.gridGetCellColor(Sender: TObject; ARow, ACol: Integer; AState: TGridDrawState; ABrush: TBrush; AFont: TFont); begin if grid.Objects[acol,arow] = TObject(1) then begin abrush.Color := clRed; end; end; procedure TForm1.FormCreate(Sender: TObject); begin grid.LinearFill(false); grid.Objects[1,3] := TObject(1); grid.Objects[1,5] := TObject(1); grid.Objects[1,7] := TObject(1); grid.DragDropSettings.OleDropTarget := true; grid.DragDropSettings.OleDropSource := true; grid.DragDropSettings.OleEntireRows := true; grid.DragDropSettings.OleInsertRows := true; grid.DragDropSettings.OleRemoveRows := true; grid.Navigation.AllowClipboardAlways := true; // enable this to see cell objects being moved with drag & drop too grid.Navigation.AllowFmtClipboard := true; grid.Options := grid.Options + [goRowSelect]; end; |
When using TDBAdvRichEditor, this is expected to be connected to a binary blob field to persist the rich text in a database field. In this case, the data is persisted in the blob field as a binary Delphi object stream. It is thus required that it is connected to a binary blob field, otherwise, loading back the data from the blob will fail. If it is wanted that the data is persisted in a memo (text) field, you can do this by connecting a regular TAdvRichEditor to a non-visual component TDBAdvRichEditorRTFIO. This non-visual component will convert the TAdvRichEditor content to a text RTF stream and vice versa and as such a regular DB memo text field can be used for persisting the rich editor content. |
A full sample source application can be downloaded via: http://www.tmssoftware.net/public/TTMSFMXPDFLib.zip |
When reading blobs that contain text values, you might get undesired results given the confusion of what encoding to be used with the raw blob content. To make sure everything is correct, you should add the [DBTypeMemo] attribute to your mapped blob field/property: [DBTypeMemo] FMyBlob: TBlob; and then use AsUnicodeString property to read/write text: MyBlobValue := MyObject.MyBlob.AsUnicodeString; MyObject.MyBlob.AsUnicodeString := ‘Some value’; |
As always, we thank all users for the numerous inputs, feedback, comments and suggestions. This is an invaluable help to steer our developments here at TMS software. We continue to look forward to all your further communications to direct our team to provide you better tools and components for your needs.
Kind regards,
TMS software team
Email:
info@tmssoftware.com
Web: http://www.tmssoftware.com
Support, FAQ & Manuals: http://www.tmssoftware.com/site/support.asp