gpt4 book ai didi

delphi - 如何对 TComboBox 进行编程更改以与 LiveBindings 配合良好?

转载 作者:行者123 更新时间:2023-12-03 15:57:43 32 4
gpt4 key购买 nike

我有一个包含两个组合框的表单,两个组合框都包含相同的项目列表,并且需要彼此保持完美同步。 (它们代表 TPageControl 的两个不同选项卡上的相同选项列表。)

为了实现此目的,我设置了一个 LiveBinding 将两个控件绑定(bind)到 ClientDataset 的同一字段,该字段的存在除了保持此表单上的控件同步之外没有其他目的。我的 TBindingsList 为两个组合框都有一个 TLinkControlToField,将它们链接到同一字段。

只要我在 GUI 中进行所有更改,一切都会正常工作。

但是,如果不相关的操作更改了其中一个框的选择状态,它们就会不同步:

cboMainValue.Items.InsertObject(0, 'ALL', TObject(-1));
cboAltValue.Items.Clear;
cboAltValue.Items.Assign(cboMainValue.Items);
cboMainValue.ItemIndex := 0;
cboAltValue.ItemIndex := 0;

此后,无论出于何种原因,cboMainValue 显示预期文本,而 cboAltValue 保持空白(即 ItemIndex = -1)。

我尝试设置 Text 属性而不是 ItemIndex,并编辑 ClientDataset 上支持字段的值,但这些都不会产生不同的结果。

有谁知道如何以编程方式更改一个组合框的状态并使 LiveBindings 更新另一个组合框以匹配它?

最佳答案

我在西雅图的一个新创建的项目中尝试了你的代码,但它没有显示你描述的问题。我将其作为答案发布,因为它在 MCVE 意义上非常小,它的大部分设置都是在代码中进行的(因此 DFM 中没有潜伏的“有趣之处”),并且可能允许您“发现差异”与你的相比。

所以我认为你的问题的字面答案是“你现在的做法”。祝你好运!

顺便说一句,我个人认为 Tom Brunberg 的建议可能是一个更好的方法,但显然,最好能够弄清楚导致项目出现问题的原因。

代码:

type
TForm1 = class(TForm)
CDS1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
CDS1ID: TIntegerField;
CDS1Value: TStringField; // String 20 field
cboMainValue: TComboBox;
BindSourceDB1: TBindSourceDB;
DBNavigator1: TDBNavigator;
cboAltValue: TComboBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
LinkControlToField1: TLinkControlToField;
LinkControlToField2: TLinkControlToField;
end;
[...]
procedure TForm1.Button1Click(Sender: TObject);
begin
cboMainValue.Items.InsertObject(0, 'ALL', TObject(-1));
cboMainValue.Items.InsertObject(1, 'Other', TObject(-1));
cboAltValue.Items.Clear;
cboAltValue.Items.Assign(cboMainValue.Items);
cboMainValue.ItemIndex := 0;
cboAltValue.ItemIndex := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
cboMainValue.Items.Insert(0, 'apple');
cboMainValue.Items.Insert(1, 'orange');
cboMainValue.Items.Insert(2, 'banana');
cboAltValue.Items.Assign(cboMainValue.Items);

LinkControlToField1 := TLinkControlToField.Create(Self);
LinkControlToField1.DataSource := BindSourceDB1;
LinkControlToField1.FieldName := 'Value';
LinkControlToField1.Control := cboMainValue;

LinkControlToField2 := TLinkControlToField.Create(Self);
LinkControlToField2.DataSource := BindSourceDB1;
LinkControlToField2.FieldName := 'Value';
LinkControlToField2.Control := cboAltValue;

CDS1.CreateDataSet;
CDS1.InsertRecord([1, 'apple']);
CDS1.InsertRecord([2, 'banana']);
CDS1.InsertRecord([3, 'orange']);
end;

关于delphi - 如何对 TComboBox 进行编程更改以与 LiveBindings 配合良好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408781/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com