Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/32: Рейтинг темы: голосов - 32, средняя оценка - 4.97
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506

При нажатии на Lookup отобразить список доступных значений

27.01.2009, 16:24. Показов 5813. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Если у меня есть поле Lookup, как сделать что-бы когда нажимаешь на него появлялся список доступных значений???
2. Как измененить ширину столбцов в DBGrid (некоторые числа не влазят)(можно конечно растянуть, но делать это каждый раз неприкольно)???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.01.2009, 16:24
Ответы с готовыми решениями:

Как отобразить на экране список (combobox) доступных dsn для ms sql server
Привет, подскажите как отобразить на экране список(combobox) доступных dsn для ms sql server ?

Откуда берется список доступных полей при формировании почтового шаблона?
подскажите, пожалуйста. при регистрации клиента он может ввести свой населенный пункт - а в списке доступных полей при формировании...

Отобразить элементы при нажатии
Такая проблемка, есть тест, задача - нужно чтобы следующий вопрос появлялся только при ответе на предыдущий, не понимаю как это сделать, не...

9
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
27.01.2009, 17:24
1) я решал таким образом, но решение выдрал из проекта, так что могут быть косяки...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  TColumn *Column;
  TField* fld = SetTableField("MAT_KOD", (TTable*) tmpMt); // эту функцию необязательно использовать...
  fld->DisplayLabel = "";
  fld->FieldKind = fkLookup;
  fld->FieldName = "MAT_KOD";
  fld->LookupDataSet = tmpMt; // это запрос к таблице с запросами
  fld->LookupResultField = "MAT_KOD";   // 1
  fld->LookupKeyFields = "NUM_MATERIAL"; // 2 - эти поля должны быть в запросе, хотя можно юзать и целую таблицу
  fld->KeyFields = "NUM_MATERIAL";
  fld->DataSet = tbl;
  fld->Lookup = true;
  Column = Grid->Columns->Add();
  Column->Field = fld;
  fld->DisplayWidth = Wd[i];
  Column->Width = Wd[i];
  Column->Title->Caption = Name[i];
  Column->Title->Alignment = taCenter;
  Column->Alignment = taLeftJustify;
...
TField* SetTableField(AnsiString FName, TTable *Table)
{
  TField *FField;
  switch (Table->FieldByName(FName)->DataType) {
    case ftGuid:
      FField = new TGuidField(NULL);
      FField->FieldName = FName;
      FField->Size = Table->FieldByName(FName)->Size;
      break;
    case ftWideString:
      FField = new TWideStringField(NULL);
      FField->FieldName = FName;
      FField->Size = Table->FieldByName(FName)->Size;
      break;
    case ftString:
      FField = new TStringField(NULL);
      FField->FieldName = FName;
      FField->Size = Table->FieldByName(FName)->Size;
      break;
    case ftSmallint:
      FField = new TSmallintField(NULL);
      FField->FieldName = FName;
      break;
    case ftInteger:
      FField = new TIntegerField(NULL);
      FField->FieldName = FName;
      break;
    case ftWord:
      FField = new TWordField(NULL);
      FField->FieldName = FName;
      break;
    case ftFloat:
      FField = new TFloatField(NULL);
      FField->FieldName = FName;
      break;
    case ftCurrency:
      FField = new TCurrencyField(NULL);
      FField->FieldName = FName;
      break;
    case ftBCD:
      FField = new TBCDField(NULL);
      FField->FieldName = FName;
      FField->Size = Table->FieldByName(FName)->Size;
      break;
    case ftDate:
      FField = new TDateField(NULL);
      FField->FieldName = FName;
      break;
    case ftTime:
      FField = new TTimeField(NULL);
      FField->FieldName = FName;
      break;
    case ftTimeStamp:
      FField = new TSQLTimeStampField(NULL);
      FField->FieldName = FName;
      break;
    case ftDateTime:
      FField = new TDateTimeField(NULL);
      FField->FieldName = FName;
      break;
    case ftAutoInc:
      FField = new TAutoIncField(NULL);
      FField->FieldName = FName;
      break;
    case ftMemo:
    case ftFmtMemo:
      FField = new TMemoField(NULL);
      FField->FieldName = FName;
      break;
    case ftBoolean:
      FField = new TBooleanField(NULL);
      FField->FieldName = FName;
      break;
    case ftUnknown:
      break;
    case ftBytes:
      FField = new TBytesField(NULL);
      FField->FieldName = FName;
      break;
    case ftVarBytes:
      FField = new TVarBytesField(NULL);
      FField->FieldName = FName;
      break;
    case ftBlob:
      FField = new TBlobField(NULL);
      FField->FieldName = FName;
      break;
    case ftGraphic:
      FField = new TGraphicField(NULL);
      FField->FieldName = FName;
      break;
    case ftParadoxOle:
      break;
    case ftDBaseOle:
      break;
    case ftTypedBinary:
      break;
    case ftCursor:
      break;
  }
  return FField;
}
2) я обычно для трех разрешений сохраняю оптимальную ширину столбиков, а потом делаю так (ну там еще разные настройки для дбгрида есть):
C++
1
2
3
4
5
6
7
8
9
  for(int i = 0; i < 7; i++){
      Column = Grid->Columns->Add();
      Column->Field = fld;
      fld->DisplayWidth = Wd[i];
      Column->Width = Wd[i];
      Column->Title->Caption = Name[i];
      Column->Title->Alignment = taCenter;
      Column->Alignment = taLeftJustify;
  }
