Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

настоящий ComboBox в DBGride   Найти похожие ветки 

 
Инна   (2003-05-06 02:18) [0]

как сделать, чтобы настоящий комбобокс был ячейкой? настоящий в смысле - с той возможностью хранить ID (как здесь объяснялось как-то), а не только имена. я знаю, как сделать так, чтобы был выпадающий соответсвующий список, но потом тогда придется искать в таблице сообтветсвующий ID :((( не хотелось бы лишнего писать. Спасибо!


 
Zacho ©   (2003-05-06 06:34) [1]


> Инна (06.05.03 02:18)

Не совсем понял вопрос, но может быть подойдет обычное lookup поле в DataSet"е ?


 
VAleksey ©   (2003-05-06 08:56) [2]

Посмотри в книгах про поля lookup


 
Sergey Masloff   (2003-05-06 09:04) [3]

Усли не хочется lookup (а на это могут быть причины) то на событие OnDrawColumnCell можно нарисовать поверх ячейки что угодно - в том числе и обычный ComboBox.


 
Инна   (2003-05-06 11:13) [4]

да мне вроде лукап ни к чему. а как вот "то на событие OnDrawColumnCell можно нарисовать поверх ячейки что угодно - в том числе и обычный ComboBox."? я думаю этим вопросом довтали точно так же как и вопросом про цветной грид :), может статья какая есть? :)


 
Mike Kouzmine ©   (2003-05-06 11:15) [5]

А ячейка и есть комбобокс. Смотри PickList или что-то в этом роде.


 
Инна   (2003-05-06 11:24) [6]

Mike, если Вы про свойство в Columns, то я знаю, если нет, то не знаю. напишите, плз, подробней


 
Sergey Masloff   (2003-05-06 11:33) [7]

Mike Kouzmine ©
>А ячейка и есть комбобокс...
Тут несколько не то. Насколько я понял, есть желание записывать в Objects какие-то данные, и при выборе значения в базу вставлять не Strings[i] а Objects[i]. Так вот при использовании PickList это не совсем просто, так ведь? ;-))


 
Sergey   (2003-05-06 11:47) [8]

Masloff - дело говорит! Есть у комбобокса и гридовской ячейки что-то типа Баундс (точно не помню). Вот баундсы комбобокса надо к баундсам ячейки прилудить - это на ОнДроу, а в "других случаях" комбобокс делать инвизиблом! Такая ботва в Тейкстре и Ксавье, по-моему, балы подробно с примером описана.


 
Mike Kouzmine ©   (2003-05-06 12:04) [9]

Ну так и сделай список объектов, а при onchange в реальное поле вставляй из списка по ItemIndex.


 
Oops ©   (2003-05-06 12:05) [10]

Поставить Active=false для таблицы.
Даблклік на таблице (TTable) в которую надо вставить комбобокс,
клик правой кнопкой мыши по открывшемуся окну. Выбрать New Field (Ctrl+N). Выставить имя для нового поля, тип, Field Type поставить в "Lookup".
Key Fields - ID для лукапа,
Dataset - из какаго датасета выбирать поля для подстановки
Lookup Keys - значение какого поля должно пойти в датасет когда юзер чтото выберет из комбо бокса
Result Field - какое поле подставлять вместо указаного в Key Fiedls

Если у нас таблицы: item(iID,iName) move(mID,....);
и надо вместо в таблицу move подставлять вместо mID название етого mID, то получим:
Key Fields - mID,
Dataset - item
Lookup Keys - iID
Result Field - iName

Поставить Active=true для таблицы.

Больше в хелпе :)


 
Mike Kouzmine ©   (2003-05-06 12:07) [11]

только не onchange.
Хотя я бы сделал через Popup меню.


 
Sergey Masloff   (2003-05-06 12:24) [12]

Mike Kouzmine © (06.05.03 12:04)
>Ну так и сделай список объектов, а при onchange
>только не onchange.
так вот OnЧТО? ;-)

Oops ©
Все эти lookup потенциально ТАКИЕ тормоза что использовать их с оглядкой нужно. А есть случаи когда это вообще неприменимо.

