![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ни как не получается вставить долбанный ComboBox в DBGrid [D7, MSSQL]
Masha Streltsova © (2004-03-07 12:26:00)HELP помогите пожалуйста!!! Не как не получается вставить ComboBox в DBGrid.
Я пытаюсь вставить DBLookupcombobox и постоянно натыкаюсь на какие-то проблемы, то при скролинге грида DBLookupcombobox не исчезает то чё то ещё если не сложно скиньте исходничек с примерчиком мне на мыло: derliga@mail.ru, а то я повешусь.
ka3ax (2004-03-09 07:32:00) [1]2Petr Abramov
:)
Все верно. По ID страны выбираем записи.
ComboBox - с помощью него добавлять язык будет удобно, а вот как удалять?
Вариант YurikGl в данном случае - лучше (по-моему). Кнопку сделать в полях колонки, при нажатии на нее - показываем форму с гридом, содержащим языки для выбранной страны.
Хотя, можно и еще одну кнопку в поля этой колонки добавить - при нажатии на нее выпадает список с языками, при выборе из него языка - добавляем соответствующий язык к стране.
Sergey Masloff (2004-03-08 19:01:00) [2]Если все же в исходной постановке то я бы сделал так (хотя изначально в одном поде список - это уродство, но случаи разные бывают)
1) В гриде Column.ButtonStyle = cbsEllipses
2) При нажатии вызывается функция которая работает примерно так
function GetLng() : String;
begin
Result := '';
with TLngSrchForm.Create(Application) do
try
if (ShowModal = mrOK) then
Result := LangCode; // Это проперть поисковой формы
finally
Free();
end;
end;
TLngSrchForm -> Форма в которой юзер сможет выбрать язык. Я бы сделал с отбором то можно втупую грид со списком всех
3) Добавляем в значение поля еще один код и разделитель (например ;) то есть было "англ;" стало "англ;нем;"
4) Предусмотреть то что если юзер удаляет 1 символ - от нудаляет и все между окружающими разделителями.
Petr V. Abramov (2004-03-08 18:07:00) [3]> ka3ax (08.03.04 16:23) [20]
Оно все, конечно, складно, только ID связи все равно за уши притянуто - из таблицы связей все однозначно вытаскивается по ID страны :)
Много не пейте :)
Маша, с праздником!
YurikGl (2004-03-08 17:58:00) [4]Дополнение к [21]. Добавление языка можно сделать так. Выводится в grid (уже третьем) список всех языков и при нажатии клавиши "добавить" он добавляется в набор данных относящийся ко второму Grid, который был упомянут в [21].
З.Ы. Объяснять, по моему, вообще не умею :( Sorry
YurikGl (2004-03-08 17:55:00) [5]Я бы интерфейс сделал так. В первой форме высвечивается TGrid со странами. Рядом клавиша "Посмотреть языки". По нажатию этой клавиши выбрасывается другая форма, на которой в TGrid выводятся языки на котором говорят в стране, которая была выбрана в первой форме. Там же есть клавиша "добавить язык" Это - первый вариант.
Второй вариант. Оба Grid распологаются на одной форме, но содержание второго грида меняется на DataSource1DataChange (например) набора данных первого Gridа.
ka3ax (2004-03-08 16:23:00) [6]2Юрик и Петр. А Маша, кстати ее поздравляю с праздником, спрашивала по-моему не о структуре базы а о том как реализовать интерфейс :) А про нормализацию БД Маша наверное слыхала еще в университете чо там как ))
2Маша. Маша, все правильно, все ети варианты - нафик ты воопче не о том спрашивала в данном случае.
Но, на самом деле все просто. В этом случае всего лишь достаточно не пользоваться стандартом данным Вам со средой разработки. С Дельфи сто лет уж не робил, но из того что помню, рискну предположить (пусть меня осудят, но я уже три дня как поздравляю женщин - очч устал). На сколько я помню, ДБГрид есть наследник от КастомГрид. Проще всего в данном случае написать маленькую надстройку над дбгрид - в частности переопределить методы гетедиттекст и сетедиттекст. Смотрите поле которое Вас интересует, и при гет едит текст вставляете свой комбо бокс - то есть устанавливаете ему координаты ячейки, делаете видимым, посылаете CB_SHOWDROPDOWN (для облегчения действий, следует каждому елементу комбобокса, таг присвоить соответстующий ID языка) и выборе строки из этого комбо бокса - ))) языковому полю данной записи присваивать ID таблицы "Связи" - об этом писал ЮрикГЛ:)
Исчо придеца смареть событие перерисовки полей грида - если это твое многоязыковое поле, то ты вместо ID записи из таблицы СвязиЯзыкиСоСтранами пишешь ЯзыкНо1/ЯзыкНо2/.../Африканский.
Собсно все что я хотел сказать.
Простите если каво обидел, ноя уже пиян ((
Маша, с Праздником!
Petr V. Abramov (2004-03-08 15:06:00) [7]YurikGl © (08.03.04 15:02) [18]
:)
YurikGl (2004-03-08 15:02:00) [8]Ну хорошо :)
табл Связи
IdЯзык:целое
idСтрана:целое
Petr V. Abramov (2004-03-08 14:52:00) [9]Иногда удобно. А иногда он просто место жрет ( как в данном случае)
YurikGl (2004-03-08 14:40:00) [10]re [15]
В принципе, IdЯзык:целое idСтрана:целое однозначно определяют связь, но иногда удобно иметь "чистый" идентефикатор записи в качестве первичного ключа.
Petr V. Abramov (2004-03-08 14:27:00) [11]> YurikGl © (08.03.04 14:14) [14]
А к чему ID связи?
YurikGl (2004-03-08 14:14:00) [12]Пардон в [11]сдвинулось.
табл Страны
IdСтрана:целое
Название:строка
табл Языки
IdЯзык:целое
Название языка:строка
табл Связи
IdСвязи:целое
IdЯзык:целое
idСтрана:целое
Petr V. Abramov (2004-03-08 13:50:00) [13]пардон, простейший з апрос, конечно :)
Petr V. Abramov (2004-03-08 13:48:00) [14]> YurikGl © (08.03.04 12:28) [11]
> Есть еще один вариант. Реализовать связь многие-ко многим
Вот это уже на базу похоже
> но к подобным конструкциям тяжело составлять запросы.
К "сосискам" типа [8] к конечном итоге тяжелее
> select .... where (IdЯзык1=15 or IdЯзык2=15 or IdЯзык3=15)
Уже многословно и будет долго выполняться. И это простейший зопрос. Т.е. только самое начало геморроя.
YurikGl (2004-03-08 12:28:00) [15]re [9] А в MSSQL не работает что-ли
select .... where (IdЯзык1=15 or IdЯзык2=15 or IdЯзык3=15)
выберутся все страны, говорящие на языке с ID=15
re [10] Если максимальное количество языков, на котором могут говорить в одной стране не велико, то тебе подойдет вариант
табл Страны табл Языки
Название:строка IdЯзык:целое
IdЯзык1:целое Название языка:строка
IdЯзык2:целое
IdЯзык3:целое
IdЯзык4:целое
Есть еще один вариант. Реализовать связь многие-ко многим
табл Страны табл Языки табл Связи
IdСтрана:целое IdЯзык:целое IdСвязи:целое
Название:строка Название языка:строка IdЯзык:целое
idСтрана:целое
Если в стране 5 говорят на языке 6 то в таблице Связи должна быть запись idЯзык=6, idСтрана=5.
но к подобным конструкциям тяжело составлять запросы.
Masha Streltsova (2004-03-08 12:02:00) [16]zacho
> Именно для этого PickList точно подходит
а как отследить событие когда мы выбираем значение из PickList, чтобы не поменять значение в ячейке, а добавить?
не YurikGl © [8] эти варианты отпадают потому что там больше 100 языков
Petr V. Abramov (2004-03-07 23:46:00) [17]YurikGl © (07.03.04 22:03) [8]
И как же потом, зная ID языка, выбрать все страны, в которых на нем говорят? Учитывая, что человек с MSSQL работает, а не с Pidarox?
YurikGl (2004-03-07 22:03:00) [18]В твоем случае, на мой взгляд, нужно создать много столбцов типа boolean по числу языков. Если в столбце (напр. франц) записано true, то в этой стране говорят на францзском языке.
табл Страны
Название:строка
Франц:boolean
Нем:boolean
Англ:boolean
Второй вариант. Если в одной стране говорят не более чем на нескольких (3-4) языках то - создаешь справочник языков. В таблице стран делаешь нужное количество ссылок.
табл Страны табл Языки
Название:строка IdЯзык:целое
IdЯзык1:целое Название языка:строка
IdЯзык2:целое
IdЯзык3:целое
IdЯзык4:целое
Удачи
Zacho (2004-03-07 21:53:00) [19]Не понял. Именно для этого PickList точно подходит. А если значения надо взять из другой таблицы - то lookup поле в наборе данных.
Или возьми TDBGridEh из библиотеки EhLib - у него есть дополнительные возможности.
> Я пытаюсь вставить DBLookupcombobox
Не надо этого делать. Создай lookup поле. Хотя, в некоторых случаях, это очень не хорошо.
Masha Streltsova (2004-03-07 20:02:00) [20]например есть страны в них говорят на нескольких языках, а ячейка одна и в неё надо вписать 3 языка "англ./фр./нем." и эти языки надо выбрать из выпадающего списка вначале англ. потом фр. потом нем.
поэтому PickList точно не подходит