Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Комбо-бокс, значение id


Автор: nicka 28.6.2004, 16:48
Работаю в Дельфи7

хочу спросить, но для сравнения возьму Access. Там у ComboBox-а есть свойство value, в котором можно хранить id(записи из таблицы), при том это поле в ComboBox - можно закрыть, чтоб не было видно...

Здесь же, у ComboBox есть только свойство Text, допустим я присваиваю ему в ITems значения из таблицы(но куда мне спрятать id записи), оно мне нужно для дальнейшей подстановки выбранной в ComboBox-е записи куда нибудь...........


ДУмаю что кто то уже сталкивлся с подобным...довольно частый случай...подскажите чего делать?

Автор: Guest 28.6.2004, 17:00
nicka
А чем не нравиться DBComboBox ?

Автор: nicka 28.6.2004, 17:09
Цитата
А чем не нравиться DBComboBox ?


нет, мне не нужно постоянное соединение с базой,
и потом мне так легче....

если можно давайте совет имеено по TComboBox smile.gif

Автор: Albinos_x 28.6.2004, 20:36
Цитата
допустим я присваиваю ему в ITems значения из таблицы


Как ты это делаешь?

Говори подгобнее.

Работал с комбобоксом, но id мне не пиходилось прятать, так как и не было видно.

Автор: Guest 28.6.2004, 21:51
Код
Procedure get_order_types;
begin
 try
     fm_orders.ord_types.Open;
     while not fm_orders.ord_types.Eof do
     begin
         fm_orders.ord_type.Items.Add(fm_orders.ord_types.FieldByName('ord_type').AsString);
         fm_orders.ord_types.Next;
     end;
     fm_orders.ord_types.Close;   except
   on E: exception do
       begin
           Showmessage(Error: ' + E.message);
           halt;
       end;
   end;
end;

вот так и заполняю....а вот где хранить id записи для дальнейшего использования?

Автор: z-END 28.6.2004, 21:54
а может создать для этого массив где и хранить их?
и туда записывать значения id, а привязывать по ItemIndex?

Автор: Albinos_x 29.6.2004, 01:53
У TTable есть функция RecNo, обозначающая номер записи. Если не собираешся вставлять записи методом Insert (имеется ввиду вставлять в считываемую (fm_orders.ord_types) БД в ComboBox в процедуре использующей RecNo, т.к. номер записи может поменяться, в зависимости от того куда вставляешь, если используешь Append то можно), то в ComboBox свойство ItemIndex будет равно RecNo. Это свойство доступно как для чтения так и для присваивания, т.е. ты можешь как узнать номер активной записи, так и установить указатель на необходимую. Тогда тебе не надо будет хранить id, а считывать их по номеру записи.

Автор: nicka 29.6.2004, 15:50
Цитата
У TTable есть функция RecNo, обозначающая номер записи. Если не собираешся вставлять записи методом Insert (имеется ввиду вставлять в считываемую (fm_orders.ord_types) БД в ComboBox в процедуре использующей RecNo, т.к. номер записи может поменяться, в зависимости от того куда вставляешь, если используешь Append то можно), то в ComboBox свойство ItemIndex будет равно RecNo. Это свойство доступно как для чтения так и для присваивания, т.е. ты можешь как узнать номер активной записи, так и установить указатель на необходимую. Тогда тебе не надо будет хранить id, а считывать их по номеру записи.


честно говоря не совсем понятно...во первых я не использую TTable , а ипользую TADOQuery, может конечно у него тоже есть RecNo, только я не замечала, чтоб у моего ComboBox ItemIndex совпадал с RecNo запсиси в TADOQuery...???


Цитата
а может создать для этого массив где и хранить их?
и туда записывать значения id, а привязывать по ItemIndex?

вот это думаю можно попробовать, значит создать массив длинной в количество записей у TADOQuery и занести туда ItemIndex (0,1...) и id записи...так?
попробую посмотрим какие еще возникнут проблемы

Хотя странно , что эта проблема(довольно часто нужная в задачах по базам) не как то не удобно решена в Дельфи...

Автор: p0s0l 29.6.2004, 17:49
Вместо Items.Add делай Items.AddObject
типа такого будет:
Цитата
Procedure get_order_types;
begin
try
    fm_orders.ord_types.Open;
    while not fm_orders.ord_types.Eof do
    begin
        fm_orders.ord_type.Items.AddObject(fm_orders.ord_types.FieldByName('ord_type').AsString, TObject(fm_orders.ord_types.FieldByName('id').AsInteger));
        fm_orders.ord_types.Next;
    end;
    fm_orders.ord_types.Close;  except
  on E: exception do
      begin
          Showmessage(Error: ' + E.message);
          halt;
      end;
  end;
end;

Если id не integer, то будет посложнее...
Добавлено @ 17:53
Еще забыл сказать, что чтобы получить id i-ого элемента в combobox'е, то так: fm_orders.ord_type.Items.Objects[i]

Автор: nicka 29.6.2004, 18:03
p0s0l, круто, попробую smile.gif

Автор: nicka 30.6.2004, 16:00
p0s0l
Цитата
fm_orders.ord_type.Items.AddObject(fm_orders.ord_types.FieldByName('ord_type').AsString, TObject(fm_orders.ord_types.FieldByName('id').AsInteger));

это часть работает хорошо...


Цитата
Еще забыл сказать, что чтобы получить id i-ого элемента в combobox'е, то так: fm_orders.ord_type.Items.Objects[i]

а вот эта...не получаеться
вот например мне надо посадить в базу в таблицу значение id выбранной в combobox'е записи...
что мне туда подставить вместо i?

Автор: p0s0l 30.6.2004, 20:36
вместо i надо ставить fm_orders.ord_type.ItemIndex:
Код
var id : integer;
begin
 with fm_orders.ord_type do
   id := integer(Items.Objects[ItemIndex]);
 ... запись в таблицу этого id или какие-там-действия-нужны...
end;

Автор: nicka 1.7.2004, 15:47
p0s0l
Цитата
var id : integer;
begin
with fm_orders.ord_type do
  id := integer(Items.Objects[ItemIndex]);
... запись в таблицу этого id или какие-там-действия-нужны...
end;


попробую, я пробовала без integer, ыи выдавала ошибку не соответствия типов integer и Object...

Автор: nicka 1.7.2004, 16:30
Цитата
я пробовала без integer


я правда не применяла еще эту функцию,..она что переводит из Object в integer ?

Автор: <Spawn> 1.7.2004, 20:11
nicka Items.Objects[ItemIndex] - это массив указателей на экземпляры классов. В Дельфи при создании экземпляра класса возращается указатель(В Си можно без указателя обойтисьsmile.gif ). В данном случае производится операция явного преобразования типов из типа указателя в integer. Так как указатель занимает 4 байта(столько же занимает и integer), то данная операция вполне уместна. Тем более, что на самом деле там и лежит integer (вставка была такова - TObject(fm_orders.ord_types.FieldByName('id').AsInteger) ), то есть данный указатель не может быть использован по назначению, так как он указывал бы на несуществующие данные.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)