Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автогенерация форм и объектов 
:(
    Опции темы
zloyshprot
Дата 15.1.2010, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008

Репутация: нет
Всего: нет



Всем здравствуйте! 

Значится пишу я программу, оболочку для работы с базами данных. Есть четкая задача, с заданными структурами баз данных, но вот захотелось попробовать сделать универсальности... Собственно делаю я и все меньше мне нравится что я делаю. 
Собственно я хотел бы чтобы мне сказали насколько это коряво и что так делать нельзя. Или наоборот =)

Вот кусок кода: 
Изначально на форме есть объект TADOConnection и TPageControl. Все остальное генерится после подключения к базе. Программа расчитана на одновременную работу со сколько угодным кол-вом тейблов. Собственно кол-во объектов TTabSheet, TDBGrid, TDataSource, TADOTable генерятся под кол-во тейблов в базе. Так же уже есть монструозная функция добавления записей через кнопочку вызывающую AddForm.ShowModal();. Естественно форма тоже автогенерится, добавляет поля по количеству столбцов тейбла и тд... 

Код

void __fastcall TFMain::FormCreate(TObject *Sender)
{
    int i,max;
        TStringList *Names;
    Names = new TStringList();

    AdoConnect->Connected = True;
    AdoConnect->GetTableNames(Names);

    max = Names->Count;

    for( i = 0; i < max; i++)
    {
        TabSheet[i] = new TTabSheet(PConDB);
            TabSheet[i]->Caption = ""+Names->operator [](i)+"";
            TabSheet[i]->PageControl = PConDB;

        AdoTable[i] = new TADOTable(TabSheet[i]);
            AdoTable[i]->Connection = AdoConnect;
            AdoTable[i]->TableName = Names->operator [](i);

        DataSource[i] = new TDataSource(TabSheet[i]);
            DataSource[i]->DataSet = AdoTable[i];

        DBGrid[i] = new TDBGrid(TabSheet[i]);
            DBGrid[i]->Parent = TabSheet[i];
            DBGrid[i]->Align = alClient;
            DBGrid[i]->DataSource = DataSource[i];

        AdoTable[i]->Active = True;
    }

}


Еще раз вопрос - это все бред или не совсем?
PM MAIL   Вверх
Лапоть
Дата 15.1.2010, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Цитата(zloyshprot @  15.1.2010,  20:04 Найти цитируемый пост)
Есть четкая задача, с заданными структурами баз данных

Вот и реализуй именно поставленную задачу. Универсальный станок типа ДБЕхплорер хорош в качестве учебного примера - и не более того.
ЗЫ - коннектиться в FormCreate() - не есть хорошо (ИМХО). Юзер может просто случайно клацнуть по иконке программы...
Цитата(zloyshprot @  15.1.2010,  20:04 Найти цитируемый пост)
max = Names->Count;
У тебя может быть одна таблица рабочая и к ней - ещё 27 таблиц-словариков. Наклепаешь ты 28 страниц, а работать с рабочей таблицей не сможешь.
Цитата(zloyshprot @  15.1.2010,  20:04 Найти цитируемый пост)
Еще раз вопрос - это все бред или не совсем? 

Это не бред. Это классические грабли. Таки лет .... тому назад я и сам на них наступил.  smile 
Удачи тебе! smile 
PM MAIL   Вверх
zloyshprot
Дата 15.1.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008

Репутация: нет
Всего: нет



Спасибо за критику =) 

Я бодро взялся за реализацию такой универсальности, но чем дальше писал, тем больше понимал, что мне оно незачем. Расцениваю я сейчас всю проделанную работу как хороший опыт и откатываюсь до более статичной версии. 

Я не совсем понял, что имелось ввиду здесь: 
Цитата

У тебя может быть одна таблица рабочая и к ней - ещё 27 таблиц-словариков. Наклепаешь ты 28 страниц, а работать с рабочей таблицей не сможешь


Вобщем, спасибо =)
PM MAIL   Вверх
vikaz
Дата 15.1.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Сейчас сам пишу программу,  похожий проект! Сначала, с дуру, тоже хотел использовать несколько DBGrid, но потом понял, что это гиблое дело и сделал все на связке TTabControl + DBGridEh. При том, что программа может иметь сколь угодно закладок! При переходе на новую закладку (компонента TTabControl имеет только один лист, а при переключении на другую вкладку генерит событие с номером вкладки) просто перерисовываю DBGridEh и заполняю его! Получается шустро, проверял на Acer Aspire One. 
ЗЫ. На изображении видно, как все отображается при проектировании и как в запущенной программе! 

Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  2.png 113,87 Kb


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
zloyshprot
Дата 16.1.2010, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008

