Собственно говоря в моем коде никто не мешает читать буферами, те функции которые я использую - они прежде всего именно такие. Вот тока как корректо отследить конец файла при таком подходе я не продумал. Можно правда до открытия считать атрибуты файла (вместе с размером) и подобрать размер буфера.
» FAQ по Borland C++ Builder
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 не идет.
Цитата:
может подкините названия функций, чтоб я знал про что читать
Если вы о 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 не идет.
Собираю в 6-м Builder консольный проект. Все работает на ура, НО: когда хочу перейти к релизу, как описано на предыдущей странице:
Цитата:
Получаю пачку ошибок от линкера:
[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
Не подскажете ли как с этим бороться ?
Цитата:
Чтобы перенести прогу на комп без билдера, и если ты работаешь только со стандартными компонентами и не пользуешь базы данных, по в свойствах проекта тыкни 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
Не подскажете ли как с этим бороться ?
Prizrak7
ясно. работы теперь на неделю.
и ещё где взять этот msdnlib?
ясно. работы теперь на неделю.
и ещё где взять этот msdnlib?
modulo
Цитата:
Ну, вам же сразу всеми способами не нужно это реализовать! У каждого из них свои преимущества и недостатки (скорость/portability/гибкость/итд) - выберите один и его долбайте помаленьку.
Цитата:
У сисадмина или у того кто в вашей конторе заведует подпиской на MSDN. Или у приятеля программера скопировать (это обычно диска 3 получается). Линк на бесплатную и легальную он-лайн версию я уже привел. Кроме того - в известных местах : осел, сразу после выхода свежей версии - наверное BitTorrent и/или IRC, итд. Дура это большая, спору нету, так что без broadband за это лучше не браться, но уж очень подробная...
Кстати, о свежих версиях. MSDN Lib с некоторой периодичностью обновляется (раньше было - раз в квартал, как сейчас - не знаю) и высылается всем подписчикам. Для простых смертных и особенно начинающих, любая версия вышедшая в последние года 3-4, как минимум на первых порах подойдет. Попробуйте потрусить знакомых, может быть кто-то сжалится и просто отдаст вам старую версию...
Цитата:
ясно. работы теперь на неделю.
Ну, вам же сразу всеми способами не нужно это реализовать! У каждого из них свои преимущества и недостатки (скорость/portability/гибкость/итд) - выберите один и его долбайте помаленьку.
Цитата:
и ещё где взять этот msdnlib
У сисадмина или у того кто в вашей конторе заведует подпиской на MSDN. Или у приятеля программера скопировать (это обычно диска 3 получается). Линк на бесплатную и легальную он-лайн версию я уже привел. Кроме того - в известных местах : осел, сразу после выхода свежей версии - наверное BitTorrent и/или IRC, итд. Дура это большая, спору нету, так что без broadband за это лучше не браться, но уж очень подробная...
Кстати, о свежих версиях. MSDN Lib с некоторой периодичностью обновляется (раньше было - раз в квартал, как сейчас - не знаю) и высылается всем подписчикам. Для простых смертных и особенно начинающих, любая версия вышедшая в последние года 3-4, как минимум на первых порах подойдет. Попробуйте потрусить знакомых, может быть кто-то сжалится и просто отдаст вам старую версию...
вот такой диалог
SelectDirectory(OutDir,TSelectDirOpts() << sdAllowCreate << sdPerformCreate,0);
стремный!
там нет метода canclose! там нет create dir!
может есть какой-нибудь умный фильтр в OpenDialog, чтобы можно было каталог открыть??
SelectDirectory(OutDir,TSelectDirOpts() << sdAllowCreate << sdPerformCreate,0);
стремный!
там нет метода canclose! там нет create dir!
может есть какой-нибудь умный фильтр в OpenDialog, чтобы можно было каталог открыть??
Добрый день.
Подскажите пжл какими способами можно писать кириллицей в исходном коде?
Если печатать в Виндоусе, в *.cpp, то при открытии программы в билдере отображаются слова аброкодаброй.
Переключение в самом билдере на кириллицу не получается (перепробовал все возможные варинты, говорят, что CTRL + SHIFT должен переключать, но не помогает).
Пробовал перекодировать файл *.cpp после редактирование его в блокноте в кодировку DOS, но это тоже ни к чему хорошему не привело ..
Answer:
Проблемку можно решить при помощи этих файлов (инструкции прилагаются).
Подскажите пжл какими способами можно писать кириллицей в исходном коде?
Если печатать в Виндоусе, в *.cpp, то при открытии программы в билдере отображаются слова аброкодаброй.
Переключение в самом билдере на кириллицу не получается (перепробовал все возможные варинты, говорят, что CTRL + SHIFT должен переключать, но не помогает).
Пробовал перекодировать файл *.cpp после редактирование его в блокноте в кодировку DOS, но это тоже ни к чему хорошему не привело ..
Answer:
Проблемку можно решить при помощи этих файлов (инструкции прилагаются).
6epcepk
Попробуй в настройках редактора посмотреть какой шрифт используется, вроде была такая трабла, там надо утсановить шрифт Courier у которого есть Cyr
Попробуй в настройках редактора посмотреть какой шрифт используется, вроде была такая трабла, там надо утсановить шрифт Courier у которого есть Cyr
Проблемку можно решить при помощи этих файлов (инструкции прилагаются).
Зацените:
Код:
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 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);
}
Ребят, мне нужно получить код символа, как это можно в билдере организовать?
JohnC
Код:
int d='x';
Edit1->Text=IntToStr(d);
Код:
int d='x';
Edit1->Text=IntToStr(d);
modulo
Да, этот самый. Оказывается проще некуда.
Да, этот самый. Оказывается проще некуда.
Подскажите, как работать со стандартным компонентом TClientSocket в отдельном модуле
не размещая компонент на форме, хочу поместить его в поток.
не размещая компонент на форме, хочу поместить его в поток.
JohnC
Лучше воспользоваться Indy (Delphi 6/7). Там работа происходит с блокируещими сокетами. Всё очень просто.
Цитата:
также как и с обычными компонентами. Нужно в Include добавить нужный модуль (я на Делфи пишу, поэтому на С имя модулей не назову). А потом стандарно создать, присвоить параметры.
Лучше воспользоваться Indy (Delphi 6/7). Там работа происходит с блокируещими сокетами. Всё очень просто.
Цитата:
компонентом TClientSocket
также как и с обычными компонентами. Нужно в Include добавить нужный модуль (я на Делфи пишу, поэтому на С имя модулей не назову). А потом стандарно создать, присвоить параметры.
Если б было так просто. Например, создаю форму и делаю так
не размещая на форме компонент NMSMTP с закладки FastNet.
-------------------------Unit1.h------------------------
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <NMsmtp.hpp> //подключаю в ручную
#include <Psock.hpp> // для копанента NMSMTP
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
TNMSMTP *SMTP; //добавляю сам
void __fastcall SMTPConnect(TObject *Sender);//добавляю сам
};
extern PACKAGE TForm1 *Form1;
#endif
-------------------Unit1.cpp---------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SMTP->Name="SMTP";
SMTP->ClearParams=true;
SMTP->Charset="us-ascii";
SMTP->EncodeType=uuMime;
SMTP->Host="smtp.mail.ru";
SMTP->SubType= mtPlain;
SMTP->Port=25;
SMTP->UserID="alex";
SMTP->Connect();
}
void __fastcall TForm1::SMTPConnect(TObject *Sender)
{
//
}
//---------------------------------------------------------------------------
Причем код компилируется, но при попытке выполнения вываливается ошибка.
Если я помещаю компонент на форму, но имя в Object Insepector ставлю не "SMTP", то также
ничего не работает.
Кто знает, как правильно сделать.
не размещая на форме компонент NMSMTP с закладки FastNet.
-------------------------Unit1.h------------------------
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <NMsmtp.hpp> //подключаю в ручную
#include <Psock.hpp> // для копанента NMSMTP
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
TNMSMTP *SMTP; //добавляю сам
void __fastcall SMTPConnect(TObject *Sender);//добавляю сам
};
extern PACKAGE TForm1 *Form1;
#endif
-------------------Unit1.cpp---------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SMTP->Name="SMTP";
SMTP->ClearParams=true;
SMTP->Charset="us-ascii";
SMTP->EncodeType=uuMime;
SMTP->Host="smtp.mail.ru";
SMTP->SubType= mtPlain;
SMTP->Port=25;
SMTP->UserID="alex";
SMTP->Connect();
}
void __fastcall TForm1::SMTPConnect(TObject *Sender)
{
//
}
//---------------------------------------------------------------------------
Причем код компилируется, но при попытке выполнения вываливается ошибка.
Если я помещаю компонент на форму, но имя в Object Insepector ставлю не "SMTP", то также
ничего не работает.
Кто знает, как правильно сделать.
JohnC
Я в С не силен, но кажеться конструктор вызывать надо. А ошибочка случайно не формата Access Violation ?
Я в С не силен, но кажеться конструктор вызывать надо. А ошибочка случайно не формата Access Violation ?
OdesitVadim
Цитата:
да, это самая, есть соображения?
Цитата:
А ошибочка случайно не формата Access Violation ?
да, это самая, есть соображения?
JohnC
Всё указывает на то, что не вызывается конструктор. А саму ошибочку в студию можно? (когда появиться окошко с ошибкой нужно нажаьб Ctrl+C - текс окна скопируется в буфер.) и строку проги, где собственно ошибка.
Всё указывает на то, что не вызывается конструктор. А саму ошибочку в студию можно? (когда появиться окошко с ошибкой нужно нажаьб Ctrl+C - текс окна скопируется в буфер.) и строку проги, где собственно ошибка.
спотыкается на SMTP->Name="SMTP";
---------------------------
Access violation at address 004019C3 in module 'Project1.exe'. Read of address 00000000.
---------------------------
если убрать SMTP->Name="SMTP";
тогда на SMTP->Charset="us-ascii";
---------------------------
Access violation at address 0042478C in module 'Project1.exe'. Write of address 00430047.
---------------------------
и т.д.
---------------------------
Access violation at address 004019C3 in module 'Project1.exe'. Read of address 00000000.
---------------------------
если убрать SMTP->Name="SMTP";
тогда на SMTP->Charset="us-ascii";
---------------------------
Access violation at address 0042478C in module 'Project1.exe'. Write of address 00430047.
---------------------------
и т.д.
JohnC
Так ты же не создал объект!
В заголовочном описал указательна объект ( TNMSMTP *SMTP;//добавляю сам), а реально не создаешь.
Пиши в конструкторе формы SMTP = new TNMSMTP(); (может с параметрами, если есть)
А в деструкторе формы delete SMTP
Так ты же не создал объект!
В заголовочном описал указательна объект ( TNMSMTP *SMTP;//добавляю сам), а реально не создаешь.
Пиши в конструкторе формы SMTP = new TNMSMTP(); (может с параметрами, если есть)
А в деструкторе формы delete SMTP
JohnC
Правильно EZH написал. Это конструктор и есть.
Правильно EZH написал. Это конструктор и есть.
EZH
OdesitVadim
Спасибо! все заработало.
OdesitVadim
Спасибо! все заработало.
надо сделать простую вещь, а я не понимаю как:
- Хочу чтобы по нажатию ESCAPE закрывалась текущая форма
- Когда жмут ALT+А4 или Крести закрытия приложения, чтобы спрашивало, действительно хочет или нет ? т.е. как остановить процесс закрытия приложения
- Хочу чтобы по нажатию ESCAPE закрывалась текущая форма
- Когда жмут ALT+А4 или Крести закрытия приложения, чтобы спрашивало, действительно хочет или нет ? т.е. как остановить процесс закрытия приложения
spike
Для обработки Esc можно:
- написать событие формы OnKeyPress и в нём вызывать Close()
- посадить на форму любой контрол с экшном, у которого в шорткате стоит Esc. в обработчике экшна тот же Close()
Спросить перед закрытием можно в событии формы OnCloseQuery и отменить закрытие.
Для обработки Esc можно:
- написать событие формы OnKeyPress и в нём вызывать Close()
- посадить на форму любой контрол с экшном, у которого в шорткате стоит Esc. в обработчике экшна тот же Close()
Спросить перед закрытием можно в событии формы OnCloseQuery и отменить закрытие.
Народ а никто не поделится ссылочкой на электронный учебник по С++ вот хочется на досуге почитать?! И скажите пожалуйста на ваш взгляд более комфортаная и удобная в это же время восстребованная какая среда разработки является?
EZH
а как в ActionList добавить свои кнопки, а то там Escape нету
а как в ActionList добавить свои кнопки, а то там Escape нету
spike
Так и напиши ручками Esc
Если нужен Enter - так и пиши Enter
Так и напиши ручками Esc
Если нужен Enter - так и пиши Enter
Вопрос такой:
как в пятом билдере осуществить работу с базой данных, которая содержит русский текст? (фишка типа preferences->font->courier(русский) в database designer'e не работает)
как в пятом билдере осуществить работу с базой данных, которая содержит русский текст? (фишка типа preferences->font->courier(русский) в database designer'e не работает)
Sprehenbreher
Ну без подробностей тут не обойтись, что за сервер БД, какие компоненты для доступа...
Ну без подробностей тут не обойтись, что за сервер БД, какие компоненты для доступа...
Страницы: 12345678910111213141516171819202122232425262728
Предыдущая тема: ms exchange
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.