Как добавить поле базы данных в Реал-тайм?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Dr_Grizzly
Сообщения: 406
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

08 июл 2014, 14:43

Добрый всем! Гуглю инет, и все не то, что надо... Есть Adoquery, перед запуском выполняю sql запрос на создание поля в базе данных "alter table ...". Когда программа запустилась - нужно дать ему название для заголовка в гриде и добавить его в грид ко всем имеющимся колонкам. При чем набор имеющихся колонок не полон, т.е некоторые скрыты. Здесь не подходит полная очистка и добавление всех полей имеющихся в базе... Какие есть решения подскажите плиз?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

08 июл 2014, 15:19

Эх! Лет 15 не брал в руки Delphi…
У Adoquery (как и у любых потомков TCustomDataset) есть коллекция columns (или что-то типа того)
Её можно заполнить design-time (когда в дизайнере у соотв.компонента настраиваются поля — заголовок, ширина и т.д.), а можно и runtime.
Что-нибудь типа

Код: Выделить всё

with MyDataset.Columns.Add(...) do begin
    index = 5;   // есть свойство отвечающее за позицию поля связанных в гридах. Вроде index
    title = 'заголовок'; // ну и всё остальное…
    width = …
end;
Dr_Grizzly
Сообщения: 406
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

09 июл 2014, 07:20

Ну я тож в этом направлении двигался методом подбора процедур и функций... У Ado есть набор fields,F ieldDefList, а у DbGrid есть набор columns. Но прикол в том, что у адо.fields.add не вызывается в режиме реал-тайм, т.к. это свойство только для чтения, как пишет дельфа) у грида когда добавляю колонку - слетают все остальные колонки и остается только та - которую добавил только что ))

А еще отмечу интересную вещь - у ado.fieldbyname('<имя поля>') указав ново-созданное поле в режиме реалтайм - вылетает ошибка о том, что данного поля не существует... Но если обратиться так - ado.FieldDefList.Find('<имя поля>') - то могу обратиться к свойствам - например displayname...
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Dr_Grizzly
Сообщения: 406
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

09 июл 2014, 08:42

я все кручусь где-то рядом... нашел еще кусок кода

Код: Выделить всё

var
Column: TColumneh;
begin
  Column := dbgrideh4.Columns.Add;
  Column.FieldName:='sk2';
добавляет поле новое, но убивает все остальные поля )

Соображаю над алгоритмом - сохранить настройки полей, добавить новое поле, восстановить настройки полей
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Dr_Grizzly
Сообщения: 406
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

09 июл 2014, 09:14

Ура товарищи! Ура! Решил я проблему ))) В дизайнере у грида - добавил изначально колонки в columns и теперь метод Add добавляет новую колонку в конец грида ))) Спасибо всем!)

ээээх, рано радовался я.... колонка в грид добавилась, но не имеет реальной привязки к колонке в базе данных... и тут же еще проблема возникла - как обратится к данной колонке чтобы внести/изменить запись в базу данных.... ado.fieldbyname('sk2').value - не находит такое поле.
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Ответить