powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот такая вот задача!
19 сообщений из 19, страница 1 из 1
Вот такая вот задача!
    #32612117
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел бы посоветоватся ... Решил замарочится одной штукой...

Сама задача (собственно): Динамически создавать форму, контролы на которой берутся в соответствии указанному DataSet... причем если это значение подставляемое (Id), то на форме соответветственно этому полю должен организовыватся какой нить ComboBox, если Data по соотв. DataTimeEdit ... ну и так далее...
Пример
ДатаСет :

Дата Возраст Пол

Форма

Дата DataTimeEdit
Возраст Edit
Пол ComboBox

мне кажеться кто нить полюбому задавался такой задачей, просто что бы ускорить свою работу ))
Решение не нужно, просто что бы не нарыватся на одни и теже грабли, хотелось бы послушать знающего человека...
Всем заранее спасибо! )
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612128
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел бы посоветоватся ... Решил замарочится одной штукой...

Сама задача (собственно): Динамически создавать форму, контролы на которой берутся в соответствии указанному DataSet... причем если это значение подставляемое (Id), то на форме соответветственно этому полю должен организовыватся какой нить ComboBox, если Data по соотв. DataTimeEdit ... ну и так далее...
Пример
ДатаСет :

Дата Возраст Пол

Форма

Дата DataTimeEdit
Возраст Edit
Пол ComboBox

мне кажеться кто нить полюбому задавался такой задачей, просто что бы ускорить свою работу ))
Решение не нужно, просто что бы не нарыватся на одни и теже грабли, хотелось бы послушать знающего человека...
Всем заранее спасибо! )
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612132
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/topic/108310
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612156
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а в чем проблема ?

1 решение которое я вижу , это набрасать контролы ,
сделать их невидимыми и когда нужно показывать.


и второе это все нужно для последующего редактирования ?



 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612217
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда ты набрасываешь контролы ты уже к ним привязван...

Я имею ввиду конструкцию динамического создания контрола и распределения на форме (взависимости от типа данных поля)... Что бы было к примеры 1000 представлений, и один код который реализует заполнение динамической формы динамическими контролами... :-)) И главное что бы это было универсально и быстро! ) Один раз вот так потратив время можно в последствии создавать представления на сервере, и не морочиться с кодом клиентского приложения ...
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612357
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда , нужно
знать заранне что за тип поля и к нему уже заранее привязать контролл

вот тут вот , логику надобно продумать ...

ну вот допустим пример (то что в голову на данный момент пришло)
Код: plaintext
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.
есть табличка 
   table name,pol,data
либо еще дополнительная табличка 
  table_ctrl ctrl_name,ctrl_pol,ctrl_data
и табличка 
  controls id_ctrl [key] ,control [int]

   id_ctrl       control
       1            Tcombobox
       2            Tedit     
       3            tdatetimeedit  

dateset1
select * from table

dataset2
select * from tablectrl

сдесь пробегаемся по всем полям ...
и в соответсвии 

for (int i =  0  ;i<ADOQuery1->FieldCount;i++)
  {
    switch(ADOQuery1->Fields->FieldByNumber(i)->AsInteger)
    case  0 :
      TComboBox * combobox = new(TComboBox);
       combobox->parent = Form1;
       combobox->Top =  40 ;
       combobox->Left =  50 ; break;
    case  1 :
       Tedit * Edit = new (TEdit)
       Edit->Parent = Form1;
       Edit->Top =  10 ;
       Edit->Left =  20 ; break;

    case  2 :
        ....
    break;
  }


больше пока в голову ничего не пришло :)





 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612386
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
думал обсолютно так же ... Самый простой выход ... но может есть какой то другой способ... Хотелось бы просто об этом больше узнать, прежде чем за это браться .. )

Я думаю что бы не сорить на серваке, надо в одном датасете задавать типы полей, а поля которые содержат такие сведения скрывать при открытии ДатаСета, отслеживая какой нить признак...
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612704
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно еще оду табличку завести
где в табличке(пусть будет table_controls) поля fieldname, control

берещь из всех таблиц пихаещь назваение полей в таблицу table_controls,

а потом на клиенте

допустим из какойто таблицы делаешь выборку (select * from sotrudniki)

и находишь название полей

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
for (int i =  0 ;i<DBGrid1->Columns->Count;i++)
  {
   AnsiString field = DBGrid1->Columns->Items[i]->FieldName;
   ADOQuery->Close();
   ADOQuery->SQL->Clear();
   ADOQuery->SQL->Add("selct * from table_control where fieldname = '"+field+"'");
   ADOQuery->Open();
   ADOQuery->FieldByName("control")->AsIntrger // или AsString просто  можно хранить как название контролов как и их условный код :)
  естесвенно потом 
  либо if 
  либо switch // рекомендуюю все же код ну или связать таблицу ...
                       что бы можно было выдернуть по коду название контрола.
  } 

а по мне так проше ,
просто смотря какую СУБД юзаещь
на MSSQL можно из всех таблиц выдернуть название полей и запихнуть
в эту таблицу , то есть ручного труда почти никакого :)
только поля с контролами ассоциировать.





 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612718
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоесть можно вообще сделать еще покоректней скриптом
что бы небыло этого некрасивого цикла .

