Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2009, 21:06   #1
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию Размещение информации из таблиц "Справочников" на форме для добавления-редактирования

Здраствуйте.

Firebird 2.1, Delphi 2007, FIBPlus 6.9.6
Есть табличка в БД часть колонок в которой это внешние ключи из таблиц справочников, большинство этих справочников выглядит одинаково
ID // ессно ид integer
Name // название varchar
Description // описание varchar

в общем то цель у меня простая выбрать из справочников данные, используя как можно меньше места на форме, ну и ресурсов тоже поменьше.
нужно отображать только имя, гдето хранить ид, и иметь возможность отобразить описание.
Думал, думал, и вот чтото такое придумал
для выбора Tcombobox, там же и ид храню, для описания Tstrings
и отображаю как Hint на том же комбобоксе
в общем это примерно так выглядит при создании формы

Код:
var
spradd:TpFIBQuery;
spr:TForm_edit;
begin
spradd := TpFIBQuery.Create(Self);
sprhint:=TStringList.Create;
spr := TForm_edit.Create(Self);
 try
    spradd.Database:=DM_MAIN.Fdb_main;
    spradd.Transaction:=DM_MAIN.FTrsn_select_main;
    spradd.SQL.Text:='select * from  sb_plan';
    spradd.ExecQuery;
    spr.ComboBox1.Clear;
 While not spradd.Eof do
  begin
    spr.ComboBox1.Items.addobject(spradd.FieldByName('name').AsString,TObject(spradd.FieldByName('ID').AsInteger));
    sprhint.Add(spradd.FieldByName('Description').AsString);
    spradd.Next;
  end;
 spr.ShowModal;
 finally
   spr.Free;
   spradd.Free;
   sprhint.Free;
 end;
sprhint это TStrings;
ну а на онселект для комбобокса меняю хинт
Код:
procedure TForm_edit.ComboBox1Select(Sender: TObject);
begin
ComboBox1.Hint:=sprhint.Strings[ComboBox1.ItemIndex];
end;
Всё работает, но у меня стойкое ощущение, что я гдето перемудрил, или недомудрил, или просто упустил.
Повторюсь. Нужно отображать только имя, гдето хранить ид, и иметь возможность посмотреть описание.
Подскажите пожалуйста, как подобное решают?

Последний раз редактировалось vovk; 11.06.2009 в 21:11.
vovk вне форума Ответить с цитированием
Старый 12.06.2009, 15:13   #2
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Если я правильно понял из кода, то ты просто заполняешь данными из таблицы ComboBox.
Попробуй использовать DBLookupCombobox, заполни у него Свойства ListSource (DataSource из которого будут браться данные для заполнения выпадающего списка), ListField (поле таблицы из которого будут браться данные для заполнения выпадающего списка) и KeyField (ключевое поле таблицы ID).
Gulik вне форума Ответить с цитированием
Старый 12.06.2009, 15:49   #3
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Спасибо конечно, но это не совсем то что нужно, верне совсем не то что нужно.

Я тут ещё подумал и поставил кнопочки да этиты по клику на кнопки создаю форму. На форме 2 кнопки, DBgrid, Dbsource, pFibDataset при создании открываю нужную таблицу и а от туда беру уже запись, ID записываю в tag эдита Name в текст, ну а описание в Hint, хотя это не обязательно при выборе видно и так. Так мне показалось получше.

(извените за невнятную речь )
vovk вне форума Ответить с цитированием
Старый 12.06.2009, 17:47   #4
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

а почему в переменных не хранишь?

Код:
var
   i : integer;
...
I:=spraddID.AsInteger;
Gulik вне форума Ответить с цитированием
Старый 12.06.2009, 18:28   #5
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

А зачем переменные создавать, отображать выбранное всё равно гдето надо, а у любого визуального компонента есть tag который разработчики в общемто и оставили "на всяйкий случай".
Меня просто большое количество форм напрягает,
тут же получается с первой открываем вторую с этой второй третью.
Хотя выбирать сейчас намного лучше стало, к тому же чтото мне подсказывает что эту формочку ещё в нескольки местах использовать удобно будет.
А большое количество переменных оно мне кажется не к лучшему, если без них обойтись можно ничего не теряя, читать потом сложнее, да и вообще.

Я и кнопочки хочу в эдитах нарисовать

Последний раз редактировалось vovk; 12.06.2009 в 18:39.
vovk вне форума Ответить с цитированием
Старый 13.06.2009, 14:56   #6
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

vovk при загрузки формы подвисание не замечается?
Evgeniy26 вне форума Ответить с цитированием
Старый 13.06.2009, 15:02   #7
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

нет ни капли, хотя тут ещё вопрос рассчитываю попробывать через инет, а пока в локалке какие там подвисания, в справочниках не так много записей.
Кстати транзакция для чтения у меня у всех одна и всегда активна, как думаете это правильно?
Форма создаётся в процедуре, передаю туда как параметры процедуры
имя таблицы и компонент который заполняю при закрытии (если запись выбрали конечно)