Репутация: нет
Всего: нет



Цитата(vikaz @ 15.1.2010,  22:39)
Сейчас сам пишу программу,  похожий проект! Сначала, с дуру, тоже хотел использовать несколько DBGrid, но потом понял, что это гиблое дело и сделал все на связке TTabControl + DBGridEh. При том, что программа может иметь сколь угодно закладок! При переходе на новую закладку (компонента TTabControl имеет только один лист, а при переключении на другую вкладку генерит событие с номером вкладки) просто перерисовываю DBGridEh и заполняю его! Получается шустро, проверял на Acer Aspire One. 
ЗЫ. На изображении видно, как все отображается при проектировании и как в запущенной программе!

Здорово, спасибо за столь полезную информацию. 

Можно поподробнее? 
Это будет что-то типа 

Код

AdoTable->TableName = table;
AdoTable->Requery();


на переключении вкладки?
PM MAIL   Вверх
zloyshprot
Дата 16.1.2010, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008

Репутация: нет
Всего: нет



Первый набросок: 

Код

void __fastcall TMainForm::TabPanChange(TObject *Sender)
{
    AdoTable->Active = False;
    if(TabPan->TabIndex == 0)
        AdoTable->TableName = "db_test1";
    else if(TabPan->TabIndex == 1)
        AdoTable->TableName = "db_test2";
    else if(TabPan->TabIndex == 2)
        AdoTable->TableName = "db_test3";
    AdoTable->Active = True;
}

PM MAIL   Вверх
vikaz
Дата 16.1.2010, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Все верно! А если так переписать твой код:
Код

void __fastcall TMainForm::TabPanChange(TObject *Sender)
{
    AdoTable->Active = False;
    switch (TabPan->TabIndex)
    {
     case 0: AdoTable->TableName = "db_test1"; break;
     case 1: AdoTable->TableName = "db_test2"; break;
     case 2: AdoTable->TableName = "db_test3"; break; 
     }
     AdoTable->Active = True;
}

Так будет правильнее!!!!


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
zloyshprot
Дата 16.1.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008

Репутация: нет
Всего: нет



Цитата(vikaz @ 16.1.2010,  08:18)
Все верно! А если так переписать твой код:
Код

void __fastcall TMainForm::TabPanChange(TObject *Sender)
{
    AdoTable->Active = False;
    switch (TabPan->TabIndex)
    {
     case 0: AdoTable->TableName = "db_test1"; break;
     case 1: AdoTable->TableName = "db_test2"; break;
     case 2: AdoTable->TableName = "db_test3"; break; 
     }
     AdoTable->Active = True;
}

Так будет правильнее!!!!

Здорово, про switch я забыл совсем... 

А я вот прикидываю, а если пользователю понадобится найти, например, имя в одной таблице, переключится на другую и найти это же имя, а потом вернуться в прошлую и внести изменения. Ведь после переключений таблицы будут перерисовываться и результаты поиска сбрасываться. 
Единственно что я придумал, это создать под каждую таблицу String, в который, при переключении, будет записываться значение AdoTable->Filter и, при переключении обратно на таб, будет это значение восстанавливать. 

Или есть более вразумительные варианты? 
PM MAIL   Вверх
vikaz
Дата 16.1.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Цитата(zloyshprot @  16.1.2010,  14:11 Найти цитируемый пост)
А я вот прикидываю, а если пользователю понадобится найти, например, имя в одной таблице, переключится на другую и найти это же имя, а потом вернуться в прошлую и внести изменения. Ведь после переключений таблицы будут перерисовываться и результаты поиска сбрасываться. 
Единственно что я придумал, это создать под каждую таблицу String, в который, при переключении, будет записываться значение AdoTable->Filter и, при переключении обратно на таб, будет это значение восстанавливать. 

Или есть более вразумительные варианты?  

Я делаю так же! Только не переменные использую, а std::List!!!


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
zloyshprot
Дата 16.1.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008

Репутация: нет
Всего: нет



Столкнулся проблемой 
Редактирование осуществляется в форме, вызванной по 

Код

FormAdd1 = new TFormAdd1(this);
FormAdd1->ShowModal();
delete FormAdd1;


На FormAdd1 событие на onButtonClick:  

Код

MainForm->DBGrid->DataSource->DataSet->Edit();
MainForm->DBGrid->DataSource->DataSet->FieldByName("name")->AsString = ename->Text;
//
MainForm->DBGrid->DataSource->DataSet->Post();
Close();


Если при редактировании никакие данные не изменены, то получаю ошибку: "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения"

И что-то никак не могу понять... Почему? 

Это сообщение отредактировал(а) zloyshprot - 16.1.2010, 20:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.