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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

afiget



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

Цитата:
данные из текстового файла прямиком загружаются в каналы TSLScope

И там хранятся? Тогда зачем их хранить еще где-то? Или нет доступа к загруженным в TSLScope данным извне (для повторной обработки)?
http://mitov.newsgrouphosting.com/mitov.products.plotlab.vcl/19/How-to-pull-data-from-TSLScope.html

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 13:53 12-02-2008
mozgodrocha

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
afiget: " И там хранятся?"
 
Да, там и хранятся.  
 
afiget: "Или нет доступа к загруженным в TSLScope данным извне (для повторной обработки)?"
 
Запросто:
SLScope1->Channels->Channels[<номер канала>]->Data->GetYData(<имя массива>);
 
Просто это получается прога, в которой все крутится вокруг данных, процедурная. А не прога в которой главное действие, объектная.  
Вот мне и не понятно как все построить. И как в такой задаче обойтись без глобальных переменных.
Еще меня очень сильно напрягает работа с файлами. Что, 2 функции объединять в класс? Театр абсурда какой-то... Все же должно иметь смысл.

Всего записей: 193 | Зарегистр. 13-10-2006 | Отправлено: 14:44 12-02-2008 | Исправлено: mozgodrocha, 15:54 12-02-2008
yurich_v

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

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

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

Всего записей: 99 | Зарегистр. 08-01-2007 | Отправлено: 18:14 12-02-2008
mozgodrocha

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

Всего записей: 193 | Зарегистр. 13-10-2006 | Отправлено: 19:11 13-02-2008
yurich_v

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

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

 
   А я, кстати, тебе именно за него и хотел втрулить. Только забыл, пока мыслею по древу:-)

Всего записей: 99 | Зарегистр. 08-01-2007 | Отправлено: 02:53 14-02-2008
clear2121



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет ВСЕМ!
 
Пробую перейти на С++ Билдер 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.
 
СПАСИБО!

Всего записей: 311 | Зарегистр. 07-04-2005 | Отправлено: 06:31 17-02-2008
clear2121



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отвечу сам себе! Все пошло, просто убрал *.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'
 
Я что то не пойму почему. ПОДСКАЖИТЕ ПЛИЗ!!! Проект горит
 
СПАСИБО!

Всего записей: 311 | Зарегистр. 07-04-2005 | Отправлено: 12:00 20-02-2008
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
clear2121
Попробуй заменить (String)Date() на DateToStr(Date()) или Date().DateString()

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 01:43 21-02-2008
clear2121



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
Я так и сделал. Но вопрос остается - ПОЧЕМУ НЕЛЬЗЯ В Билдере 2007 писать по старому? Или переписали класс AnsiString?
 
СПАСИБО!

Всего записей: 311 | Зарегистр. 07-04-2005 | Отправлено: 05:54 21-02-2008
vidic777



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
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;
 

Обновление прогресбара на сплэше и закрытие сплэша выполняю в обработчике события OnShow главной формы (void __fastcall TfmMain::FormShow(TObject *Sender) {} )
В RAD Studio 2007 работает.  

Цитата:
Отвечу сам себе! Все пошло, просто убрал *.h, сохранил и перекомпилил.

А можно боле подробно, интересен и Ваш вариант.  

Цитата:
Но остался вопрос
String LogFi  = WorkPath + "Log_" + (String)Date() + ".log";

Попробуйте так:
AnsiString CurrentDate = DateToStr(Date());
AnsiString LogFileName = CurrentDate.SubString(7, 4) + "-" + CurrentDate.SubString(4, 2) + "-" + CurrentDate.SubString(0, 2) + "_log.txt";
char *logfileName = LogFileName.c_str();
а потом писать в лог:
// Log
lfile.open(logfileName, ios::out | ios::app);
lfile << TimeToStr(Time()).c_str() << " --- Завершение приложения: " << Application->ExeName.c_str() << endl;
...
... код завершения
...
// Закрытие лога
lfile.close();
 
На сколько я знаю (но не сильно уверен могу и ошибаться, если что поправьте) то класс String относится к STL и возможно что в RAD Studio 2007  или переписали или изменили саму STL.  

Всего записей: 1313 | Зарегистр. 16-02-2005 | Отправлено: 08:33 21-02-2008 | Исправлено: vidic777, 08:33 21-02-2008
clear2121



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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, то сейчас его в справке нет. Смотрю далее...
 

Всего записей: 311 | Зарегистр. 07-04-2005 | Отправлено: 11:27 21-02-2008
mozgodrocha

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, а если мне нужно чтобы прога могла показывать картинки в совсем уж экзотических форматах, типа cin, dpx, exr... Как быть в такой ситуации? Сам импорт/экспорт у меня есть.

Всего записей: 193 | Зарегистр. 13-10-2006 | Отправлено: 16:03 24-02-2008
Tantos



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mozgodrocha
Либо ищи компонент, который понимает эти форматы, либо разбирай формат и отрисовывай сам. Пример работы с psd есть в журнале "Vr-Online Для программистов №6"

Всего записей: 1038 | Зарегистр. 31-05-2005 | Отправлено: 02:35 28-02-2008 | Исправлено: Tantos, 02:36 28-02-2008
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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 библиотеке. Может, еще можно нарыть плагинов ...

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 13:24 28-02-2008
HelioSS



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пОДскажите как начать работать с pARadox или Access с помощью ADO в Builder

Всего записей: 5789 | Зарегистр. 26-11-2007 | Отправлено: 13:51 28-02-2008
Tantos



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HelioSS, для начала попробовать почитать справку...

Всего записей: 1038 | Зарегистр. 31-05-2005 | Отправлено: 03:22 29-02-2008
HelioSS



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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 добавляешь и выскакивает эта же ошибка.

Всего записей: 5789 | Зарегистр. 26-11-2007 | Отправлено: 10:57 29-02-2008 | Исправлено: HelioSS, 18:27 29-02-2008
mozgodrocha

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

Всего записей: 193 | Зарегистр. 13-10-2006 | Отправлено: 14:07 29-02-2008 | Исправлено: mozgodrocha, 20:27 29-02-2008
Tantos



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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();
}
//---------------------------------------------------------------------------
 

Кусок из dfm-файла:

Код:
 
  object acMain: TADOConnection
    LoginPrompt = False
    Left = 18
    Top = 112
  end
  object adsMain: TADODataSet
    Connection = acMain
    FieldDefs = <>
    Parameters = <>
    StoreDefs = True
    Left = 67
    Top = 110
  end
 

Всего записей: 1038 | Зарегистр. 31-05-2005 | Отправлено: 04:45 03-03-2008
HelioSS



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tantos
 
Спасибо. Хорошо. Проверю кодом. Но что же я не так делаю в режиме конструктора?

Всего записей: 5789 | Зарегистр. 26-11-2007 | Отправлено: 11:41 03-03-2008
Открыть новую тему     Написать ответ в эту тему

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