Инна
Киньте на форму ComboBox, сделайте Visible:=False. В событии DrawColumnCell есть параметр типа TRect - прямоугольная область которую занимает ячейка. Соответственно в эту область перемещаете свой ComboBox и делаете Visible:=True. Ну и обработать пару событий. Писанины на 40 минут.


 
Danilka ©   (2003-05-06 12:27) [13]

Oops © (06.05.03 12:05)
>Dataset - из какаго датасета выбирать поля для подстановки
если я правильно понял, никакого датасета для подстановки нет, есть два списка один, с наименованиями, который надо отображать, воторй - с id, которые надо писать в базу.

честно говоря, для этого вижу два приемлемых пути:
1. писать свой грид, наследник от стандартного, в который добавить это возможность
2. использовать то, что написано другими, например DBGridEh - бесплатный для русскоговорящих. :)) в нем это реализовано ввиде двух свойств: KeyList и PickList


 
Danilka ©   (2003-05-06 12:29) [14]

Sergey Masloff (06.05.03 12:24)
прокатит, но как-то некрасиво, да и отображаться в столбце все равно будет id, хотя, есть варианты.


 
Sergey Masloff   (2003-05-06 12:44) [15]

Danilka ©
Прокатит еще как. И в столбце будет отображаться что нужно - думаешь, я не пробовал ;-) ID писать в invisible столбец естественно. Кроме того, я не пользовался DBGridEh но не уверен что там реализована наличествующая у меня возможность изменять вываливаемый пользователю список не только в зависимости от "столбца" но и от "строки". Только не надо говорить что это никогда не нужно - нужно сплошь и рядом. Например, в гриде список людей. И выпадающие списки должны быть разными в зависимости от того взрослый это или ребенок ;-)


 
Danilka ©   (2003-05-06 13:13) [16]

Sergey Masloff (06.05.03 12:44)
>ID писать в invisible столбец
ну, это я и имел ввиду, когда писал про варианты :))


 
Инна   (2003-05-06 23:58) [17]

все вставилось :) такой вопрос возник: можно ли как-нить данные сначала только отображать, а не сразу отправлять на сервер? т.е. юзер выбрал в нескольких ячйках и только потом оправлять на сервер? или только через вставку записи сразу в таблицу?
если интересно, то код (правда, кривовато как-то отображается... не тютелька-в-тютельку):
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (gdSelected in State) and (DBGrid1.SelectedField.FieldName="nm") then
with DBComboBox1 do
begin
Left := Rect.Left + DBGrid1.Left;
Top := Rect.Top + DBGrid1.top;
Width := Rect.Right - Rect.Left;
Height := Rect.Bottom - Rect.Top;
Visible := True;
SetFocus;
end


 
Danilka ©   (2003-05-07 08:38) [18]

Инна (06.05.03 23:58)
ну, можно немножко проще, у каждого насленика TWinControl есть свойство BoundsRect, можно переписать так:

with DBComboBox1 do
begin
BoundsRect:=Rect;
Visible := True;
SetFocus;
end;

а на счет данные сначала отображать, для этого есть Database.StartTransaction / Commit, про это посмотри в хелпе у TDatabase



 
NAlexey ©   (2003-05-07 08:59) [19]

Можно вопрос задать:
а вот это вот
with DBComboBox1 do получается что у вас комбобокс уже созданный? и просто болтается гдето инвизибле? И в определенное время, когда открывается InplaceEditor, вы его в нужном месте бабах и показали? Не терзают вас смутные сомнение что это не совсем правильно как то?


 
Danilka ©   (2003-05-07 09:17) [20]

NAlexey © (07.05.03 08:59)
а что, InplaceEditor каждый раз заново создается? ;))


 
Sergey Masloff   (2003-05-07 09:18) [21]

NAlexey © (07.05.03 08:59)
>Можно вопрос задать:
>а вот это вот
>with DBComboBox1 do получается что у вас комбобокс уже >созданный?
Ну естественно. И это самый правильный путь. Совершенно стандартная ситуация. Более того, создан он возможно и в далекой базовой форме - предке.