Последний раз редактировалось vovk; 13.06.2009 в 15:06.
vovk вне форума Ответить с цитированием
Старый 15.06.2009, 21:11   #8
sparta_2009
Новичок
Джуниор
 
Регистрация: 15.06.2009
Сообщений: 8
По умолчанию Tag

Tag - это ведь тоже по сути переменная (в объекте).
Просто свойство Tag использовать несколько неудобно.
Некоторые сторонние разработчики могут использовать данное свойство для своих целей. Сейчас для Вас это не важно, но кто знает...
Введите свой компонент и свойство любого типа.
Насчет форм - отслеживайте их по Handly или просто по заголовку - и не создавай новую, а если есть, то BringToFront или Activate.

Цитата:
Сообщение от vovk Посмотреть сообщение
А зачем переменные создавать, отображать выбранное всё равно гдето надо, а у любого визуального компонента есть tag который разработчики в общемто и оставили "на всяйкий случай".
Меня просто большое количество форм напрягает,
тут же получается с первой открываем вторую с этой второй третью.
Хотя выбирать сейчас намного лучше стало, к тому же чтото мне подсказывает что эту формочку ещё в нескольки местах использовать удобно будет.
А большое количество переменных оно мне кажется не к лучшему, если без них обойтись можно ничего не теряя, читать потом сложнее, да и вообще.

Я и кнопочки хочу в эдитах нарисовать
sparta_2009 вне форума Ответить с цитированием
Старый 15.06.2009, 21:21   #9
sparta_2009
Новичок
Джуниор
 
Регистрация: 15.06.2009
Сообщений: 8
По умолчанию Транзакция в FIBPlus

Одна транзакция на чтение нужна в одном случае -
пользователи не понимают, что это такое, а самое главное, что вы как разработчик коммитете транзакцию при любом изменении данных (хотя как таковых их вроде и нет).

Механизм транзакций (лекции...) расчитан на возможное предотвращение потери данных. Если все идет только на чтение,
то естественно ничего страшного на локалке (Если электрика защищена - все равно при чтении можно повредить данные - вирусы, сбой портов, сбой сервера и т.д.).
Для инета транзакции надо отдельно - данные можно повредить и при чтении (разный механизм взаимодействия между разными операционками и сетевыми протоколами) . Лучше для каждой открывающейся формы - отдельную транзакцию. Вдруг сбой памяти, указателя, сервера и т.д.

в справочниках не так много записей - И все дело не в количестве записей, а в типе записей (текст, видео, картинка, текст BLOB и т.д.) и собственно какой сервер.


Цитата:
Сообщение от vovk Посмотреть сообщение
нет ни капли, хотя тут ещё вопрос рассчитываю попробывать через инет, а пока в локалке какие там подвисания, в справочниках не так много записей.
Кстати транзакция для чтения у меня у всех одна и всегда активна, как думаете это правильно?
Форма создаётся в процедуре, передаю туда как параметры процедуры
имя таблицы и компонент который заполняю при закрытии (если запись выбрали конечно)

Последний раз редактировалось sparta_2009; 15.06.2009 в 21:27.
sparta_2009 вне форума Ответить с цитированием
Старый 15.06.2009, 21:50   #10
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
Сообщение от sparta_2009 Посмотреть сообщение
Tag - это ведь тоже по сути переменная (в объекте).
Просто свойство Tag использовать несколько неудобно.
Некоторые сторонние разработчики могут использовать данное свойство для своих целей.
Ну что переменная то понятно.. А вотпочему не удобно, в смысле что свойство публичное и доступно из других приложений? Я правильно понял?
А форма 1 подготовлена в дизайнере, но автоматом не создаётся, при выборе саздаю экземпляр после окончания работы сним free;

Цитата:
Сообщение от sparta_2009 Посмотреть сообщение
Одна транзакция на чтение нужна в одном случае -
пользователи не понимают, что это такое, а самое главное, что вы как разработчик коммитете транзакцию при любом изменении данных (хотя как таковых их вроде и нет).
Мне бы самому ещё понять полностью...
А большое количество транзакций для чтения никак на загруженность сервера не повлияет?
vovk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение "скрытой" информации из bmp Alex Cones Мультимедиа в Delphi 6 11.06.2009 11:07
Обновление набора данных после добавления в таблицу записей "внешней" программой dimmm БД в Delphi 5 21.04.2009 00:56
Как сделать так,чтобы на форме отображалось свободное место диска "С"???? Alexij Общие вопросы Delphi 4 11.07.2008 23:21
Как вырезать на форме область определенной формы ("что то вроде ножниц") dimfil Общие вопросы Delphi 9 10.11.2007 08:51