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

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

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

Форма

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

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

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

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

Форма

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

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

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


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



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

Я имею ввиду конструкцию динамического создания контрола и распределения на форме (взависимости от типа данных поля)... Что бы было к примеры 1000 представлений, и один код который реализует заполнение динамической формы динамическими контролами... :-)) И главное что бы это было универсально и быстро! ) Один раз вот так потратив время можно в последствии создавать представления на сервере, и не морочиться с кодом клиентского приложения ...
...
Рейтинг: 0 / 0
20.07.2004, 12:54
    #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
20.07.2004, 13:01
    #32612386
DжеFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая вот задача!
думал обсолютно так же ... Самый простой выход ... но может есть какой то другой способ... Хотелось бы просто об этом больше узнать, прежде чем за это браться .. )

Я думаю что бы не сорить на серваке, надо в одном датасете задавать типы полей, а поля которые содержат такие сведения скрывать при открытии ДатаСета, отслеживая какой нить признак...
...
Рейтинг: 0 / 0
20.07.2004, 14:20
    #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
20.07.2004, 14:23
    #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
20.07.2004, 15:11
    #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
20.07.2004, 15:15
    #32612875
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая вот задача!
О, эта как раз наша прога.
Ora+MFC.

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

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

Можно сделать парсер из твоего представления в rc. А потом создавать диалог на этом шаблоне. Кстати... у нас не так. А зря. Это потому что я тут недавно :)
...
Рейтинг: 0 / 0
20.07.2004, 15:19
    #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
20.07.2004, 15:30
    #32612928
DжеFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая вот задача!
О! .. нифига! а в Builder есть такое понятие как шаблон?! )
...
Рейтинг: 0 / 0
20.07.2004, 16:20
    #32613128
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая вот задача!
есть :)

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

2DжеFF

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


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

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

ну или

Парсер - это шняга, которая какую-то белеберду, включающую в себя много всего, разделяет на нужные тебе компоненты.(c) не мое
...
Рейтинг: 0 / 0
21.07.2004, 07:30
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот такая вот задача! / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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