>Не терзают вас смутные сомнение что это не совсем правильно как >то?
Аргументы не совсем правильности в студию!



 
Danilka ©   (2003-05-07 09:18) [22]

NAlexey © (07.05.03 08:59)
хотя, согласен, что правильнее было-бы свой InplaceEditor нарисовать с необходимой функциональностью.


 
Инна   (2003-05-07 13:12) [23]

а у меня в BoundsRect:=Rect; почему-то не работает :( не ставится в ячейку.
и я через ADO связываюсь, там нет компонента DataBase.


 
Danilka ©   (2003-05-07 13:26) [24]

Инна (07.05.03 13:12)
да, с BoundsRect, похоже, я прогнал, сорри :))

а в АДО тоже доступны транзакции:
TADOConnection.BeginTrans
TADOConnection.CommitTrans
TADOConnection.RollbackTrans


 
Инна   (2003-05-07 13:37) [25]

я чего-то не понимаю... ну хорошо, пусть мы записываем данные до начала тарнзакции, но куда? я так понимаю, что в "просто" DBgrid их записать нельзя, a чтобы они появились в ADODataSet, нужно чтобы они уже были в таблице на серваке, т.к. они оттуда берутся для ADODataSet...


 
Danilka ©   (2003-05-07 13:40) [26]

Инна (07.05.03 13:37)
нет, мы стартуем транзакцию, пишем данные на сервер, но сервер их никому не покажет пока мы не сделаем commit. если же мы сделаем rollback, то сервер забудет про все изменения.


 
Инна   (2003-05-07 14:03) [27]

пойду, почитаю умное на тему, т.к. "но сервер их никому не покажет" вызывает вопросы :) всем спасибо за помощь!


 
Danilka ©   (2003-05-07 14:26) [28]

Инна (07.05.03 14:03)
старался обьяснить попроще. :))

Когда стартует транзакция, то она получает "снимок" сервера на момент старта.
Все изменения что она делает, происходят в этом "снимке", никакие другие клиенты этих изменений не видят.
Транзакцию можно завершить двумя способами:
Commit - мы говорим, что все изменения правильные, они становятся доступны для всех.
Rollback - все что мы делали с базой после старта транзакции будет отменено.

Вообще-то транзакции бывают разные, есть разные уровни изоляции, но пока хватит и этого. :))


 
Sergey Kornilov   (2003-05-08 08:19) [29]

А чем вас не устраивает настоящий ComboBox в DBGride? Вернее свойство ячейки PickList. Мне недавно нужно было программно данные из базы данных скидывать. Так очень просто получилось:
Объявляем переменную
var
MyList: TStringList;
.....
MyList := TStringList.Create;
заполняем MyList каким угодно способом
и наконец, для примера

DBGrid_Vagon_izm.Columns[12].PickList.AddStrings(MyList);

finally
MyList.Free;
end;
и всё.


 
NAlexey ©   (2003-05-08 09:05) [30]

>DBGrid_Vagon_izm.Columns[ 12].PickList.AddStrings(MyList);
Верно, но чтобы потомки не гневились, всеиаки жёсктко значимые значения надо стараться избегать использовать. Красота спасет мир таки...


 
Sergey Masloff   (2003-05-09 19:21) [31]

Sergey Kornilov
>MyList := TStringList.Create;
Это все бессмысленно. В PickList и так есть TStrings и если его возможностей хватает то еще один создавать не нужно.



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.015 c
14-95116
StarCon
2003-05-08 11:28
2003.05.29
Редактируемый DBGrid


1-94802
Smirnoff
2003-05-19 10:56
2003.05.29
TRegistry и сервис


14-95021
Пастор
2003-05-11 18:31
2003.05.29
Память, занимаемая программой


3-94723
AleksandrKu
2003-05-08 14:49
2003.05.29
Как через АДО подключиться к Pervasive серверу?


14-95105
LER
2003-05-07 12:49
2003.05.29
Задачка.