Вставить TDataSet в форму во время разработки - PullRequest
3 голосов
/ 19 октября 2010

Я ищу способ предоставления ListSource для TDBLookupComboBox в delphi без фактической таблицы на сервере базы данных, из которой можно составить этот список. Поле данных для поля со списком представляет собой 1-символьное поле, которое содержит закодированное значение, например «A» = «Водительское удостоверение», «B» = «Паспорт», «C» = «Библиотечная карточка» и т. Д. что таблица содержит только A, B или C. Приложение отвечает за отображение «водительских прав» в графическом интерфейсе. Обычно база данных может иметь справочную таблицу, но в этой базе нет, и я не могу ее добавить. Моя идея состоит в том, что DataSource и ListSource для элемента управления просмотра БД не обязательно должны быть одной и той же базой данных, поэтому, если бы можно было определить небольшую таблицу в моей форме, которая содержит данные поиска, то я мог бы использовать это не требует реальной таблицы базы данных.

Кто-нибудь знает о компоненте delphi, который позволяет определять TDataSet в форме без каких-либо фактических файлов данных за ней?

Ответы [ 4 ]

6 голосов
/ 19 октября 2010

Я знаю, что есть другой набор данных в памяти. Delphi поставляется с TClientDataSet, который вы можете использовать по своему усмотрению. Вы должны развернуть midas.dll вместе с исполняемым файлом, чтобы работать, или вы должны включить MidasLib в ваше предложение использования, чтобы статически связать эту библиотеку с вашим исполняемым файлом (не нужно midas.dll во время выполнения).

Чтобы получить то, что вы хотите от TClientDataSet, вы можете создать поля и:

  • сохранить записи в XML-файле (например, с помощью другого созданного вами вспомогательного инструмента). Во время выполнения загрузите данные с помощью метода LoadFromFile из TClientDataSet. Кроме того, вы можете сохранить этот xml как ресурс с помощью директивы $ R и манипулировать этим ресурсом во время выполнения, чтобы снабдить ваш ClientDataSet содержащимися данными, чтобы предотвратить развертывание (и возможное изменение) файла xml с вашим exe.
  • используйте метод CreateDataSet и вставляйте / заполняйте записи тем, что вы хотите во время выполнения

пример кода:

procedure TFrom1.Init;
begin
  cdsIDType.CreateDataSet;
  cdsIDType.InsertRecord('A', 'Drivers License');
  cdsIDType.InsertRecord('B', 'Passport');
  //etcetera.
end;
2 голосов
/ 19 октября 2010

Альтернативным решением является использование TComboBox, а не TDBLookupComboBox.Используйте TDictionary для определения простого поиска в памяти.

type
  TMyForm = class(TForm)
    MyComboBox: TComboBox;
    MyDataset: TSimpleDataSet;
    procedure MyComboBoxChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    ComboLookup: TDictionary<string, Char>;
  end;

implementation

{$R *.dfm}

procedure TMyForm.FormCreate(Sender: TObject);
var
  Key: string;
begin
  ComboLookup := TDictionary<string, Char>.Create;
  ComboLookup.Add('Drivers License', 'A');
  ComboLookup.Add('Passport', 'B');
  ComboLookup.Add('Library Card', 'C');
  for Key in ComboLookup.Keys do
  begin
    MyComboBox.Items.Add(Key);
  end;
end;

procedure TMyForm.MyComboBoxChange(Sender: TObject);
begin
  // This may be wrong didn't bother to look
  //up the correct way to change a field's value in code.
  MyDataset.Fields.FieldByName('IDCard').AsString := ComboLookup[MyComboBox.Text];
end;

Вы можете использовать TComboBox.Items.AddObject вместо отдельной таблицы поиска, но вам нужно будет создать класс-оболочку для хранения символа в качестве объекта TObject или использовать Chr для преобразования его в целое число, а затемприведите его к TObject, но вышесказанное, на мой взгляд, проще.

1 голос
/ 19 октября 2010

Используйте TClientDataset и определите поля, затем подключитесь к источнику данных. В событии oncreate формы сделайте это: выполнить метод созданного набора данных из клиентского набора данных, а затем заполнить его данными A, B, C.

0 голосов
/ 19 октября 2010

Если вы используете jvcl , то, что вы хотите, может быть достигнуто без использования набора данных.Просто используйте TjvDBComboBox, используйте свойство Items, чтобы установить значения, которые вы хотите, чтобы пользовательский интерфейс отображал, и используйте свойство Values, чтобы установить фактические значения, хранящиеся в базе данных.

...