Страница 1 из 2

C++ Builder подключение к БД!

Добавлено: Пн апр 18, 2005 14:18
Borr
Я эту тему создал 'выставляя пальцы веером' чисто из желания не дать разделу умереть безвременно, поддержать dBaser'a (интересные темы были пока только от него -- с Access'om мне понравилось), и естессно послушать критику только внятную....
И так делаем прогу которая только просматривает dbf файлы.
Создаем текстовый файл
[ODBC]
DRIVER=Microsoft dBase Driver (*.dbf)
UID=admin
UserCommitSync=Yes
Threads=3
Statistics=0
SafeTransactions=0
PageTimeout=600
MaxScanRows=8
MaxBufferSize=2048
FIL=dBase 5.0
DriverId=533
Deleted=1
DefaultDir=C:\
CollatingSequence=ASCII
обзываем его dbf.dsn
В С++ Buildere добовляем на форму StringGrid, Edit и два Button'a, но и это еще не все еще ADOQuery и OpenDialog. А и еще ADOConnection
По Button1 двойным кликом и в появившееся окно вставляем

Код: Выделить всё

if(OpenDialog1->Execute())
{
Edit2->Text=OpenDialog1->FileName;
} 
Потом по Button2 двойной клик и между {} вставляем

Код: Выделить всё

if(Edit1->Text!="")
{
AnsiString fil;
AnsiString Cur=GetCurrentDir();
for(int i=1;i<=StringGrid1->RowCount;i++)
StringGrid1->Rows[i]->Clear();
StringGrid1->RowCount=2;
TStringList *Str=new TStringList;
Str->Add("[ODBC]");
Str->Values["DRIVER"]="Microsoft dBase Driver (*.dbf)";
Str->Values["UID"]="admin";
Str->Values["UserCommitSync"]="Yes";
Str->Values["Threads"]="3";
Str->Values["Statistics"]=0;
Str->Values["SafeTransactions"]=0;
Str->Values["PageTimeout"]=5;
Str->Values["MaxScanRows"]=8;
Str->Values["MaxBufferSize"]=2048;
Str->Values["FIL"]="dBase 5.0";
Str->Values["DriverId"]=533;
Str->Values["Deleted"]=1;
Str->Values["DefaultDir"]=ExtractFileDir(Edit1->Text);
Str->Values["CollatingSequence"]="ASCII";
Str->SaveToFile(Cur+"\\dbf.dsn");
ADOConnection1->Connected=false;
ADOConnection1->ConnectionString="FILE NAME="+Cur+"\\dbf.dsn";
//ADOConnection1->Provider=Cur+"\\dbf.dsn";
ADOConnection1->Connected=true;
TStringGrid *SG=StringGrid1;
ADOQuery1->Connection=ADOConnection1;
ADOQuery1->Close();
ADOQuery1->SQL->Text="SELECT * FROM "+ExtractFileName(Edit1->Text);
ADOQuery1->Open();
SG->ColCount=ADOQuery1->FieldCount+1;
SG->RowCount=ADOQuery1->RecordCount+1;
for(int t=0;t<ADOQuery1->FieldCount;t++)
{
fil=ADOQuery1->Fields->Fields[t]->FieldName;
SG->Cells[t+1][0]=fil;
ADOQuery1->First();
for(int i=1;i<=ADOQuery1->RecordCount;i++)
{
if(ADOQuery1->FieldByName(fil)->AsString!="")
SG->Cells[t+1][i]=ADOQuery1->FieldByName(fil)->AsString;
else
SG->Cells[t+1][i]="NULL";
ADOQuery1->Next();
}
}
delete Str;//гы гы лечиться лечиться и еще раз лечиться. Хотя память ее не жалко - метр туда метр сюда и готова :) совсем готова :( мир ее памяти :((
//Str->Clear();
}
else
Application->MessageBox("Где карта, Билли нам нужна карта","Ошибка",MB_OK);
Все должно работать :D
Я не делал коменты, но готов ответить где что деиться, и без нервов послушать все замечания, кроме:'голосом нудной старушки' для этого там DBGrid есть. СССразу отвечаю от DBGrida отказался ибо прога тогда былабы не так визуальна (всмысли кода тогда бы вообще не надо было)

Добавлено: Пн апр 18, 2005 14:47
dBaser
Прикольно!
Borr писал(а):SG->ColCount
SG->RowCount
А че это делает?



Вобще мне понравилось... если учесть что с С++ я не работаю то на таких примерах и нужно учиться...

Добавлено: Пн апр 18, 2005 15:09
Borr
Чтобы не писать все время S-t-r-i-n-gGrid создаем в памяти на него указатель

Код: Выделить всё

TStringGrid *SG=StringGrid1;
А SG->ColCount и SG->RowCount устанавливает количество колонок и строк, соответственно, которые будут видны у SG см по коду мы устанавливаем количество строк SG= количеству строк полученных запросом (ADOQuery1).
К стати я дал именно такой пример на котором легче всего начать ваять свои! клиенты для БД. Есть конечно много вариаций но начать с чего-то надо почему бы не с ADO.
Кстати к БД Access можно подключиться этим же путем