1
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
27.01.2009, 23:31  [ТС]
Я нашёл способ сделать Lookup так:
DBLClick по значку Table1 на форме (если table конечно), в появившемся окне жмём ctrl+F, потом ctrl+N. там создаём поле типа lookup. key fields - наше исходное поле, data set-уже другая таблица lookup keys и result field - поле аналогичное нашему полю.
таким образом мы на DBGrid'е получаем ещё одно поле такое же как наше, но уже LookUp, а исходное можно скрыть(наверное).при изменении нового поля изменяется и начальное.
Осталось тока узнать как скрыть исходное поле.
пробовал так как вы мне посоветовали но не разобрался:
Table1-в ней должно быть поле Lookup(Postx),
Table2-в ней содержатся своё поле Post имеющее орпеделённые значения
не пойму куда что писать(Table1,2,Postx,Post), и не понимаю поле lookup создаётся с нуля или как(просто если с нуля то появляется ошибка типа такого поля нет)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TColumn *Column;
  TField* fld = SetTableField("Postx", (TTable*) dm->Table1);
  fld->DisplayLabel = "";   
  fld->FieldKind = fkLookup;
  fld->FieldName = "Postx";
  fld->LookupDataSet = dm->Table1; 
  fld->LookupResultField = "Post";   
  fld->LookupKeyFields = "Post"; 
  fld->KeyFields = "Post";
  fld->DataSet = dm->Table2;
  fld->Lookup = true;
  Column = DBGrid1->Columns->Add();
  Column->Field = fld;
  fld->DisplayWidth = 30;
  Column->Width = 30;
  Column->Title->Caption ="1";
  Column->Title->Alignment = taCenter;
  Column->Alignment = taLeftJustify;
ещё в help'е нашёл
You can create a column that displays a drop-down list of values, similar to a lookup combo box control. To specify that the column acts like a combo box, set the column’s ButtonStyle property to cbsAuto. Once you populate the list with values, the grid automatically displays a combo box-like drop-down button when a cell of that column is in edit mode.
There are two ways to populate that list with the values for users to select:

You can fetch the values from a lookup table. To make a column display a drop-down list of values drawn from a separate lookup table, you must define a lookup field in the dataset. Once the lookup field is defined, set the column’s FieldName to the lookup field name. The drop-down list is automatically populated with lookup values defined by the lookup field.
You can specify a list of values explicitly at design time. To enter the list values at design time, double-click the PickList property for the column in the Object Inspector. This brings up the String List editor, where you can enter the values that populate the pick list for the column.

