(Часть 1) (*Закрыта*)Я начинающий, подскажите пожалуйста, как...
Если вы только начинаете осваивать среду разработки ВСВ - предлагаю возникающие вопросы размещать в данной теме. Не создавайте пожалуста отдельные темы - типа "Как мне запустить свое приложение на другом компьютере", "Как перевести String в char*" и тому подобное. Такие темы будут закрываться с отсылку в эту. Не обижайтесь.
Кроме того, не брезгуйте плиз, пользоваться поиском хотя бы, по нескольким критериям. Иногда бывает так, вопрос который возник у вас не столь оригинален - вполне возможно, кто то уже спрашивал его до вас :) Поверьте, отвечать на одни и теже вопросы тоже не всегда интересно.
Если вы задаете свой вопрос на форуме - что бы получить наиболее эффективный ответ - следуйте пожалуйста несложным правилам. Они просты:
0. Опишите чего вы хотели добиться.
1. Опишите ошибку которая у вас возникла, по возможности с текстом самой ошибки.
2. Если вы считаете это необходимым - приведите фрагмент(пожалуста не помещайте в свой вопрос весь листинг) кода, на который жалуется компилятор, коротко описав переменные которые используются, и как они инициализируются. Исходники высылайте или выкладывайте только в том случае, если вас об этом просят.
3. Если проблема связана с функцией какой либо библиотеки - не стесняйтесь залезть в хелп и найти там ее описание. То чтовы не рубите в английском, зато читаете Рабле в оригинале - отнюдь не оправдание. Людей для которых английский - родной, здесь немного. Пользуйтесь словарем, это дает результаты :)
4. Не забывайте - может быть ВСВ и имеет раширения по сравнению со стандартом - но тем не менее это С++. Не забывайте проверить, что в ваш проект подключены все необходимые заголовочные файлы, а так же файлы библиотек.
5. Если вы задали вопрос один раз - не нужно его повторять или дублировать, или размещать посты типа "Ну что никто не знает" и т.д. Вы рискуете узнать много разных путей, но так и не получить нужный вам ответ.
6. Форум - дело сугубо добровольное. Здесь ни кто НЕ ОБЯЗАН искать ответы на ваши вопросы. Если вам отвечают - то это только исключительно из любви к вам. :)
7. Исходя из выше сказанного, если вам не отвечают - ну возможно вас не любят :)
8. Для тех, кому нужно написать курсовую, программу, решить контрольную или тому подобное - существует раздел форума Студентам
Размещайте, плиз, свои посты там. Сообщения размещенные в данной теме - не будут перемещаться - они будут удаляться.
9. Если вы хотите пообщаться, обсудить тему, не связанную с ВСВ - милости просим: В "Отдохнем". Флуд в данном разделе не приветствуется.
Ну вроде все. Если что забыл - или не так - поправьте.
Удачи.
мне нужно, чтобы мое приложение 1 запускало другое 2 с определенными параметрами, затем ждала, пока приложение 2 отработает, закрывала его и открывало его же с другими параметрами и так сколько угодно долго, т.к. параметров этих может быть очень много.. я все сделал следующим образом -
{
AnsiString path="";
char ch[25];
int acc[]={
76412,
593015,
598100,
80498,
93385,
58048,
1051045
};
for (int i=0; i<ARRAYSIZE(acc); i++)
{
itoa(acc, ch, 10);
acc1 = path+ch+" Default";
f = acc;
char *acco = acc1.c_str();
ShellExecute(NULL, "open", "F:\\mon\\app.exe ", acco, NULL, SW_MINIMIZE);
Form2->ShowModal();
DeleteFile("f:\\mon\\app\\files\\ok.txt");
if (!EnumWindows((WNDENUMPROC) printWindowTitle, NULL));
}
}
BOOL CALLBACK close_app(HWND hwnd, LPARAM lParam)
{
char s[100];
GetWindowText(hwnd, s, sizeof(s));
if (!AnsiContainsStr(s, f+": WCF")) return true;
else
{
//ShowMessage("Îêíî íàéäåíî");
PostMessage(hwnd, WM_CLOSE, 0, 0);
return false;
}
}
форма 2 TTimer-ом каждую секунду проверяет, записало ли app.exe файл ok.txt - если да, самоликвидируется (Form2->Close()), и я так понимаю управление возвращается в первую форму..
но вот незадача - где-то есть ошибка, а где - понять я не в силах.
бывает так, что app.exe еще не записало файл, а управление уже вернулось в первое окно, программа 2 закрылась не отработав и уже app.exe запускается со следующими параметрами...
помогите кто чем может, я уже не знаю что делать.. я только учусь
нафига эта чума с формами и т.д. CreateProcess и WaitForSingleObject
как к ним обращаться из цикла перебором?
и как создавать свои объекты динамически? На примере того же Image
if(Form1->Components->ClassNameIs("TImage")){
ShowMessage(Components->Name);
}
}
по вопросу динамического создания компонентов на форме используйте поиск. вопрос обсуждался неоднократно.
нашел :)
TImage* pic = dynamic_cast<TImage *>(Components);
Одно дело - простейшие студенческие приложения и совсем другое - реально эксплатируемая клиент-серверная программа с большой базой данных и кучей требований к безопасности.
Расскажите пожалуйста, как надо правильно проектировать приложение, чтобы оно долго и без сбоев работало, какие компоненты лучше использовать, чтобы не возникало сбоев.
Мой вариант - доступ к таблицам SQL сервера через ADOTable, составным таблицам через ADOQuery и навигация всего этого DBNavigatorom столкнулся с кучей препятствий.
Первая проблема. решилась очень просто.
Сейчас возникают другие - проблемы с удалением записей и даже с внесением в базу. Как сказал один из участников форума, проблема на самом деле в прокладке между стулом и компьютером, но все же, раз это ветка для начинающих, то думаю вопрос правильного проектирования и правильного использования компонентов (или использование правильных компонентов) - вопрос очень полезный.
Расскажите пожалуйста, как надо правильно проектировать приложение, чтобы оно долго и без сбоев работало, какие компоненты лучше использовать, чтобы не возникало сбоев.
Не-а не расскажут;) Слишком объемная тема для одной ветки. Отправят читать книжки. Как не специалист по БД (и в программировании вообще) могу посоветовать Елманову "Borland C++ Builder. Архитектура \"клиент-сервер\", многозвенные системы, Internet-приложения" Для начало самое-то, кратко рассмотрены: терминология, процесс проектирования, создания и оптимизации серверных БД. Компоненты какие, зачем и где используются. Трехзвенные системы. Не знаю кому как, но я понял (или мне так кажется:)). Дальше пойдешь более углубленно копать есть куча статей посвященных тому или иному вопросу связанному с разработкой клиент-серверных БД.
Мой вариант - доступ к таблицам SQL сервера через ADOTable, составным таблицам через ADOQuery
...
правильного проектирования и правильного использования компонентов (или использование правильных компонентов) - вопрос очень полезный.
ADO, ИМХО, отстой полный! Хотя в силу своей не компетентности настаивать не буду.
Правильными считаю InterBase, IBX
ibaseRu
Одно дело - простейшие студенческие приложения и совсем другое - реально эксплатируемая клиент-серверная программа с большой базой данных и кучей требований к безопасности.
Расскажите пожалуйста, как надо правильно проектировать приложение, чтобы оно долго и без сбоев работало, какие компоненты лучше использовать, чтобы не возникало сбоев.
Мой вариант - доступ к таблицам SQL сервера через ADOTable, составным таблицам через ADOQuery и навигация всего этого DBNavigatorom столкнулся с кучей препятствий.
Первая проблема. решилась очень просто.
Сейчас возникают другие - проблемы с удалением записей и даже с внесением в базу. Как сказал один из участников форума, проблема на самом деле в прокладке между стулом и компьютером, но все же, раз это ветка для начинающих, то думаю вопрос правильного проектирования и правильного использования компонентов (или использование правильных компонентов) - вопрос очень полезный.
Как правильно сказано уже - тема черезмерно обширна. Одно могу сказать точно - использование компонентов ADOTable и DBNavigator - это уровень максимум студенческой проги причем достаточно низкого уровня. Для реальной работы как правило имеет смысл использовать (опять же все зависит от задач и объема, чисто ИМХО) примерно такую схему - TADOConnection, TADOStoredProc, TDataSetProvider, TClientDataSet. Этот подход позволяет обеспечивать надежность, расширяемость системы и проверен неоднократно на системах с количеством рабочих мест свыше 100. Основная концепция - прямая работа с таблицами - это как правило, ОШИБКА ПРОЕКТИРОВАНИЯ. ИМХО. На больших БД любая работа должна строится через хранимые процедуры - это позволит обеспечить определенный уровень независимости БДА от пользователей и программистов. Ну и так далее. Читайте хотябы Хендерсона. Описать это в форуме - задача безнадежная.
Читая форумы понял, что использование стандартных компонентов Table, Navigator и т.д. есть абсолютное зло в сложных программах.
Начал переписывать навигацию и столкнулся с проблемой.
Удаление записи из таблицы:
ADOCommand1->CommandType=cmdText;
ADOCommand1->CommandText="Delete From contacts where id=" + Form1->QueryContacts->DataSet->Fields->Fields[0]->AsString;
ADOCommand1->Execute();
После удаления одной записи можно удалять записи дальше, но стоит попытаться внести другую запись, как возникает ошибка:
"источник данных изменил или удалил значение ключа данной строки в хранилище данных".
Потом говорится, что удалена и локальная строка.
И только потом запись вставляется.
DataModule2->contacts->Close();
DataModule2->contacts->Open();
При переоткрытии DataSourse все работает без ошибок, но я уверен, что есть более гуманные средства устранения проблемы. Подскажите пожалуйста.
Насчет предложенных компонентов:
DataSetProvider используется вместо DataSource? В чем преимущество?
Для чего нужен ClientDataSet?
Если несложно подсказать, где можно посмотреть какой-нибудь ГРАМОТНЫЙ пример реализации приложения для базы данных?
Читая форумы понял, что использование стандартных компонентов Table, Navigator и т.д. есть абсолютное зло в сложных программах.
Начал переписывать навигацию и столкнулся с проблемой.
Удаление записи из таблицы:
ADOCommand1->CommandType=cmdText;
ADOCommand1->CommandText="Delete From contacts where id=" + Form1->QueryContacts->DataSet->Fields->Fields[0]->AsString;
ADOCommand1->Execute();
После удаления одной записи можно удалять записи дальше, но стоит попытаться внести другую запись, как возникает ошибка:
"источник данных изменил или удалил значение ключа данной строки в хранилище данных".
Потом говорится, что удалена и локальная строка.
И только потом запись вставляется.
DataModule2->contacts->Close();
DataModule2->contacts->Open();
При переоткрытии DataSourse все работает без ошибок, но я уверен, что есть более гуманные средства устранения проблемы. Подскажите пожалуйста.
Насчет предложенных компонентов:
DataSetProvider используется вместо DataSource? В чем преимущество?
Для чего нужен ClientDataSet?
Если несложно подсказать, где можно посмотреть какой-нибудь ГРАМОТНЫЙ пример реализации приложения для базы данных?
Грамотный пример реализации зависит от конкретной ситуации. Я рекомендую любую законченную операцию выносить в отдельную длл. Здорово упрощает жизнь и переносимость кода. На собственно приложение оставлять минимум базовых функций - все остальные вызовы делать через длл. Кроме того, как правило каждая длл реализует свое подключение к базе - но здесь еще все зависит от условий, я честно говоря так и не разобрался - возможно ли в таком случае превышение количества подключений, больше чем по лицензии. По крайней мере, в моей ситуации, при лицензии на сервак в 50 подключений случаев отбоя по данной причине не было, если конечно количество пользователей не превышало это число, не смотря на то что каждый из них запускал как минимум 2 подключения на сервер. Возможно здесь сыграло еще рольто что подключение устанавливалось по требованию а не висело постоянно.
DataSetProvider - как и ClientDataSet лично я использую для явного разделения источника данных и представления данных. На стороне ClientDataSet производятся все операции типа фильтрации сортировки и пр, того что выливается клиенту. Через него же выгружаются данные в контролы. Преимущество данной схемы в том что, позволяет обеспечить относительную независимость от постоянного соединения с базой, возможность локальной работы с данными, относительную универсальность интерфейса - по сути при переходе на трехзвенку клиентское приложение практически не требует доработки. Недостатки - небольшое падение производительности - при прямом доступе как правило процентов на 15-20 быстрее. Но при разрыве связи с серваком - при прямой работе с компонентами как правило пользователь сразу теряет данные - в моей схеме данные могут быть сохранены локально и затем синхронизированы, если это конечно нужно.
Для вставки, модификации, выборки и удаления данных я всегда использую ХП - по моему опыту это себя оправдывает. Прямой доступ к таблицам это всегда гемор, даже если ты един в лице как программиста так и БДА - а если работаешь в команде - это быстро приводит к толстой северной лисичке - когда в середине проекта когда отработано несколько тысяч строк кода и по ряду причин приходится менять структуру базы - а менять ее приходится так или иначе как минимум раз в полгода. Соответственно структура базы должна быть спроектирована так, что бы при внесении новых сущностей требовалось минимум модификаций существующей структуры, и старая версия программы могла работать на новой базе.
Переоткрытие набора данных естественно необходимо - но при использовании того же ClientDataSet - можно вызвать метод Refresh() - что существенно снижает траффик в сети - одно дело полностью обновлять набор данных - другое - просто его синхронизировать.
Компоненты представления (гриды и прочее) связываются с набором данных через стандартный DataSource - тут ничего не меняется. Только завязывается он не на компоненты ADO - а на ClientDataSet.
Тоже через ХП?
Тоже через ХП?
Да. DataSetProvider должен быть связан с комопнентом TADOStoredProc. Если ты конечно используешь ХП. Если нет - то с тем компонентом, который получает данные данные из базы (TADOQuery, TADODataSet).
По сути DataSetProvider - это интерфейс который тебе позволяет обращаться к компонентам не напрямую а опосредованно. Это как раз и позволяет реализовать определенную гибкость доступа - на стороне клиента абсолютно безразлично что конкретно использовано.
Данные получаются по рекомендованной цепочке:
ХП-DataSetProvider-ClientDataSet-контролы
Но теперь ничего не могу добавлять и модифицировать в главной таблице с 50 полями.
Работу с вспомогательными таблицами я уже перестроил на ХП.
Но вот с модификацией и добавлением данных в главную таблицу через контролы ничего не работает :(
Какова должна быть правильная последовательность действий?
Я делаю примерно так:
DataModule2->ClientMain->ApplyUpdates(-1);
DataModule2->ClientMain->Refresh();
после внесения изменений.
В результате:
Unable to resorv records. Table name not found.
Как нужно правильно вносить изменения в БД и новые записи при такой архитектуре.
вопрос
имеем вот такой класс :
protected:
bool on_;
public:
lamp(AnsiString index, AnsiString image, AnsiString backg, int l, int t);
~lamp();
__property bool on = {read = on_, write = set_on};
};
и один из конструкторов:
base(index,image,backg,l,t), [SIZE="4"]on(1)[/SIZE]{};
в конструкторе косяк - обращение не к данным а к свойству (on)
почему Builder эту вещь пропускает, или это какая то новая фича языка ?
у свойств, насколько я знаю нет конструкторов
Данные получаются по рекомендованной цепочке:
ХП-DataSetProvider-ClientDataSet-контролы
Но теперь ничего не могу добавлять и модифицировать в главной таблице с 50 полями.
Работу с вспомогательными таблицами я уже перестроил на ХП.
Но вот с модификацией и добавлением данных в главную таблицу через контролы ничего не работает :(
Какова должна быть правильная последовательность действий?
Я делаю примерно так:
DataModule2->ClientMain->ApplyUpdates(-1);
DataModule2->ClientMain->Refresh();
после внесения изменений.
В результате:
Unable to resorv records. Table name not found.
Как нужно правильно вносить изменения в БД и новые записи при такой архитектуре.
Используя свойства компонента TClientDataSet - BeforeClose & AfterClose. Можно просто передавать данные ХП.
почему Builder эту вещь пропускает, или это какая то новая фича языка ?
у свойств, насколько я знаю нет конструкторов
херню написал потому что
base(index,image,backg,l,t), [SIZE="4"]on_(1)[/SIZE]{};
ну так понятно херню.
фишка в том что если я случайно напишу такую херню , то отловить ее потом сложно , так как компилятор не видит ничего криминального, а вот программа с такой "ошибкой" такие заскоки демонстрирует что даже бывалые руками разводят.
вот я собственно и спросил почему такая конструкция не вызывает сообщений типа - ошибка мля ;), ну или хотя бы предупреждение
фишка в том что если я случайно напишу такую херню , то отловить ее потом сложно...
А ты не пиши. Никогда не обращайся к св-ву из методов класса, только к полю, которое представляет это св-во.
Пару вопросов:
1. Скомпилировал exe'шник. Пользую в ней БД и манифест ХР. Скопировал на флэшку - а на других компах не запускается. Говорит, что не найден файл vcl60.bpl. Как можно сделать независимость программы от этого (и подобных) файлов?
2. Вопрос по БД. Есть колонны с определенными именами. Есть пару листбоксов, по которым составляю имя колонны (т.е. выбираю варианты и склеиваю их). Теперь вопрос - как мне найти по этой "склейке" нужный столбец? Т.е. как перебрать названия столбцов?
3. Вытекает из 2. Будет такая ситуация, что склейка не даст полного имени столбца.
Например. Склейка = "Столбец"
А сама таблица:
Столбец 1 | Столбец H | Столбец 1ыа34
Но надо, чтобы в таблице отобразились эти столбцы. Как сделать?
Пару вопросов:
1. Скомпилировал exe'шник. Пользую в ней БД и манифест ХР. Скопировал на флэшку - а на других компах не запускается. Говорит, что не найден файл vcl60.bpl. Как можно сделать независимость программы от этого (и подобных) файлов?
Для кого сделан раздел наиболее часто задаваемых вопросов(ФАК)?
2. Вопрос по БД. Есть колонны с определенными именами. Есть пару листбоксов, по которым составляю имя колонны (т.е. выбираю варианты и склеиваю их). Теперь вопрос - как мне найти по этой "склейке" нужный столбец? Т.е. как перебрать названия столбцов?
3. Вытекает из 2. Будет такая ситуация, что склейка не даст полного имени столбца.
Например. Склейка = "Столбец"
А сама таблица:
Столбец 1 | Столбец H | Столбец 1ыа34
Но надо, чтобы в таблице отобразились эти столбцы. Как сделать?
Что такое "колонны", зачем их надо "склеивать", причем здесь БД, и каким образом может возникнуть " такая ситуация, что склейка не даст полного имени столбца. ", и каким образом эта ситуация вытекает из вашего второго вопроса?
Сформулируйте вопрос, а не поток сознания. Если вы не знаете как это правильно описать - коротко поясните вашу задачу и что вы хотите сделать. Возможно вы решаете задачу мягко говоря не через то отверстие, которое для этого предназначено.
Пользователь из нескольких слов нескольких листбоксов собирает имя столбца в БД. Нажимает "ок" и в таблице отображается этот столбец. Пример: (LB=ListBox)
LB1| LB2 | LB3
1 | q | qw1
2 | a | as2
3 | z | zx3
Пользователь собрал 3+a+zx3. Осуществляем поиск - есть ли столбец с таким названием в БД "3azx3" Нашли несколько стобцов с именами:
3azx3MF
3azx3ZK
Надо показать эти столбцы в DBGrid
Ну спасибо. уважили. Просто до конца жизни должен буду.
Пользователь из нескольких слов нескольких листбоксов собирает имя столбца в БД. Нажимает "ок" и в таблице отображается этот столбец. Пример: (LB=ListBox)
LB1| LB2 | LB3
1 | q | qw1
2 | a | as2
3 | z | zx3
Пользователь собрал 3+a+zx3. Осуществляем поиск - есть ли столбец с таким названием в БД "3azx3" Нашли несколько стобцов с именами:
3azx3MF
3azx3ZK
Вы что действительно уверены, что делаете одолжение всем, задав вопрос?
С вас вашу же задачу клещами вытягивать надо? Какая БД? Какие компоненты используются? Где вы эти столбцы ищете (или собираетесь искать)? Откуда взяты:
3azx3MF
3azx3ZK?
Если вы эти столбцы "нашли" - то что мешает выполнить запрос в базу и получить данные?
String SQL = "select 3azx3MF,3azx3ZK from sometable";
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(SQL);
ADOQuery1->Active = true;
DataSourse1->DataSet = ADOQuery1;
Надо показать эти столбцы в DBGrid
#include <vcl.h>
#pragma hdrstop
#include<math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
float f(float x)
{
// return x*x*x + 3*x - 2;
return x*x*x + x - 5;
}
float fdx(float x)
{// return 3*x*x +3;
return 3*x*x +1;
}
float fd2x(float x)
{
return 4*x;
}
//---------------------------------------------------------------------------
void TForm1::modinewton(float x0, float x1, float epsilon, int step)
{
if (abs(x1-x0) > epsilon)
{
ListBox2->Items->Add("x: "+FloatToStr(x1));
ListBox2->Items->Add("f(x): "+FloatToStr(f(x1)));
ListBox2->Items->Add("steps: "+IntToStr(step));
return;
}
const float xc = fdx(x0);
float x1 = x0 - f(x0)/xc;
modinewton(x0, x1, epsilon, step + 1);
}
void __fastcall TForm1::bExe2Click(TObject *Sender)
{
float a = StrToFloat(Edit1->Text);
float b = StrToFloat(Edit2->Text);
float epsilon = StrToFloat(Edit3->Text);
if(f(a)*f(b) < 0)
{
ListBox2->Items->Add("данные неверны");
return;
}
else
{
float x0 = a;
if(f(a)*fd2x(a) < 0)
{
x0 = b;
}
ListBox2->Items->Add("===================================");
modinewton(x0, x1, epsilon, 1);
ListBox2->Items->Add("===================================");
ListBox2->Items->Add("");
}
}
//---------------------------------------------------------------------------
выдает ошибки:
[C++ Error] Unit1.cpp(101): E2238 Multiple declaration for 'x1'
[C++ Error] Unit1.cpp(128): E2451 Undefined symbol 'x1'
заменить на
x1 = x0 - f(x0)/xc;
[C++ Error] Unit1.cpp(128): E2451 Undefined symbol 'x1'
если в этой: modinewton(x0, x1, epsilon, 1);
тогда надо определить ее в классе TForm1
{
private:
float x1;
}
тогда она у тебя будет видна для всех объектов TForm1
Простите великодушно, не правильно выразился.
Откуда взяты:
3azx3MF
3azx3ZK?
Такие столбцы есть в таблице БД. Так, еще более наглядный пример:
Курс: Специальность: Семестр:
1_____A_____________1
2_____B_____________2
3_____C
4_____D
5_____E
(простите за эти полосы, не знаю как в форуме таблицу сделать)
Пользователь щелкая по ListBox'ам выбирает: "1А1". В таблице БД есть столбцы:
1 курс Специальность А Семестр 1 Группа А-1
1 курс Специальность А Семестр 1 Группа А-2
1 курс Специальность А Семестр 1 Группа А-3
Руками модифицируем "1А1" в "1 курс Специальность А Семестр 1" (хотя Вы писали, что иметь рускоязычные элементы в БД - чревато. Но пока оставлю так).
Далее. Как видим, есть несколько столбцов, содержащих подстроку
"1 курс Специальность А Семестр 1". Их и нужно отобразить.
Если вы эти столбцы "нашли" ...
В том то и дело, что я не знаю как их найти. А с SQL-запросами я не знаком.
если ты задаешь значения для epsilon = StrToFloat(Edit3->Text);
float x0 = a;
то почему не задаешь значение для х1 ?
(это если не вдаваясь в математику, тут я забыл все на корню)
Такие столбцы есть в таблице БД. Так, еще более наглядный пример:
Курс: Специальность: Семестр:
1_____A_____________1
2_____B_____________2
3_____C
4_____D
5_____E
(простите за эти полосы, не знаю как в форуме таблицу сделать)
Пользователь щелкая по ListBox'ам выбирает: "1А1". В таблице БД есть столбцы:
1 курс Специальность А Семестр 1 Группа А-1
1 курс Специальность А Семестр 1 Группа А-2
1 курс Специальность А Семестр 1 Группа А-3
Руками модифицируем "1А1" в "1 курс Специальность А Семестр 1" (хотя Вы писали, что иметь рускоязычные элементы в БД - чревато. Но пока оставлю так).
Далее. Как видим, есть несколько столбцов, содержащих подстроку
"1 курс Специальность А Семестр 1". Их и нужно отобразить.
В том то и дело, что я не знаю как их найти. А с SQL-запросами я не знаком.
Ну это уже более по делу. Правда какая база все равно не понятно.
Если сказать по человечески - вам необходимо получить запись которая соответствует определенным условиям? Если я правильно понял конечно.
Я не буду вдаваться в подробности как установить соединение с БД, и предполагаю что курс, специальность, семестр и группа хранятся в базе в таком же виде как и в листбоксах. Если нет - то одно из двух - либо в базе поменять либо в листбоксах - на усмотрение
if(LB1->ItemIndex >=0||LB2->ItemIndex>=0||LB3->ItemIndex>=0)
{
SQL = SQL+"where ";
if(LB1->ItemIndex >=0 ){
SQL = SQL+"Курс="+LB1->Items->Item[LB1->ItemIndex];
}
(LB2->ItemIndex >=0 ){
if(SQL.Pos("Курс="))
SQL = SQL+" AND ";
SQL = SQL+"Специальность="+LB2->Items->Item[LB2->ItemIndex];
}
(LB3->ItemIndex >=0 ){
if(SQL.Pos("Курс=")||SQL.Pos("Специальность="))
SQL = SQL+" AND ";
SQL = SQL+"Семестр="+LB3->Items->Item[LB3->ItemIndex];
}
}
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(SQL);
ADOQuery1->Active = true;
DataSourse1->DataSet = ADOQuery1;
DBGrid1->DataSourse = DataSourse1;
Соответственно - имя таблицы вы подставляете свое. Кроме того, здесь не делается проверки, ну и вобще - существует более оптимальный способ формировать запросы чем этот(точнее, это просто учебный пример - в реальной программе так стоит делать только от большой безнадеги :)), - но пока разберитесь хотя бы с ним.
Спасибо, почти работает, но выдает ошибку:
"Ошибка синтаксиса (пропущен оператор) в выражении запроса 'тут моя строка''.
Посмотрел учебник, никаких, жизненно необходимых операторов для моего примера - не нашел. Наверное, плохо искал)
В чем может быть дело?
если ты задаешь значения для epsilon = StrToFloat(Edit3->Text);
float x0 = a;
то почему не задаешь значение для х1 ?
(это если не вдаваясь в математику, тут я забыл все на корню)
не могу понять как его использовать, пробывал и x0=x1 и x1 = x1 - x0, ещё несколько вариантов перепробывал или ничего не меняется или виснит или вообще stack overflow. кто с математикой дружит, пожалуйста подскажите как сделать чтоб шел расчет.
Спасибо, почти работает, но выдает ошибку:
"Ошибка синтаксиса (пропущен оператор) в выражении запроса 'тут моя строка''.
Посмотрел учебник, никаких, жизненно необходимых операторов для моего примера - не нашел. Наверное, плохо искал)
В чем может быть дело?
Строку запроса увидеть можно?
'3 курс AND Первый семестр AND специальность M'
И в догонку вопрос:
Получил я необходимые мне столбцы.
По примеру:
3 курс Первый семестр специальность M-31
3 курс Первый семестр специальность M-32
3 курс Первый семестр специальность M-33
Можно ли как нибудь получить остатки (строки), от вычета из столбца строки запроса:
"-31"
"-32"
"-32"
?
Акуеть! Это что????? :D
Посмотрите внимательно на код приведенный мной - и объясните как подобная строка может сформироваться?
И в догонку вопрос:
Получил я необходимые мне столбцы.
По примеру:
3 курс Первый семестр специальность M-31
3 курс Первый семестр специальность M-32
3 курс Первый семестр специальность M-33
Можно ли как нибудь получить остатки (строки), от вычета из столбца строки запроса:
"-31"
"-32"
"-32"
?
Вобще-то, у строки есть метод - который называется SubString. Но я рекомендую прежде чем ставить перед собой такие задачи - прочесть ну хоть Архангельского что ли. Потому как, судя по заданным вами вопросам, страшно далеки вы что от баз данных, что от программирования. Поэтому давайте вы сначала ваши столбцы получите - а потом будете задавать вопросы дальше. :D Ок? И вопросы лучше задавайте в личных сообщениях или через аську.
Я предупреждаю - никто за вас численные методы делать не будет. В созданной вами теме я помоему вполне подробно объяснил, как модифицировать алгоритм. [COLOR="Red"]Дальнейшее обсуждение лично для вас и для того, кто продолжит эту тему мусолить, закончится нарушением. Основанием для этого может служить:
1. Выклянчивание готового кода - что прямо запрещено правилами топика.
2. Не желание разбираться самому в базовых основах языка.
3. Попытка за счет других решать свои задачи.[/COLOR]
То ТО данная тема для начинающих - еще не следует что ее нужно наводнять сообщениями которые никому кроме вас не нужны.