Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

настоящий ComboBox в DBGride [D6, MSSQL]


Страницы:   1 2

Инна ©   (2003-05-06 02:18:00) 

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


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

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


NAlexey   (2003-05-08 09:05:00) [2]

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


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

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

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

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


Danilka   (2003-05-07 14:26:00) [4]

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

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

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


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

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


Danilka   (2003-05-07 13:40:00) [6]

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


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

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


Danilka   (2003-05-07 13:26:00) [8]

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

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


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

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


Danilka   (2003-05-07 09:18:00) [10]

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


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

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


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


Danilka   (2003-05-07 09:17:00) [12]

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


NAlexey   (2003-05-07 08:59:00) [13]

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


Danilka   (2003-05-07 08:38:00) [14]

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

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

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


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

все вставилось :) такой вопрос возник: можно ли как-нить данные сначала только отображать, а не сразу отправлять на сервер? т.е. юзер выбрал в нескольких ячйках и только потом оправлять на сервер? или только через вставку записи сразу в таблицу?
если интересно, то код (правда, кривовато как-то отображается... не тютелька-в-тютельку):
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-06 13:13:00) [16]

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


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

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


Danilka   (2003-05-06 12:29:00) [18]

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


Danilka   (2003-05-06 12:27:00) [19]

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

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


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

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо