Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» FAQ по Borland C++ Builder

Автор: mozgodrocha
Дата сообщения: 12.02.2008 13:44
afiget: " И там хранятся?"

Да, там и хранятся.

afiget: "Или нет доступа к загруженным в TSLScope данным извне (для повторной обработки)?"

Запросто:
SLScope1->Channels->Channels[<номер канала>]->Data->GetYData(<имя массива>);

Просто это получается прога, в которой все крутится вокруг данных, процедурная. А не прога в которой главное действие, объектная.
Вот мне и не понятно как все построить. И как в такой задаче обойтись без глобальных переменных.
Еще меня очень сильно напрягает работа с файлами. Что, 2 функции объединять в класс? Театр абсурда какой-то... Все же должно иметь смысл.
Автор: yurich_v
Дата сообщения: 12.02.2008 17:14

Цитата:
Просто это получается прога, в которой все крутится вокруг данных, процедурная. А не прога в которой главное действие, объектная.
Вот мне и не понятно как все построить. И как в такой задаче обойтись без глобальных переменных.
Еще меня очень сильно напрягает работа с файлами. Что, 2 функции объединять в класс? Театр абсурда какой-то... Все же должно иметь смысл.


mozgodrocha
Блин, ну жалко же ж пацана! Диагноз понятен: хочется сделать по-уму и красиво, а получается как делал до этого:-)
Запрет на глобальные переменные -- это вовсе не главный постулат ООП, как это может показаться. В любой программе существуют и будут существовать переменные, доступ к которым необходим во время всего действия программы. ООП только требует, чтобы доступ к таким переменным осуществлялся только через методы объекта (класса), чьим полем она и является.
Т. е., ну есть же у тебя в проге общие данные -- границы графика, допустим. Ну вот и делай класс TPlot, у которого есть ПРИВАТНОЕ поле int Хмах, которое по запросу любого клиента возвращает метод класса int ТPlot::GetMax.
Если отвлечься от частностей, можно сказать, что в экземляре объекта этот самый Хмах и есть глобальная переменная. Но фокус то в том, что доступ к такой "глобальной переменной" имеет ТОЛЬКО ее владелец. И изменить ее может только он, а не всякая шушера (ненароком и случайно), которой понадобился этот самый Хмах по ходу дела!
НЕ сочти это за эстетский совет тертого программера (сам такой): тебе просто надо взять хорошую старую книгу об ООП, прочитать хотя бы первую треть и сделать пару объектных учебных примеров на предмет тех же излюбленных геометрических примитивов: точки, линии, окружности. Это даст гораздо больше пользы, чем юзание Билдера в поисках истины:-) ООП -- это, без балды, другое мышление, не имеющее ничего общего со структурным программированием, и окошками, кстати, тоже.
Ну а касаемо самого СБилдера, то он скорее мешает въехать в ООП. У него своя логика, есть свои объекты, та же главная форма, например. Как удивился мой старый друг -- веб программер: "А что, если у меня окошки, то это не объктное программирование?!". Десять раз нет -- совсем не обязательно объектное. Т. е., когда ты неопытен, и пытаешься сделать красивую (не внешне) программу -- тебе надо приложить определенные усилия, чтобы не дать Билдеру (с его кучей возможностей и внутренней логикой и собственными классами), сбить тебя с панталыку. Что, собственно и имеем:-) Вот это и есть причина твоих метаний.
Так что брось на пару дней свою прогу (она же работает?), и сделай кошку, которая -- та же собака, но мяукает:-)
...Ну а если отвечать на твой вопрос в частности, то готовых рецептов тут нет. Но, в самом общем случае, проще всего иногда бывает поступать так: кто данные показывает, тот ими и владеет.
Автор: mozgodrocha
Дата сообщения: 13.02.2008 18:11
yurich_v

Да, наверно действительно имеет смыл сначала поучиться на примитивах. Взял на изучение "Р. Лафоре - ООП в С++". Вроде бы вполне позитивная книга.
Автор: yurich_v
Дата сообщения: 14.02.2008 01:53
mozgodrocha

