Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FAQ по Borland C++ Builder

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 41 42

Открыть новую тему     Написать ответ в эту тему

nobody2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
Ну что тут не понятно?
 
Изначально проект быстрого визуального проектирования приложений был на паскале. И конкурировал, в основном, с вижуал басиком. По понятным причинам различным профи и другим снобам не катило писать в такой IDE и переходить с СИ++ на Паскаль.
И они использовали MSVC, число пользователей которой заставляло людей из Борданда кусать локти и нервно курить в коридоре. И тут пришло озарение: скрестить бульдога с носорогом (Паскаль и С++), чтоб досталось и вашим и нашим. Взяли компилятор от Borland C++ (кто  помнит OWL) и успешную библиотеку VCL и действительно визуальную IDE от дельфей, заменили back-end паскалевский компиллер, чтоб генерил объектники omf и назвали все Borland С++Builder.  
 
Хелп взяли дельфовый, большинство описаний переделали для билдера, процентов 10 забыли. Апишный хелп (довольно древний) взяли от микрософта. Вся хелповая система настолько глючная, что использовать все вместе в IDE (через oh.exe) просто не возможно. Для сравнения возьмите хелп, поставляемый с MSVC.
 
То же самое со сторонними библиотеками (типа ATL, версию 3.0 которой - столетней давности, к тому же без bug fix'ов - поставляют даже в С++BulderX).
 
Обычные, простые программки (несложный GUI) пишутся на ура. А что надо делать для нестандартных запросов, хорошо описано в http://www.softcraft.ru/coding/winapi/mfcbad.shtml, только замените MFC на VCL.

Всего записей: 223 | Зарегистр. 15-07-2003 | Отправлено: 12:31 07-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у меня снова бредовые проекты:
мне надо сделать прогу разбиения файлов на части и естественно сборки обратно (чтоб лишних деталей не осталось), а что самое главное, надо чтобы файл после этого не пострадал. я вообще-то мало представляю как это все реализовать, может у кого есть похожий код, я разберусь

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 08:41 08-02-2005
nobody2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Типа Split/Combine в TotalCommander?

Всего записей: 223 | Зарегистр. 15-07-2003 | Отправлено: 12:23 09-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
nobody2
ага
идея у меня такая - в первом файле в начале записать количество частей, вот только вообще не представляю как если загрузить содержимое файла в какую-то переменную, тот как потом её делить...
я интерфейс-то уже сделал, дошёл до самого главного - разбираюсь с fopen, может кто посоветует какими функциями лучше попользоваться?

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 13:43 09-02-2005
SashKa



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
предлагаю так.
В интерфейсе запрашивается число частей (или разер части, что еще проще) и понеслись:
 
Открываем исходный файл в двоичном режиме и читаем его по байтикам(байтики считаем)
Открываем новый файл на запись. даем ему скажем расширение p00. И пишем туда байты из первго файла. Как только достигнут размер части, то закрываем файл p00 и создаем файл p01 скажем. Если достигнут конец исходного файла то заканчиваем запсись.
Можно даже формировать имя файла не отбрасывая исходное расширение а просто дописывая .p** Тогда ничего в первый файл дописывать не надо(число частей и все такое) Число частей вычисляется путем сканирования каталога и подсчетом частей существующих.
 
Ну а объединить части можно в обратном порядке.
 
Вот пример split
 
ifstream srcfile;
   srcfile.open("src.src",ios::in|ios::binary);
int cntr;
char bytic;
ofstream dstfile;
         dstfile.open("src.src.p00",ios::out|ios::binary);
while(1){
   srcfile.read(&bytic,1);
   if(srcfile.eof()) {dstfile.close(); break};
   cntr++;
   if(cntr==PartSize) {
     dstfile.close();
     dstfile.open("src.src.p01",ios::out|ios::binary);
     cntr=0;
   }
   dstfile.write(&bytic,1);
};
 
srcfile.close();
 
где "src.src" - имя и расширение исходно файла
Здесь только не генерируется новое имя файла новой части, но это лего сделать. (т.е. максимум две части)
 
 
Добавлено:
Да, еще забыл сказать что здесь использовались стандартные i/o классы C++
header <iostream.h> и <fstream.h> - ну это для тех кто не знает

Всего записей: 130 | Зарегистр. 20-04-2004 | Отправлено: 14:59 10-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
попробую

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 08:50 11-02-2005
nobody2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Названия частей, их количество и контрольную сумму лучше хранить в отдельном файле (как в TC).

Всего записей: 223 | Зарегистр. 15-07-2003 | Отправлено: 12:14 11-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SashKa
а нельзя такое провернуть, используя  
FILE* Source = fopen("src.src",r) - исходный файл,  
FILE* Part =fopen("src.src",w) - часть для записи,  
Part=fread(Source,количество байт) - это не сработает?
и можно будет как-нибудь сделать чё-нибудь типа:
int* pointer; - указать в нем количество частей
а потом
Part=pointer+fread(Source,количество байт); - это сработает?

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 08:47 14-02-2005
Prizrak7



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modulo
 
Откровенно говоря, я думаю что за копирование файла побайтно (см. код SashKa) ваш компьютер подаст на вас жалобу в ООН - за жестокое обращение с животными. Копируйте буферами (размер можете установить экспериментально, но в общем случае - увлекаться не стоит). Можете попробовать использовать функции чтения/записи Win32 API (см. хелп), при определенном раскладе это может дать некоторую прибавку в скорости. В любом случае не забывайте проверять значения которые функции (и операторы, например в случае "старого" new ) возвращают и реагировать соответственно.

Всего записей: 148 | Зарегистр. 22-09-2002 | Отправлено: 19:00 14-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Prizrak7
может подкините названия функций, чтоб я знал про что читать

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 09:03 15-02-2005
SashKa



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Собственно говоря в моем коде никто не мешает читать буферами, те функции которые я использую - они прежде всего именно такие. Вот тока как корректо отследить конец файла при таком подходе я не продумал. Можно правда до открытия считать атрибуты файла (вместе с размером) и подобрать размер буфера.

Всего записей: 130 | Зарегистр. 20-04-2004 | Отправлено: 12:16 15-02-2005
Prizrak7



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modulo

Цитата:
может подкините названия функций, чтоб я знал про что читать

Если вы о Win32 API, то можете глянуть в раздел "Files I/O" MSDN Library, а конкретнее в сторону CreateFile() / ReadFile() / WriteFile() / CloseHandle() / итд (при этом не забывая проверять возвращаемые значения и выходные параметры, в случае надобности прибегая к GetLastError()). Это будет наверняка где-нибудь в разделе "Platform SDK", а вообще - воспользуйтесь индексом. В моей версии MSDN Lib под "Files I/O" есть под-раздел "Using I/O" с примерами использования этих и других функций. Есть в Win32 и более продвинутые фишки, но я думаю что это уж вовсе вам сейчас лишнее. Если у вас на машине MSDN Lib не установлен - либо пользуйтесь он-лайновой версией, либо сделайте поиск по хелпу C++Builder (с ним в комплектации поставляется Win32 reference, поищите ярлык на него в папке "C++Builder"->"MS SDK Help Files" - или ее эквиваленте на вашей машине - в меню Start виндов, или прямо из меню Help IDE).
 
А если не хотите заморачиваться на первых порах, можете воспользоваться функциями Run-Time Library : fopen() / fread() / fwrite() / fclose() / ferror() / feof() / итд. Им нужно передавать меньше параметров и вообще с ними общение проще. Примеры точно есть в MSDN Lib, и я практически уверен что и в хелпе C++Builder тоже.
 
Или как сказал SashKa, можно воспользоваться файловыми потоками C++, но это пожалуй будет сложнее на первых порах. Тогда понятное дело читать о ifstream / ofstream...
 
В общем, есть значительно больше чем один способ освежевать кошку. Самое главное - внимательно прочитать справку по используемым функциям, и четко отслеживать возвр. значения и ошибочные состояния.
 
 
SashKa

Цитата:
Собственно говоря в моем коде никто не мешает читать буферами

А я разве утверждал что в ваш код кто-то мешает внести соответствующие изменения? Я высказался исключительно о текущем состоянии вашего кода!
 
Добавлено:
modulo
 
Хе-хе, не поленился таки открыть справку C++Builder!  
 
Вот вам еще способ поиздеваться над бедной кошкой : "File management Routines" BCB. FileOpen() / FileRead() / FileWrite() / FileClose() плюс вспомогательные FileSeek() / FileExists() и др. Это уже "native" рутины BCB (т.е. часть VCL), так что они сработают только в BCB. И хотя примеры на них в справке есть, сама справка в BCB (как минимум по версию 5!) - крайне мерзкая, ни в какое сравнение с MSDN Lib не идет.

Всего записей: 148 | Зарегистр. 22-09-2002 | Отправлено: 02:17 16-02-2005
WhiteRabbit



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Собираю в 6-м Builder консольный проект. Все работает на ура, НО: когда хочу перейти к релизу, как описано на предыдущей странице:
 
 
Цитата:
Чтобы перенести прогу на комп без билдера, и если ты работаешь только со стандартными компонентами и не пользуешь базы данных, по в свойствах проекта тыкни Release (Compiler), сними галочку с Build with Runtime Packages (Packages), сними галочку Use dynamic RTL (Linker) и прихвати в папочку программы borlndmm.dll и cc3260mt.dll из папки bin билдера.

 
Получаю пачку ошибок от линкера:
 
[Linker Error] Unresolved external 'System::__linkproc__ __fastcall WStrClr(void *)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\RELEASE\VCLE.LIB|wstring
 
[Linker Error] Unresolved external 'System::__linkproc__ __fastcall VarClear(System::Variant&)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\RELEASE\VCLE.LIB|variant
 
[Linker Error] Unresolved external 'System::__linkproc__ __fastcall WStrFromPWChar(System::WideString&, wchar_t *)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\RELEASE\VCLE.LIB|wstring
 
[Linker Error] Unresolved external '__fastcall Sysutils::WideCompareStr(const System::WideString, const System::WideString)' referenced from D:\Мои документы\BUILDER\Релиз 1.0\Program.OBJ
 
Не подскажете ли как с этим бороться ?

Всего записей: 177 | Зарегистр. 18-08-2003 | Отправлено: 12:02 16-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Prizrak7
ясно. работы теперь на неделю.
и ещё где взять этот msdnlib?

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 12:12 16-02-2005
Prizrak7



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modulo

Цитата:
 ясно. работы теперь на неделю.

Ну, вам же сразу всеми способами не нужно это реализовать! У каждого из них свои преимущества и недостатки (скорость/portability/гибкость/итд) - выберите один и его долбайте помаленьку.
 

Цитата:
и ещё где взять этот msdnlib

У сисадмина или у того кто в вашей конторе заведует подпиской на MSDN.  Или у приятеля программера скопировать (это обычно диска 3 получается). Линк на бесплатную и легальную он-лайн версию я уже привел. Кроме того - в известных местах : осел, сразу после выхода свежей версии - наверное BitTorrent и/или IRC, итд. Дура это большая, спору нету, так что без broadband за это лучше не браться, но уж очень подробная...
 
Кстати, о свежих версиях. MSDN Lib с некоторой периодичностью обновляется (раньше было - раз в квартал, как сейчас - не знаю) и высылается всем подписчикам. Для простых смертных и особенно начинающих, любая версия вышедшая в последние года 3-4, как минимум на первых порах подойдет. Попробуйте потрусить знакомых, может быть кто-то сжалится и просто отдаст вам старую версию...

Всего записей: 148 | Зарегистр. 22-09-2002 | Отправлено: 18:55 16-02-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот такой диалог
SelectDirectory(OutDir,TSelectDirOpts() << sdAllowCreate << sdPerformCreate,0);
стремный!
там нет метода canclose! там нет create dir!
может есть какой-нибудь умный фильтр в OpenDialog, чтобы можно было каталог открыть??

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 12:30 12-03-2005
6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день.
Подскажите пжл какими способами можно писать кириллицей в исходном коде?
Если печатать в Виндоусе, в *.cpp, то при открытии программы в билдере отображаются слова аброкодаброй.
Переключение в самом билдере на кириллицу не получается (перепробовал все возможные варинты, говорят, что CTRL + SHIFT должен переключать, но не помогает).
Пробовал перекодировать файл *.cpp после редактирование его в блокноте в кодировку DOS, но это тоже ни к чему хорошему не привело ..
 
 
Answer:
Проблемку можно решить при помощи этих файлов (инструкции прилагаются).



----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 11:49 13-03-2005 | Исправлено: 6epcepk, 21:21 14-03-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
6epcepk
Попробуй в настройках редактора посмотреть какой шрифт используется, вроде была такая трабла, там надо утсановить шрифт Courier у которого есть Cyr

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 12:53 13-03-2005
6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Проблемку можно решить при помощи этих файлов (инструкции прилагаются).

----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 21:19 14-03-2005
modulo



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Зацените:

Код:
 
int InHandle,OutHandle;
InHandle=FileOpen(Fragfile,fmOpenRead);
OutHandle=FileCreate(NewFile);
void *buffer=new char[100]; //от фонаря
if(OutHandle==-1)ProcessInfo->Lines->Add("FUCK!! error creating file ");
if(InHandle==-1)ProcessInfo->Lines->Add("FUCK!! error opening file ");
 
while(1){
 
FileRead(InHandle,buffer,100);
FileWrite(OutHandle,buffer,100);
ProcessInfo->Lines->Add("Part #" + IntToStr(filecntr)+ ": " + NewFile);
 
if(!eof(InHandle)){
 ProcessInfo->Lines->Add("Hope all OK");
 break;
}
if(filecntr>10) break;
 
NewFile=Partfilename + filecntr++;
OutHandle=FileCreate(NewFile);
if(OutHandle==-1)ProcessInfo->Lines->Add("FUCK!! error creating file ");
}
 
delete buffer;
FileClose(InHandle);
FileClose(OutHandle);
}
 

 
так вот, функция int eof(int handle)  <io.h> должна возвращать 0 при достижении конца файла хэндела, но она этого не делает! может есть какая-нибудь другая функция?
 
Добавлено:
всё я её добил, без всякого мсдна! вот так:

Код:
 
temp=FileRead(InHandle,buffer,PartSize);
FileWrite(OutHandle,buffer,temp);
ProcessInfo->Lines->Add("Part #" + IntToStr(filecntr)+ ": " + NewFile);
 
//if(!eof(InHandle)){
if(temp<PartSize){
 ProcessInfo->Lines->Add("Hope all OK");
 break;
}
 

всем спасибо
 
Добавлено:
ещё вопрос:
вот эта штука не работает (возвращает -1), хотя ВСЯКО должна
 
InHandle=FileOpen(Fragfile,fmOpenRead);
filelength(InHandle);
 
путь точно рабочий (перепроверено)

Всего записей: 228 | Зарегистр. 03-07-2004 | Отправлено: 13:56 15-03-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FAQ по Borland C++ Builder


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru