gpt4 book ai didi

delphi - Livebound 列表框保持为空,网格已填充

转载 作者:行者123 更新时间:2023-12-02 04:08:14 36 4
gpt4 key购买 nike

使用 Delphi Seattle,我试图在当前项目中掌握实时绑定(bind)的窍门,并创建了一个带有外部填充 TFDMemTable 的表单。 memTable 连接到 TGrid 和 TListbox。网格按应有的方式显示所有信息,但列表框保持为空。

我做错了什么?

代码(根据实际情况进行了简化,但仍然显示空列表框):

    unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Rtti, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
FireDAC.Stan.StorageBin, Data.Bind.EngExt, Fmx.Bind.DBEngExt, Fmx.Bind.Grid, System.Bindings.Outputs,
Fmx.Bind.Editors, Data.Bind.Components, Data.Bind.Grid, FMX.ListBox, Data.Bind.DBScope, Data.DB, FireDAC.Comp.DataSet,
FireDAC.Comp.Client, FMX.Layouts, FMX.Grid, FMX.Types, FMX.Controls, FMX.Controls.Presentation, FMX.StdCtrls,
FMX.Forms;

type
TForm1 = class(TForm)
fdmAccounts: TFDMemTable;
fdmAccountscode: TStringField;
fdmAccountsdesc: TStringField;
bsAccounts: TBindSourceDB;
Grid1: TGrid;
BindingsList1: TBindingsList;
ListBox1: TListBox;
LinkGridToDataSourcebsAccounts: TLinkGridToDataSource;
LinkFillControlToField1: TLinkFillControlToField;
procedure FormCreate(Sender: TObject);
private
FItemlist: TStringlist;
procedure Refreshlist(Sender: TObject);
procedure UpdateAccounts(afilter: string);
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.UpdateAccounts(aFilter: string);
var
s: string;
begin
with fdmAccounts do
begin
EmptyDataSet;

for s in FItemList do
begin
if aFilter.IsEmpty or s.Contains(aFilter) then
InsertRecord([s, '']);
end;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
FItemlist := TStringList.Create;
FItemlist.Delimiter := ',';
Fitemlist.DelimitedText := 'item1, item2, ander item3, laatste item';

fdmAccounts.Open;
Refreshlist(nil);
end;

procedure TForm1.Refreshlist(Sender: TObject);
begin
UpdateAccounts('');
end;

end.

实时绑定(bind)定义:

object BindingsList1: TBindingsList
Methods = <>
OutputConverters = <>
Left = 164
Top = 237
object LinkGridToDataSourcebsAccounts: TLinkGridToDataSource
Category = 'Quick Bindings'
DataSource = bsAccounts
GridControl = Grid1
Columns = <>
end
object LinkFillControlToField1: TLinkFillControlToField
Category = 'Quick Bindings'
Control = ListBox1
Track = True
FillDataSource = bsAccounts
FillDisplayFieldName = 'desc'
AutoFill = True
FillExpressions = <>
FillHeaderExpressions = <>
FillBreakGroups = <>
end

结束

我也尝试将 LinkFillControlToField1 的 FillExpression 设置为:

  FillExpressions = <
item
SourceMemberName = 'desc'
ControlMemberName = 'Text'
end>

但结果相同..空列表框

最佳答案

更新:

希望,如果您遵循这个示例,这是我第二次尝试使用LiveBindings 填充 TClientDataSet 中的 ListBox,您应该能够得到它也有效。您可能需要注意我在下面这个答案的原始版本中提到的填充 TStringGrid 的问题。

DFM 摘录

  object ListBox1: TListBox
Left = 8
Top = 320
Width = 121
Height = 97
ItemHeight = 13
TabOrder = 6
end
object DataSource1: TDataSource
DataSet = CDS1
Left = 128
Top = 24
end
object CDS1: TClientDataSet
Aggregates = <>
Params = <>
OnNewRecord = CDS1NewRecord
Left = 72
Top = 24
object CDS1ID: TIntegerField
FieldName = 'ID'
end
object CDS1Name: TStringField
FieldName = 'Name'
Size = 40
end
object CDS1Value: TStringField
FieldName = 'Value'
Size = 80
end
end
object BindSourceDB1: TBindSourceDB
DataSource = DataSource1
ScopeMappings = <>
Left = 216
Top = 32
end
object BindingsList1: TBindingsList
Methods = <>
OutputConverters = <>
Left = 72
Top = 96
object LinkListControlToField1: TLinkListControlToField
Category = 'Quick Bindings'
DataSource = BindSourceDB1
FieldName = 'Name'
Control = ListBox1
FillExpressions = <>
FillHeaderExpressions = <>
FillBreakGroups = <>
end
end

代码摘录

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
CDS1.IndexFieldNames := 'ID';
CDS1.CreateDataSet;

for i := 1 to 6 do begin
CDS1.Insert;
CDS1.FieldByName('Name').AsString := 'Name ' + IntToStr(i);;
CDs1.FieldByName('Value').AsString := 'Value ' + IntToStr(i);
CDS1.Post;
end;

CDS1.First;
StringGrid1.Invalidate;
end;

procedure TForm1.CDS1NewRecord(DataSet: TDataSet);
begin
Inc(NextID);
DataSet.FieldByName('ID').AsInteger := NextID;
end;

这和我之前的尝试之间唯一不同的是

LinkListControlToField1: TLinkListControlToField

我假设(事实证明这是错误的)TLinkListControlToField 用于TListViews,但它显然也适用于 TListViews

最初发布的答案

我不确定你做错了什么,LiveBindings 对我来说似乎有明显的错误 - 请参阅我对此问题的回答:Delphi TEdit to filter Tstringgrid with Access 。 stringrid 显示重复的 ID=6 的行,但没有显示 ID=5 的行,这一事实让我觉得不是特别有希望,因为这是一个如此明显的问题。

我也无法让 LiveBindings 与 ListBox 一起使用,我自己在新的西雅图 VCL 项目中从头开始或按照本文 http://edn.embarcadero.com/article/41707 进行操作。 。该文章的几个问题之一是它引用了“TBindScopeDB”组件,据我所知,该组件是不存在的。即使考虑到这可能是“TBindSourceDB”的拼写错误,当我尝试按照本文中的步骤操作时,我也没有得到所描述的结果,并且列表框当然不会被填充。

您可能想看看它提到的 SourceForge VCL 项目,https://radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE2/LiveBindings/bindlist 。我自己还没有尝试过,但它看起来比我想象的要复杂得多,尽管我不知道这是否是因为它是针对 XE2 的,而且 LiveBindings 从那时起就已经继续发展了。我确实查看了 DFM,并且我永远不会猜到表达式属性会被赋予它们的值,无论是从第一原理还是文章中所说的。我尝试在我的项目中使用它们,但列表框仍为空。

关于delphi - Livebound 列表框保持为空,网格已填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342196/

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