Добавлено: Пн апр 18, 2005 22:39
Iron Man
Borr
подделашный драйвер :cheesy:

Добавлено: Вт апр 19, 2005 7:33
Borr
Я ж просил
Borr писал(а):и естессно послушать критику только внятную....

Добавлено: Вт апр 19, 2005 8:38
c0der
критика:

ошибка - утечка памяти:
TStringList *Str=new TStringList;
отсутствует delete Str

оформление и стилистика кода просто ужастное, отсутствуют отступы от начала строки (это что-то), отстутствуют пробелы до и после операторов (очень неудобно читать "аравноб", лучше "а равно б"), и ещё, читабельнее будет так:
if ( )
{
мало кода
}
else
{
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
}

нежели вот так

if ( )
{
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
много кода
}
else
{
мало кода
}

Добавлено: Вт апр 19, 2005 8:48
Borr
Про утечку памяти согласен не досмотрел. Просто это не весь код а более или менее логически завершенный кусок, вырванный из моего приложения.
Там Str->Clear(); я не дочитал мне что-то казалось... каюсь....
А про оформление ну кому как нравиться. Еще коменты обязательно, но об этом я уже извинялся.
Но радует, что хоть кто-то прочел мои излияния, при чем до полного понимания.

Добавлено: Ср апр 27, 2005 8:03
Borr
РРРаз такое дело продолжаем практикум по C++ Buider'y
Сегодня запусти какой ни какой mp3 файл (по простому)
Запускаем Builder он сразу должен создать новый проект. Помещаем на форму кнопку и элемент MediaPlayer с закладки System (в его свойствах , см панел слева меняем Name с MediaPlayer1 на Music, а Visible в false) по ней 2 раза.
На появившмся окне редактора выбираем закладку Unit1.h сюда добовляем (если нету) запись #include <MPlayer.hpp> (она должна идти до строчки class TForm1 : public TForm)
Теперь щелкаем по закладке Unit1.hpp и между скобками { } вставляем код

Код: Выделить всё

Music->FileName="D:\\Musik\\Ind\\01_Mein herz brennt.mp3";
Music->Open();
Music->Play();
Естественно путь и название муз файла ставим свой (обращаю ваше особое внимание в строке пути должен быть везде двойной слеш - \\ а сама строка должна быть в двойных кавычках в любом случае)
Компилим (зеленая стрелачка на панели управления или просто F9) кликаем по кнопке и слушаем вашу любимую музыку в испалнении вашего родного медиа плеера. Как облагородить его??? Ну как говорят херурги в таких случаях -- дальше без меня, дальше вы сами

Добавлено: Ср апр 27, 2005 12:32
Iron Man
Borr
Системные требования у этого проекта- минимум win2k. Если на 9x не поставить кодек mp3- работать не будет :cry:

Как вариант можно исользовать бесплатную библиотеку BASS.DLL.
Ссылка на тему
http://faq.pp.ru/forums/lofiversion/index.php/t834.html

Добавлено: Ср апр 27, 2005 13:37
Borr
А значит, то что он играет все время одн и тотже файл уже никого не волнует???
Да а еще тут не хватает ListView процедур сохранения созданного листа в файл, извлечение данных листа из файла, выбор файлов\директорий для проигрывания, не говоря уже о таких основных вещах как стоп, пауза, следующий из листа предидущий. А и лепить, формы друг к другу, еще можно как в винампе...

Я же там написал -- пример для затравки.

Добавлено: Ср апр 27, 2005 15:30
Iron Man
Borr
Ну вот! Затравка сработала! :mrgreen: :mrgreen: :mrgreen:

Добавлено: Ср апр 27, 2005 17:08
Borr
Как лист (список мелодий отрабатывать) надо показывать? (Через ListView)

Добавлено: Ср апр 27, 2005 17:33
Iron Man
Borr
Да, лучше наверное через ListView, из стандартных компонентов это самый лучший вариант. При желании можно сделать ручную прорисовку и всяких эффектиков туда навставлять )
Вся проблема в создании конкурентноспособного плеера это кодеки + визуализация + внешний вид... плееры относятся к той небольшой категории прог, которым нужны skin'ы.

Добавлено: Чт апр 28, 2005 7:14
Borr
Судя по всему нас тут три человека и у всех разные пристрастия... Я об этом говорил.. А спрашивал я интерисующиеся есть - как организовать плей лист для своей поделки - плеера? Могу помоч советом...

Добавлено: Чт апр 28, 2005 7:21
TOSHIK
Iron Man писал(а):категории прог, которым нужны skin'ы.
пользуюсь Apollo к которому скинов неу изначально. И полностью удовлеворен им как плеером. Я же музыку слушаю, а не на красивые кнопки любуюсь...