By default, the drop-down list displays 7 values. You can change the length of this list by setting the DropDownRows property.

Note: To restore a column with an explicit pick list to its normal behavior, delete all the text from the pick list using the String List editor.
но чёто не выходит(((
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.01.2009, 00:05
YAUHEN, нужно нажать на кнопку add all fields (вроде бы так зовется в редакторе полей), тогда билдер будет знать структуру таблицы, а, следовательно, и лукапы создавать... я тебе дал метод формирования таблицы налету
0
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
28.01.2009, 14:01  [ТС]
а когда нажал add all fields, выбрал нужное обычное поле, как из него сделать Lookup??? Я менял пару параметров но постаянно выдаёт ошибки (((
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.01.2009, 15:19
так, давай подробно - что за ошибка, какой компонент юзаешь для лукапа... я привел пример для дбгрида... а тебе для какого надо... и лукап привязывается к полю из таблицы, а не переделывается из существующих
0
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
28.01.2009, 16:42  [ТС]
WooDooMan извини, я только теперь понял что, то что я хотел сделать называется PickList но появилась новая проблема:
что бы сделать PickList, я создал переменную типа TStrings и загржаю туда из другой таблицы все нужные значения
я написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TStrings *sl;
 
void addsl(TStrings *sl)
{
dm->Table2->First();    //dm-это DataModule
for(int i=1; i<=dm->Table2->RecordCount; i++)
{
sl->Add(dm->Table1->Fields->Fields[1]->AsString);
dm->Table2->Next();
}
}
...
addsl(sl);
DBGrid1->Columns->Items[5]->PickList=sl;
но при первом же выполнении sl->Add(dm->Table1->Fields->Fields[1]->AsString); появляется ошибка EAccessViolation.
что не так???
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.01.2009, 17:23
а вы sl вообще создаете через new?
0
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
28.01.2009, 19:18  [ТС]
sl=new TStrings[1], а как надо???

Добавлено через 36 минут 38 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TStringList *sl = new TStringList;
void asl(TStrings *sl,TTable *Table1,TTable *Table2)
{
Table2->First();
for(int i=1;i<=Table1->RecordCount+1;i++)
{
sl->Add((Table2->Fields->Fields[0]->AsString));
Table2->Next();
}
}
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
asl(sl,Table1,Table2);
DBGrid1->Columns->Items[5]->PickList=sl;
delete sl;
}
а TStrings как мне выдал Builder для моих целей не подходит
WooDooMan, спасибо большое за помощь!
0
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
06.02.2009, 22:41  [ТС]
я ещё хотел узнать по поводу форматирования столбцов:
как изменить размер уже существующего столбца?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2009, 22:41
Помогаю со студенческими работами здесь

При нажатии - отобразить картинку
При нажатии на строку DataGridView - отобразить картинку в PictureBox, При нажатии на другую строку - отобразить другую картинку. ...

При нажатии кнопки - отобразить строку
Всем, здрасте. Есть такой вот скрипт. Формирует таблицу: 1-ая строка: Заголовок-Автор-Стоимость и Кнопка 2-ая строка скрыта и...

Как в DataGrid отобразить часть доступных записей?
Имеется набор данных DataSet (100 записей) Как мне в DataGrid отобразить не все 100 записей, а только 10

При нажатии на кнопку отобразить многоугольник в PictureBox
Есть код написания многоугольника на vb.Что нужно дописать чтобы собственно этот код работал. При нажатии на кнопку в pctbox1 появлялся...

При нажатии кнопки отобразить на форме panel1
надо чтобы при нажатии button1 отобразилась скрытая панель, при повторном нажатии на кнопку скрыть её. и так открывать/закрывать. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru