2013-04-15 33 views

Trả lời

9

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.LinesTListBox.Items) xuống từ TStrings, trong đó có cả StringsObjects 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. 
9

Đ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.

+0

comboboxes không cột chống đỡ, nhưng listboxes như một phần của combo làm – OnTheFly

+0

@ 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 –

+3

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ó. –

Các vấn đề liên quan