ComboBox: button on each item (to remove an item from the list)

I need to add a button (maybe TSpeedButton?) For each ComboBox item. When one click on the button, the corresponding item is removed from the list. For instance:

enter image description here

I saw a similar discussion of SpeedButtons in string grids (here: TStringGrid with SpeedButtons ), but I don’t know how to implement all these things on ComboBox. Could you give me some tips or links for further reading on this topic.

+6
source share
1 answer

Aside from the user’s comments, regarding which I agree, resolving the issue is not so difficult.

You can do this by setting the Style property to csOwnerDrawFixed , drawing the elements in the OnDrawItem event OnDrawItem and deleting the selected element in the OnSelect event as follows:

 unit Unit1; interface uses Winapi.Windows, System.Classes, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.Imaging.PNGIMage; type TForm1 = class(TForm) ComboBox1: TComboBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ComboBox1Select(Sender: TObject); private FDeleteGraphic: TPNGImage; FDeleteRect: TRect; end; implementation {$R *.dfm} { TForm1 } procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin ComboBox1.Canvas.FillRect(Rect); if Index >= 0 then ComboBox1.Canvas.TextOut(Rect.Left + 2, Rect.Top, ComboBox1.Items[Index]); if (odSelected in State) and not (odComboBoxEdit in State) then begin FDeleteRect := Rect; FDeleteRect.Left := FDeleteRect.Right - FDeleteGraphic.Width; ComboBox1.Canvas.Draw(FDeleteRect.Left, FDeleteRect.Top, FDeleteGraphic); end; end; procedure TForm1.ComboBox1Select(Sender: TObject); var MousePos: TPoint; begin MousePos := ComboBox1.ScreenToClient(Mouse.CursorPos); MousePos.Offset(0, -ComboBox1.Height); if PtInRect(FDeleteRect, MousePos) then begin ComboBox1.Items.Delete(ComboBox1.ItemIndex); ComboBox1.Invalidate; end; end; procedure TForm1.FormCreate(Sender: TObject); begin FDeleteGraphic := TPNGImage.Create; FDeleteGraphic.LoadFromFile('H:\Icons\FamFam Common\Delete.png'); end; procedure TForm1.FormDestroy(Sender: TObject); begin FDeleteGraphic.Free; end; end. 

Using this result:

Screen shot

You may want to (re) save the previous ItemIndex parameter. Customize your wishes.

+5
source

Source: https://habr.com/ru/post/988341/


All Articles