Цитата:
Да, наверно действительно имеет смыл сначала поучиться на примитивах. Взял на изучение "Р. Лафоре - ООП в С++". Вроде бы вполне позитивная книга.


А я, кстати, тебе именно за него и хотел втрулить. Только забыл, пока мыслею по древу:-)
Автор: clear2121
Дата сообщения: 17.02.2008 05:31
Привет ВСЕМ!

Пробую перейти на С++ Билдер 2007. Но у меня куча прорблем.
Все время использовал в начале проги СПЛЭШ форму. В Source
Application->Initialize();
Application->Title = "Мой титл.";
Form10 = new TForm10( Application );
Form10->PB->Properties->Max = 30;
Form10->Show();
а в проге в создании Form1
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form10->PB->Position = 7;
Application->ProcessMessages();
ShowCursor( true );

Form10->cxLabel1->Caption = "Инициализация программы...";
Application->ProcessMessages();
...

Компилится нормально, но при запуске проги первые две строки пролазят нормально, а на лайбел ругается ACCES ... (ошибка доступа). В чем дело?

Вообщем хотелось бы перейти на CodeGear2007, но если такая хрень непонятная творится, то придется остаться на BDS2006.

СПАСИБО!
Автор: clear2121
Дата сообщения: 20.02.2008 11:00
Отвечу сам себе! Все пошло, просто убрал *.h, сохранил и перекомпилил.
Но остался вопрос
String LogFi = WorkPath + "Log_" + (String)Date() + ".log";
нормально компилилось и работало в bds2006. в 2007 пишет при компиляции

[BCC32 Error] main.cpp(162): E2015 Ambiguity between '_fastcall System::AnsiString::AnsiString(const System::AnsiString &) at c:\program files\codegear\rad studio\5.0\include\vcl\dstring.h:70' and '_fastcall System::AnsiString::AnsiString(int) at c:\program files\codegear\rad studio\5.0\include\vcl\dstring.h:76'

Я что то не пойму почему. ПОДСКАЖИТЕ ПЛИЗ!!! Проект горит

СПАСИБО!
Автор: EZH
Дата сообщения: 21.02.2008 00:43
clear2121
Попробуй заменить (String)Date() на DateToStr(Date()) или Date().DateString()
Автор: clear2121
Дата сообщения: 21.02.2008 04:54
EZH
Я так и сделал. Но вопрос остается - ПОЧЕМУ НЕЛЬЗЯ В Билдере 2007 писать по старому? Или переписали класс AnsiString?

СПАСИБО!
Автор: vidic777
Дата сообщения: 21.02.2008 07:33
clear2121

Цитата:
Пробую перейти на С++ Билдер 2007. Но у меня куча прорблем.
Все время использовал в начале проги СПЛЭШ форму.

Я чуть чуть не так делал для паказа Сплэш-виндов

Код:
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Main.cpp", fmMain);
...
... тут мои формы
USEFORM("dlgFindContactFile.cpp", dlgFindContact);
//---------------------------------------------------------------------------
#include "SplashFile.h" //эта строка важна для создания формы через new()

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
// создание, показ и обновление.
SplashWindow = new TSplashWindow(Application);
SplashWindow->Show();
SplashWindow->Update();

Application->Initialize();
Application->Title = "...мой тайтл";
Application->CreateForm(__classid(TfmMain), &fmMain);
Application->CreateForm(__classid(TdmMain), &dmMain);
...
... создание моих форм динамически, код что сгенерила Студия