Код: plaintext
1.
2.
3.
4.
5.
   AnsiString field = DBGrid1->Columns->Items[i]->FieldName;
   ADOQuery->Close();
   ADOQuery->SQL->Clear();
   ADOQuery->SQL->Add("selct * from table_control where fieldname = '"+field+"'");
   ADOQuery->Open();


 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612862
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно следующим образом ... ))

View->Close();
View->Open();
Panel->Height = View->FieldCount * 40;
Panel->DestroyComponents();

for (int ii=0;ii<View->FieldCount;ii++)
{
TLabel *NewLabel = new TLabel(Panel);
NewLabel->Parent = Panel;
NewLabel->Top = 10 + ii * 40;
NewLabel->Left = 100;
NewLabel->Caption = View->Fields->Fields[ii]->DisplayName;

switch (View->Fields->Fields[ii]->DataType)
{
case 24: {TDBEditEh *NewEdit = new TDBEditEh(Panel);
NewEdit->Parent = Panel;
break;}
case 3: {TDBNumberEditEh *NewEdit = new TDBNumberEditEh(Panel);
NewEdit->Parent = Panel;
NewEdit->EditButton->Visible = true;
break;}
case 11: {TDBDateTimeEditEh *NewEdit = new TDBDateTimeEditEh(Panel);
NewEdit->Parent = Panel;
break;}
}
TDBEditEh *NewEdit = (TDBEditEh*)(Panel->Controls[ii*2 + 1]);
NewEdit->OnKeyDown = DBGridEh1KeyDown;
NewEdit->DataSource = Data;
NewEdit->DataField = View->Fields->Fields[ii]->DisplayName;
NewEdit->Top = NewLabel->Top;
NewEdit->Left = NewLabel->Left + 100;
}

Таким образом мы избавляемся от одной таблицы...

Но отсается открытым вопрос подстановки из списков...
Это можно решить через:
в Датасет после Полей (в которых стоят подставленные значения) пускать поля которые содержат нужные ключи имена задавать через " Id " + "имя ключевого поля", эти поля разумеется скрываем, ну и ключевые поля по именам похожи на таблицы из которых мы берем эти значения .. )) следовательно в ComboBox->Lookup ... можно добавить " tbl " + "имя ключевого поля"... если схема идеальна то работать должно безотказно ... однако может будут варианты ...
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612875
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, эта как раз наша прога.
Ora+MFC.

Граблей нет.
А какие тут могут быть грабли?

Это тот же самый скрипт rc из VC++.

Можно сделать парсер из твоего представления в rc. А потом создавать диалог на этом шаблоне. Кстати... у нас не так. А зря. Это потому что я тут недавно :)
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612891
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин... расплодил ветки :)

авторИ главное что бы это было универсально и быстро!

Храни в базе шаблоны:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IDD_ABOUTBOX DIALOG DISCARDABLE   0 ,  0 ,  235 ,  55 
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT  8 , "MS Sans Serif"
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC, 11 , 17 , 20 , 20 
    LTEXT           "Прога Version 1.0",IDC_STATIC, 40 , 10 , 74 , 8 ,
                    SS_NOPREFIX
    LTEXT           "Copyright (C) 2004",IDC_STATIC, 40 , 25 , 59 , 8 
    DEFPUSHBUTTON   "OK",IDOK, 178 , 7 , 50 , 14 ,WS_GROUP
END

И ничё разбирать не нада....
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32612928
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О! .. нифига! а в Builder есть такое понятие как шаблон?! )
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32613128
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть :)

 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32613136
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2CEMb
только не путай енто же Builder C++
там немного не так :)

2DжеFF

а шаблоны он имел ввиду не STL


 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32613149
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну я тоже так неадеюсь )) ПОтому как STL для меня пока вообще темный лес )) Ну и вообще многа еще всякого чего я не понимаю ))
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32613156
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb а что такое парсер... И каким образом хранить шаблон в на Серваке?!
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32613169
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFFCEMb а что такое парсер... И каким образом хранить шаблон в на Серваке?!

ну такая штука котороая разбирает строку

ну или

Парсер - это шняга, которая какую-то белеберду, включающую в себя много всего, разделяет на нужные тебе компоненты.(c) не мое
...
Рейтинг: 0 / 0
Вот такая вот задача!
    #32613837
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не шняга, а прибамбас :)
Что такое шняга, спросите у Гоблина, он вам ничего хорошего не расскажет :)

А шаблоны (может я немного и напутал, но совсем немного и не по существу)
везде одинаковые, ибо это от API, а и VC и BC API умеют.

Шаблон хранишь на сервере в виде строки например,
потом вычитал шаблон и сказал волшебное слово

CreateDialogIndirect

у которого вторым параметром

msdn
lpTemplate
[in] Pointer to a global memory object containing a template that CreateDialogIndirect uses to create the dialog box. A dialog box template consists of a header that describes the dialog box, followed by one or more additional blocks of data that describe each of the controls in the dialog box. The template can use either the standard format or the extended format.
In a standard template, the header is a DLGTEMPLATE structure followed by additional variable-length arrays. The data for each control consists of a DLGITEMTEMPLATE structure followed by additional variable-length arrays.

In an extended dialog box template, the header uses the DLGTEMPLATEEX format and the control definitions use the DLGITEMTEMPLATEEX format.

After CreateDialogIndirect returns, you can free the template, which is only used to get the dialog box started.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот такая вот задача!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]