diff --git a/lcl/include/comboex.inc b/lcl/include/comboex.inc index 0c6f2e4fb5..9822fd829c 100644 --- a/lcl/include/comboex.inc +++ b/lcl/include/comboex.inc @@ -301,7 +301,7 @@ end; procedure TCustomComboBoxEx.AddItem(const Item: String; AnObject: TObject); begin Insert(ItemsEx.Count, Item); - ItemsEx[ItemsEx.Count].Data:=AnObject; + ItemsEx[ItemsEx.Count-1].Data:=AnObject; end; procedure TCustomComboBoxEx.AssignItemsEx(AItemsEx: TComboExItems); diff --git a/lcl/interfaces/cocoa/cocoatextedits.pas b/lcl/interfaces/cocoa/cocoatextedits.pas index 871e3e8d54..23c6d5d5f2 100644 --- a/lcl/interfaces/cocoa/cocoatextedits.pas +++ b/lcl/interfaces/cocoa/cocoatextedits.pas @@ -300,6 +300,8 @@ type { TCocoaReadOnlyComboBoxList } TCocoaReadOnlyComboBoxList = class(TCocoaComboBoxList) + private + FId: Integer; protected FOwner: TCocoaReadOnlyComboBox; procedure InsertItem(Index: Integer; const S: string; O: TObject); override; @@ -323,6 +325,7 @@ type isOwnerDrawn: Boolean; isOwnerMeasure: Boolean; + isComboBoxEx: Boolean; function acceptsFirstResponder: LCLObjCBoolean; override; procedure dealloc; override; function lclGetCallback: ICommonCallback; override; @@ -491,7 +494,16 @@ begin mn := FOwner.itemAtIndex(Index); if not Assigned(mn) then Exit; - astr := NSStringUtf8(S); + // for TComboBoxEx, the parameter S passed in is always emtpy, + // and NSPopUpButton always automatically sets the itemIndex according to + // the title, so a unique title needs to be set. + if not FOwner.isComboBoxEx then + astr := NSStringUtf8(S) + else + begin + astr := NSStringUtf8(FId.ToString); + inc(FId); + end; mn.setTitle(astr); astr.release; diff --git a/lcl/interfaces/cocoa/cocoawsstdctrls.pas b/lcl/interfaces/cocoa/cocoawsstdctrls.pas index ba4ccada67..e7d9335f7b 100644 --- a/lcl/interfaces/cocoa/cocoawsstdctrls.pas +++ b/lcl/interfaces/cocoa/cocoawsstdctrls.pas @@ -1880,6 +1880,7 @@ begin begin rocmb := NSView(TCocoaReadOnlyComboBox.alloc).lclInitWithCreateParams(AParams); if not Assigned(rocmb) then Exit; + rocmb.isComboBoxEx:= not (AWinControl is TComboBox); rocmb.list:=TCocoaReadOnlyComboBoxList.Create(rocmb); rocmb.setTarget(rocmb); rocmb.setAction(objcselector('comboboxAction:'));