Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Вниз

настоящий 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.008 c
4-95163
mazepa
2003-04-02 14:51
2003.05.29
readfile


4-95157
Mali
2003-03-28 16:10
2003.05.29
Убрать иконку из трея


3-94740
Endi
2003-05-10 11:34
2003.05.29
Вставка отсортированной выборки


3-94767
Cranium
2003-05-08 18:10
2003.05.29
TIMESTAMP в Yaffil


14-95043
Ежик
2003-05-09 10:46
2003.05.29
А где именинники сегодня?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский