转换为TObject

时间:2017-07-25 08:37:48

标签: sql delphi object

我正在努力在我的TComoBox中获取我的项目的ItemIndex ... 通常这对我来说似乎并不困难......但是当我尝试将我的String(我从SQL select中获取)转换为TObject时。这似乎不起作用。我尝试通过手动将String写入Object来调试我的代码,如下所示:

TObject('U');

以某种方式确实有效,我只是无法解释......

我填写ComoBox的方式:

for i := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
begin
    CBBelegart.AddItem(VerkaufTypenBez(i), Tobject(VerkaufTypenShort[i]));
end;

我尝试设置索引的方式:

CB.ItemIndex := CB.Items.IndexOfObject(TObject(SetIndexWithSQL('select top 1 * from KOMSAconfig_Allgemein', 'Belegart'))); //index = -1
helper := 'U';
CB.ItemIndex := CB.Items.IndexOfObject(TObject(helper)); //index = -1
CB.ItemIndex := CB.Items.IndexOfObject(TObject('U')); //index = 1

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

当您尝试使用可视控件时,就会发生这种情况,就好像它是一个通用容器一样。视觉控件仅用于显示和用户交互。不要试图弯曲它做更多的事情。

在您的方案中,尝试将第二个字符串添加到组合框中是没有意义的。别那样做。将填充的循环更改为:

for i := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
begin
  CBBelegart.Items.Add(VerkaufTypenBez(i));
end;

另一个字符串保存在类似结构的数组中,看起来可以这样访问:VerkaufTypenShort[i]。因此,如果要查找特定值的索引,可以这样做:

function GetIndexFromShortString(const Value: string): Integer;
begin
  for Result := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
    if VerkaufTypenShort[Result]=Value then
      exit;
  Result := -1;
end;

请注意,此功能完全独立于可视控件。您应该尽量使用可视化控件,并在不参考任何可视控件的情况下编写业务逻辑。

答案 1 :(得分:1)

你的问题似乎是从查询中得到两个字符串,其中一个用作显示文本,另一个用于内部查找(来自不同的查询)。

我认为有两种方法可以解决这个问题:

  • 更改您的第二个查询,因此它返回在combobox中使用的字符串
  • 在表单中查找连接两个字符串

对于第二个,您可以使用TDictionary。我的方法假设只在一个循环中填充组合框,并且没有动态添加或删除字符串。

将词典添加到表单中:

TForm1 = class(TForm)
...
private
  FLookUp: TDictionary<string, Integer>;

在FormCreate和FormDestroy事件中创建并销毁您的词典。

FLookUp := TDictionary<string, Integer>.Create;

FLookUp.Free;

在你用来填充Combobox的循环中,存储指数并将它们连接到你的查找字符串(我只是复制你的循环,假设它按原样工作)。

procedure TForm1.FillCombo;
var
  Index, I: Integer;
begin
  FLookUp.Clear;
  for i := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
  begin
    Index := CBBelegart.Items.Add(VerkaufTypenBez(i));
    FLookUp.Add(VerkaufTypenShort[i], Index);
  end;
end;

现在,您可以使用该词典查找正确的索引

function TForm1.GetIndexOfString(const Value: string): Integer;
begin
  if not FLookUp.TryGetValue(Value, Result) then
    Result := -1;
end;

一样使用它
CB.ItemIndex := GetIndexOfString(SetIndexWithSQL(...));