I want to get A, B or C when its item is selected.
You are close. Since you are storing pointers to string literals, you just need to type-cast the stored
TObject pointers to
PChar:
procedure TForm1.ComboBox1Change(Sender: TObject);
var
Index: Integer;
begin
Index := ComboBox1.ItemIndex;
if Index <> -1 then
ShowMessage(PChar(Combobox1.Items.Objects[Index]))
else
ShowMessage('Nothing Selected');
end;
And select a item by code using A, B and C.
That is a little trickier. First instinct may be to use
IndexOfObject(), like this:
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(TObject('A'));
end;
However, as this is merely comparing pointers, this will only work when storing and searching string literals if the compiler merges duplicate string literals together so they have the same memory address. This won't work if you use a
String variable instead for the search, as the pointers will not match:
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
begin
S := ...;
ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(TObject(PChar(S)));
end;
In which case, you would have to loop and compare the stored string literals manually, eg:
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
Index, I: Integer;
begin
S := ...;
Index := -1;
for I := 0 to ComboBox1.Items.Count-1 do
begin
if S = PChar(ComboBox1.Items.Objects[I]) then
begin
Index := I;
Break;
end;
end;
ComboBox1.ItemIndex := Index;
end;
That being said, I would not recommend storing actual strings in the
Objects[] list at all. Better to use a separate
TStringList instead:
private
Values: TStringList;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
Values := TStringList.Create;
Values.Add('A');
Values.Add('B');
Values.Add('C');
Combobox1.Items.Add('Item A');
Combobox1.Items.Add('Item B');
Combobox1.Items.Add('Item C');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Values.Free;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
Index: Integer;
begin
Index := ComboBox1.ItemIndex;
if Index <> -1 then
ShowMessage(Values[index])
else
ShowMessage('Nothing Selected');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.ItemIndex := Values.IndexOf('A');
end;