Example: var plit: TPlannerItem; begin plit := planner1.CreateItem; plit.itembegin := 4; plit.itemend := 6; plit.itempos := 0; plIt.Edit; end; |
To do this, enable HoverButtons and implement the OnHoverButtonsRow event that is triggered when the mouse hovers a cell. Here it is possible to control whether hover buttons are shown with the Allow event parameter and from this event, the grid.HoverButtons property can be used to customize hover buttons per cell. The code to show different hover buttons only for column 4 and 6 is therefore: procedure TForm1.AdvStringGrid1HoverButtonsShow(Sender: TObject; X, Y: Integer; var Allow: Boolean); var c,r: integer; begin AdvStringGrid1.MouseToCell(x,y,c,r); if c = 4 then begin // configure hover buttons here for column 4 AdvStringGrid1.HoverButtons.Buttons[0].Caption := 'A'; AdvStringGrid1.HoverButtons.Buttons[1].Caption := 'B'; AdvStringGrid1.HoverButtons.Column := 4; end else if c = 6 then begin // configure hover buttons here for column 6 AdvStringGrid1.HoverButtons.Buttons[0].Caption := 'C'; AdvStringGrid1.HoverButtons.Buttons[1].Caption := 'D'; AdvStringGrid1.HoverButtons.Column := 6; end else Allow := false; end; procedure TForm1.FormCreate(Sender: TObject); begin AdvStringGrid1.HoverButtons.Enabled := true; AdvStringGrid1.HoverButtons.Buttons.Clear; AdvStringGrid1.HoverButtons.Buttons.Add.Caption := '0'; AdvStringGrid1.HoverButtons.Buttons.Add.Caption := '1'; AdvStringGrid1.AutoNumberRow(0); AdvStringGrid1.LinearFill(false); end; |
Example: begin AdvStringGrid1.Cells[1,1] := 'Hello world'; AdvStringGrid1.CellToRich(1,1, AdvStringGrid1.RichEdit); AdvStringGrid1.RichEdit.SelStart := 6; AdvStringGrid1.RichEdit.SelLength := 5; AdvStringGrid1.RichEdit.SelAttributes.Color := clRed; AdvStringGrid1.RichToCell(1,1, AdvStringGrid1.RichEdit); end; |
The DataObject can hold any object you like, but you are responsible for cleaning up any references to avoid memory leaks. A typical use: type TPerson = class FName: string; FBirthDay: TDateTime; public constructor Create(AName: string; ABirthDay: TDateTime); property Name: string read FName; property BirthDay: TDateTime read FBirthDay; end; ... implementation ... procedure TForm1.FormCreate(Sender: TObject); var I: Integer; n: TAdvCheckedTreeViewNode; begin FPersons := TObjectList<TPerson>.Create; FPersons.Add(TPerson.Create('Tom Jones', EncodeDate(2016, 1, 1))); FPersons.Add(TPerson.Create('John Appleseed', EncodeDate(2016, 1, 2))); AdvCheckedTreeView1.Nodes.Clear; AdvCheckedTreeView1.Columns[0].Text := 'Name'; AdvCheckedTreeView1.Columns.Add.Text := 'Birthday'; for I := 0 to FPersons.Count - 1 do begin n := TAdvCheckedTreeViewNode(AdvCheckedTreeView1.Nodes.Add); n.Text[0] := FPersons[I].Name; n.Text[1] := DateToStr(FPersons[I].Birthday); n.CheckTypes[0] := tvntCheckBox; n.DataObject := FPersons[I]; end; end; { TPerson } constructor TPerson.Create(AName: string; ABirthDay: TDateTime); begin FName := AName; FBirthday := ABirthDay; end; procedure TForm1.FormDestroy(Sender: TObject); begin FPersons.Free; end; procedure TForm1.AdvCheckedTreeView1AfterCheckNode(Sender: TObject; ANode: TAdvTreeViewVirtualNode; AColumn: Integer); var p: TPerson; begin if Assigned(ANode.Node) and Assigned(ANode.Node.DataObject) then p := TPerson(ANode.Node.DataObject); end; |
procedure TForm1.FormCreate(Sender: TObject); var c: TAdvTreeViewColumn; n: TAdvTreeViewNode; I: Integer; begin AdvCheckedTreeView1.BeginUpdate; AdvCheckedTreeView1.Columns.Clear; c := AdvCheckedTreeView1.Columns.Add; c.Text := 'Col 1'; c := AdvCheckedTreeView1.Columns.Add; c.Text := 'Col 2'; c := AdvCheckedTreeView1.Columns.Add; c.Text := 'Col 3'; AdvCheckedTreeView1.Nodes.Clear; AdvCheckedTreeView1.NodesAppearance.LevelIndent := 0; AdvCheckedTreeView1.NodesAppearance.ExpandWidth := 0; AdvCheckedTreeView1.NodesAppearance.ExpandHeight := 0; AdvCheckedTreeView1.NodesAppearance.ShowLines := False; AdvCheckedTreeView1.NodesAppearance.SelectionArea := tsaFull; for I := 0 to 9 do begin n := AdvCheckedTreeView1.Nodes.Add; n.CheckTypes[0] := tvntCheckBox; n.Text[0] := 'Item ' + inttostr(I); n.Text[1] := 'Item ' + inttostr(I); n.Text[2] := 'Item ' + inttostr(I); end; AdvCheckedTreeView1.EndUpdate; end; |
The number of waypoints is limited to 8. When an API key is assigned, up to 23 waypoints are allowed. This is a limitation of the Google Directions API which we have no control over. Example: WebGMaps1.APIKey := 'abc'; https://developers.google.com/maps/documentation/directions/usage-limits |
procedure TForm3.FormCreate(Sender: TObject); var I: Integer; begin for I := 0 to TMSFNCListBox1.Items.Count - 1 do TMSFNCListBox1.Items[I].DataInteger := RandomRange(1, 6) end; procedure TForm3.TMSFNCListBox1AfterDrawItem(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCListBoxItem); var r: Integer; I: Integer; bmp: TBitmap; rrt: TRectF; begin r := AItem.DataInteger; bmp := TMSFNCBitmapContainer1.FindBitmap('rating'); for I := 0 to r - 1 do begin rrt := RectF(Round(ARect.Right - ((bmp.Width + 4) * (I + 1))), Round(ARect.Top + (ARect.Height - bmp.Height) / 2), Round(ARect.Right - ((bmp.Width + 4) * I)), Round(ARect.Top + (ARect.Height - bmp.Height) / 2 + bmp.Height)); AGraphics.DrawBitmap(rrt, bmp); end; end; |
You could accomplish this by using the following code. procedure TForm1.FormCreate(Sender: TObject); begin TMSFMXDirectoryTreeView1.Filter := ''; TMSFMXDirectoryTreeView1.LoadDirectory('E:\'); TMSFMXDirectoryTreeView1.Sort(0, True, True, nsmDescending); end; procedure TForm1.TMSFMXDirectoryTreeView1AfterExpandNode(Sender: TObject; ANode: TTMSFMXTreeViewVirtualNode); begin TMSFMXDirectoryTreeView1.Sort(0, True, True, nsmDescending); end; procedure TForm1.TMSFMXDirectoryTreeView1NodeCompare(Sender: TObject; Node1, Node2: TTMSFMXTreeViewNode; AColumn: Integer; var ACompareResult: Integer); var n1: TTMSFMXDirectoryTreeViewNode; n2: TTMSFMXDirectoryTreeViewNode; begin n1 := TTMSFMXDirectoryTreeViewNode(Node1); n2 := TTMSFMXDirectoryTreeViewNode(Node2); ACompareResult := AnsiCompareStr(ExtractFileExt(n1.FileName), ExtractFileExt(n2.FileName)); if ACompareResult = 0 then ACompareResult := AnsiCompareStr(n1.StrippedHTMLText[AColumn], n2.StrippedHTMLText[AColumn]); ACompareResult := ACompareResult * -1; end; |
Did you know that Delphi compiler warning "W1035 Return value of function '%s' might be undefined" works only with simple types like integers, but never work for managed types like strings or interfaces? Using FixInsight's rule W521 you can handle ANY type: function TForm1.TestInteger: Integer; begin end; Delphi Compiler: W1035 Return value of function 'TForm1.TestInteger' might be undefined FixInsight: W521 Return value of function 'TForm1.TestInteger' might be undefined function TForm1.TestString: string; begin end; Delphi Compiler: NOTHING FixInsight: W521 Return value of function 'TForm1.TestString' might be undefined |
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