Cách tạo TComboBox với hai cột có một trong các cột được ẩn để có thể giữ giá trị id cùng với mục thực tế trong đó? Và sau đó làm thế nào để có được giá trị id đó lập trình?Làm thế nào để tạo ra một combobox với hai cột (một ẩn) trong Delphi 7?
Trả lời
Không cần hai cột ở đây.
Bạn có thể tận dụng thực tế là TComboBox.Items
(giống như nhiều thứ khác trong Delphi, như TStringList
, TMemo.Lines
và TListBox.Items
) xuống từ TStrings
, trong đó có cả Strings
và Objects
tài sản. Objects
lưu trữ mọi thứ có kích thước là TObject
, là con trỏ.
Điều này có nghĩa bạn có thể lưu trữ giá trị số nguyên của bạn bằng cách đơn giản typecasting nó vào một TObject khi thêm nó, và typecasting nó trở lại một Integer khi lấy nó.
Something như thế này nên làm việc:
procedure TForm1.FormCreate(Snder: TObject);
var
i: Integer;
sItem: String;
begin
for i := 0 to 9 do
begin
sItem := Format('Item %d', [i]);
ComboBox1.Items.AddObject(sItem, TObject(i));
end;
end;
Để lấy giá trị:
procedure TForm1.ComboBox1Click(Sender: TObject);
var
Idx: Integer;
Value: Integer;
begin
Idx := ComboBox1.ItemIndex;
if Idx <> -1 then
begin
Value := Integer(ComboBox1.Items.Objects[Idx]);
// Do something with value you retrieved
end;
end;
Lưu ý rằng, kể từ khi Objects sở hữu thực sự có nghĩa là để lưu trữ đối tượng, điều này mang đến cho bạn rất linh hoạt. Dưới đây là một ví dụ (cố ý rất tầm thường) về việc lưu trữ thông tin liên hệ của khách hàng trong một cá thể đối tượng được liên kết và hiển thị nó trong các nhãn khi một mục từ một hộp danh sách được chọn.
unit Unit1;
interface
uses
Windows, Messages, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TCustomer=class
private
FContact: string;
FPhone: string;
public
constructor CreateCustomer(const AContact, APhone: string);
property Contact: string read FContact write FContact;
property Phone: string read FPhone write FPhone;
end;
TForm1 = class(TForm)
ListBox1: TListBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
lblContact: TLabel;
lblPhone: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TCustomer }
constructor TCustomer.CreateCustomer(const AContact, APhone: string);
begin
inherited Create;
FContact := AContact;
FPhone := APhone;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: Integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
ListBox1.Items.Objects[i].Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
lblContact.Caption := '';
lblPhone.Caption := '';
// Create some customers. Of course in the real world you'd load this
// from some persistent source instead of hard-coding them here.
ListBox1.Items.AddObject('N Company', TCustomer.CreateCustomer('Nancy', '555-3333'));
ListBox1.Items.AddObject('B Company', TCustomer.CreateCustomer('Brad', '555-1212'));
ListBox1.Items.AddObject('A Company', TCustomer.CreateCustomer('Angie', '555-2345'));
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
Cust: TCustomer;
begin
if ListBox1.ItemIndex <> -1 then
begin
Cust := TCustomer(ListBox1.Items.Objects[ListBox1.ItemIndex]);
lblContact.Caption := Cust.Contact;
lblPhone.Caption := Cust.Phone;
end;
end;
end.
Điều khiển ComboBox không hỗ trợ cột và bạn không cần cột ẩn để hoàn thành những gì bạn cần.
Thuộc tính TComboBox.Items
là số TStrings
hậu duệ. Nó có thể giữ cả hai giá trị chuỗi và các giá trị dữ liệu do người dùng xác định liên kết cùng một lúc, nhưng người dùng sẽ chỉ thấy các giá trị chuỗi trong giao diện người dùng. Sử dụng phương thức Items.AddObject()
để thêm chuỗi + giá trị ID vào danh sách, sau đó sử dụng thuộc tính Items.Objects[]
để truy xuất giá trị ID khi cần.
Ngoài ra, bạn chỉ có thể lưu trữ giá trị ID của mình trong một mảng riêng biệt có cùng số phần tử như ComboBox và sau đó sử dụng chỉ mục mục ComboBox để truy cập các giá trị mảng. Điều này đặc biệt quan trọng nếu bạn cần lưu trữ giá trị -1, vì giá trị cụ thể đó không thể truy xuất được từ thuộc tính Objects[]
của TComboBox
do cách thức triển khai phương thức getter, như Rob nói.
comboboxes không cột chống đỡ, nhưng listboxes như một phần của combo làm – OnTheFly
@ user539484 và có rất nhiều chết tiệt của comboboxes của bên thứ 3, cột hỗ trợ và hình ảnh và HTML và bất cứ điều gì khác. Vì vậy, chúng tôi phải giải thích nó hoặc là "cách tạo lớp combobox không cổ phần mới ..." hoặc "cách tạo ví dụ của cổ phiếu TCombobox để ...". Tôi cho sau –
Cẩn thận với việc cố gắng lưu trữ 'TObject (-1)' trong một hộp tổ hợp. Bạn có thể lưu trữ nó, nhưng bạn không thể lấy lại nó sau đó. Đó là giá trị hệ điều hành trả về như một lỗi khi nó không thể lấy một giá trị từ một hộp kết hợp, do đó, điều khiển VCL dịch nó thành một ngoại lệ khi bạn đọc nó. –