SplashWindow->cxProgressBarLoadApp->Position = 10;
SplashWindow->Update();

Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
Автор: clear2121
Дата сообщения: 21.02.2008 10:27
vidic777
Спасибо за ответ.
1. Я сплэш делаю так
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE Mutex=CheckInstance(NamedMutex); //пробуем установить Mutex
if (!Mutex) //Если таковой уже есть
{
Application->MessageBox("Программа уже запущена.", "ВНИМАНИЕ!", MB_ICONSTOP|MB_OK );
ReleaseMutex(Mutex);
return 0;
}
    try
    {
        Application->Initialize();
        Application->Title = "Моя прога.";

        Form10 = new TForm10( Application );
        Form10->PB->Properties->Max = 30;
        Form10->Show();

        Application->CreateForm(__classid(TDM), &DM);
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
    }
    catch (Exception &exception)
    {...
И в конце void __fastcall TForm1::FormCreate(TObject *Sender)
{...
    Form10->PB->Position = 30;
    Application->ProcessMessages();

    delete Form10;
    Form10 = 0;
}
Это дает мне по мере загрузки проги показывать на лэбелах и прогрессБаром, что что то происходит .
Это отступление. Кто как привык

2. В cpp заремил все "#pragma link ...", а в h все "#include ..." Потом нажал сохранить и он все нужное сам добавил. Все. Проект пошел. Правда потом но начал говорить, что не нашел компоненты с цифоркой 10, я сказал удалить и все, все заработало.

3. String LogFi = WorkPath + "Log_" + (String)Date() + ".log"; не идет, а вот
int a = 10;
int b = (String)a;
проходит нормально. Пришлось все в проектах переделывать с (String) на TimeToStr(), DateToStr() и т.д.

4. Похоже, что они что то все таки переделали. Если в БДС он был в справке как AnsiString, то сейчас его в справке нет. Смотрю далее...

Автор: mozgodrocha
Дата сообщения: 24.02.2008 15:03
Народ, а если мне нужно чтобы прога могла показывать картинки в совсем уж экзотических форматах, типа cin, dpx, exr... Как быть в такой ситуации? Сам импорт/экспорт у меня есть.
Автор: Tantos
Дата сообщения: 28.02.2008 01:35
mozgodrocha
Либо ищи компонент, который понимает эти форматы, либо разбирай формат и отрисовывай сам. Пример работы с psd есть в журнале "Vr-Online Для программистов №6"
Автор: MrZeRo
Дата сообщения: 28.02.2008 12:24
mozgodrocha
ImageMagick
(supports PCD, DICOM, CUT, AVS, CIN, DOT, DPX, FITS, FPX, HDF, MAT, MIFF, MTV, PALM, PCL, PICT, PIX, PWP, RLA, SGI, SUN, SVG, TTF, VOCAR, VIFF, XBM, XCF, XPM)
Найти можно: hччp://www.hi-components.com/ndownloads_plgins.asp
Это как я понял плагины к ImageEn библиотеке. Может, еще можно нарыть плагинов ...
Автор: HelioSS
Дата сообщения: 28.02.2008 12:51
пОДскажите как начать работать с pARadox или Access с помощью ADO в Builder
Автор: Tantos
Дата сообщения: 29.02.2008 02:22
HelioSS, для начала попробовать почитать справку...
Автор: HelioSS
Дата сообщения: 29.02.2008 09:57
Tantos

Ну вроде как чуть-чуть понял что да как. Но вот какой косяк получается:
1. Создаю форму и тут же её сохраняю.
2. Кидаю на форму TADOConnection и тут же F9
3. Делаю ConnectionString: MicrosftJet 4.0 -> db1.mdb (созданная ранее в MS Access) -> пароль Admin -> Пустой пароль -> проверить подключение -> Права доступа (Read, Write, Share Deny None) -> OK
4. Опять F9 (пытаюсь найти где течёт)
5. В TADOConnection выставляю Connected -> true
6. Опять F9 и получаю Error "Invalid Enum Value".

Бывало так что уже и TDataSoucer и TADOTable добавляешь и выскакивает эта же ошибка.
Автор: Tantos
Дата сообщения: 03.03.2008 03:45
HelioSS

Код:
void __fastcall TfrmMain::OpenMDB(const AnsiString Name)
{
//TDataModule *dmMain;
//TADOConnections *acMain;
//TADODataSet *adsMain;
//WideString ConnStr;
AnsiString asCommand("");
if(dmMain->acMain->Connected) {
dmMain->adsMain->Close();
dmMain->acMain->Close();
}

dmMain->acMain->Close();

ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=" + Name + ";Mode=ReadWrite;Persist Security Info=True;";

dmMain->acMain->ConnectionString = ConnStr;

asCommand = "SELECT * from tbl";
dmMain->adsMain->CommandText = WideString(asCommand);

dmMain->acMain->Open();
dmMain->adsMain->Open();
}
//---------------------------------------------------------------------------
Автор: HelioSS
Дата сообщения: 03.03.2008 10:41
Tantos

Спасибо. Хорошо. Проверю кодом. Но что же я не так делаю в режиме конструктора?
Автор: dela_cky
Дата сообщения: 03.03.2008 15:18
Всем привет, пишу тут программу по переносу базы данных с MS SQL Servera в Access, вроде уже написал но немогу понять как написать что бы первичный ключ ставилься. по моему предположению это должно где-то тут прописать, но не знаю что уже писать. вот часть моего кода.

Код: for(int j=0;j< ADOTable1->FieldCount;j++) // список полей таблицы i
{
fn= ADOTable1->Fields->Fields[j]->FieldName;
// AnsiString s1=ADOTable1->MasterFields;
ft= ADOTable1->Fields->Fields[j];
AnsiString s1=ft->KeyFields;
if(j== ADOTable1->FieldCount-1) s=s+fn+" "+FieldTypeToString(ft); else
s=s+fn+" "+FieldTypeToString(ft)+",";
if(str1.Length()>0){str1+=",";str2+=",";}
str1+=fn;
str2=str2+":"+fn;
}
AnsiString kfld= ADOTable1->Fields->Fields[0]->KeyFields;
if(kfld.Length()>0)
s+=", primary key("+kfld+")";
else s+=")";
ADOQuery2->SQL->Text=s;
ADOQuery2->ExecSQL(); // создание таблиц полей в новой базе
ADOTable1->First();
Автор: afiget
Дата сообщения: 07.03.2008 16:16
Привет.
После выпуска 2006-2007 версий BDS, я думаю, все оценили удобство функций редактора Fold/Unfold.
Тем не менее, есть еще много проектов, написанных на Builder 6, которые по каким-то причинам перевести на новые IDE нельзя (или пока еще нельзя), но поддерживать нужно.
Вопрос: может быть кто встречал утилиты или плагины к IDE, которые добавляют этот функционал к редактору кода в Borland C++ Builder 6?
Автор: Tantos
Дата сообщения: 17.03.2008 03:52
EControl Syntax Editor, но он платный.
Автор: HelioSS
Дата сообщения: 09.04.2008 16:56
C помощью Referential Integrity можно задать связи между таблицами. Однако, когда я пытаюсь создать связь моейц таблицы с другой моей таблицей, находящейся в отличном от каталога по умолчанию DatabaseDektop, я не могу этого сделать, так как моя сторая таблица просто не видна в Referential Integrity.
Автор: spike
Дата сообщения: 10.04.2008 10:00
как организовать перезапуск программы ?
Автор: HelioSS
Дата сообщения: 10.04.2008 11:30
spike
В смысле? Создай скрипт и запусти его при закрытии своей программы
Автор: spike
Дата сообщения: 10.04.2008 12:12
HelioSS
мне надо после обновления программы (переименования старого exe файли копирования нового) закрыть программу и чтобы она запустилась, после того как выгрузится
Автор: Starley25
Дата сообщения: 13.04.2008 11:02
Господа!

Может быть кто-нибудь подскажет аналог Borland C++ Builder для работы в Linux (смысл в том, чтобы по минимуму урезан был функционал и как говорится не нужно было платить 50 000 $ за программу).

С уважением Starley25.
Автор: Garrett
Дата сообщения: 13.04.2008 12:50
Starley25
wxWidgets ?
Автор: VerZer
Дата сообщения: 13.04.2008 16:29
spike

Код: void __fastcall TForm1::Button1Click(TObject *Sender)
{
Application->Terminate();
ShellExecute(0, "open", "c:\\new.exe", 0, 0, SW_SHOW);
}
Автор: Tantos
Дата сообщения: 14.04.2008 03:16
Starley25
QT by Trolltech (QT Designer)
Автор: spike
Дата сообщения: 14.04.2008 12:46
VerZer
thx

Страницы: 12345678910111213141516171819202122232425262728

Предыдущая тема: ms exchange


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.