Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка в AnsiString?  (Прочитано 16001 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Laus
Гость
« : 18-07-2005 10:09 » 

AnsiString: проблемы со сложением строк.
Код программы (инициализация формы):

AnsiString path;
path = ExtractFilePath(Application->ExeName) + options.lenguage;

Переменные Application->ExeName и options.lenguage типа AnsiString.
На момент выполнения переменные имеют следующие значения:

Application->ExeName: { "C:\\Program Files\\Borland\\CBuilder6\\Projects\\Домашние разработки\\ToDoList\\ToDoList.exe" }
options.lenguage: { "Languages\\russian.ini" }

После выполнения данного участка кода в переменной path оказывается следующие значение:
path: { "C:\\Program Files\\Borland\\CBuilder6\\Projects\\Домашние разработки\\ToDoList\\" }

Естественно, что на следующем же операторе программа лажается, что делать?  Быть такого не может

lang.loadFromFile(path,"DB");
Label1->Caption   = lang.getValue(dbName);

Самое странное, что в главной форме (при инициализации) стоит идентичный участок кода и не возникает никаких проблем. Молчу
Записан
zubr
Гость
« Ответ #1 : 18-07-2005 16:43 » 

Попробуйте вместо Application->ExeName поставить ParamStr(0)
Записан
Laus
Гость
« Ответ #2 : 20-07-2005 10:17 » 

Попробовал, результат тот же.
Ещё заметил, что при просмотре выражения "ExtractFilePath(ParamStr(0)) + options.lenguage" в Watch List'е результат конкатенации показывается правильный, но на деле всё остаётся по-прежнему.

Кстати, среда разработки C++Builder 6.0.
« Последнее редактирование: 20-12-2007 20:41 от Алексей1153++ » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 20-07-2005 10:37 » 

options.lenguage точно AnsiString?
Записан

Удачного всем кодинга! -=x[PooH]x=-
Laus
Гость
« Ответ #4 : 20-07-2005 15:04 » 

Это класс в котором я собирался хранить опции программы:

Файл header.h:

#define EXTENSION ".ini"

//  ...

class Options   
{
    public:
    AnsiString lenguage;
    Options()
    {
        lenguage = AnsiString("Languages\\russian") + EXTENSION;
    }
};

extern Options options;

Файл New.cpp:

Options options;

Language lang;
AnsiString path;
path = ExtractFilePath(Application->ExeName)+ options.lenguage;

lang.loadFromFile(path,"DB");
Data->ADOTAllName      ->DisplayLabel   = lang.getValue(dbName);

// ...

options.lenguage точно AnsiString?

Из приведённого куска код видно, что options.lenguage имеет тип AnsiiString и после инициализации в ней просто обязано появиться значение "Languages\\russian.ini"
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #5 : 21-07-2005 05:59 » 

попробуй, ради эксперимента перед "path = ExtractFi...." поставь:  options.lenguage = String("test"), а после ShowMessage(path)
Записан

Удачного всем кодинга! -=x[PooH]x=-
Laus
Гость
« Ответ #6 : 21-07-2005 11:54 » 

Жуть какя-то получилась:
1. Если написать так:

Language lang;
AnsiString path;
options.lenguage = "Languages\\russian.ini";
path = ExtractFilePath(Application->ExeName)+ options.lenguage;

Ошибок не возникает.

2. Если написать так:

Language lang;
AnsiString path;
Application->MessageBoxA(options.lenguage.c_str(),"",MB_OK);
path = ExtractFilePath(Application->ExeName)+ options.lenguage;

MessageBox - пуст.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #7 : 21-07-2005 14:00 » 

бред, конечно...
особенно меня смущает значение в инспекторе перед вызовом Жаль
ведь мессадж бокс "пусто" показывает.

а если написать так:
Код:
Options options;
Options options2;
Options *p_options = new Options();

options2.lenguage=String("TEST");

AnsiString path = ExtractFilePath(Application->ExeName)+ options.lenguage;
AnsiString path = ExtractFilePath(Application->ExeName)+ options2.lenguage;
AnsiString path3 = ExtractFilePath(Application->ExeName)+ p_options->lenguage;
ShowMessage(path);
ShowMessage(path2);
ShowMessage(path3);
какие сообщения получаться?
« Последнее редактирование: 21-07-2005 14:05 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Laus
Гость
« Ответ #8 : 23-07-2005 12:11 » 

Когда объявление переменной или её инициализация находятся в том же файле, что и их использование - проблем не возникает.
Сложность в том, что экземпляр класса Options объявляется и инициализируется в файле "header.h", а используется в "Main.cpp" и "New.cpp".
Во всех трёх случаях результат получается корректный (проверил).

Если не вдаваться в подробности, то структура программы выглядит следующим образом:

header.h : Объявление и инициализация переменной options.
main.cpp: Подключает файлы  header.h и New.h
New.cpp: Подключает файлы  header.h.

Когда в файле New.cpp  я объявлял переменную Options options, я хотел, чтобы она занимала одно место в памяти, что и одноимённая переменная объявленная (как extern) в header.h.
Такое же объявление присутствовало и в файле main.cpp. Именно это я подразумевал, когда писал, что
Цитата
Самое странное, что в главной форме (при инициализации) стоит идентичный участок кода и не возникает никаких проблем.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #9 : 23-07-2005 15:45 » 

extern переменная должна инициализироваться 1 раз в программе, видимо, траблы из-за этого
Записан

Удачного всем кодинга! -=x[PooH]x=-
Laus
Гость
« Ответ #10 : 24-07-2005 07:57 » new

Спасибо всем, кто принимал участие в обсуждении, случилось.

Итоговая структура:

Файл "Main.cpp":
Options *options = new Options(); // объявление внешней переменной и инициализация.
// Использование объекта options.

Файл "New.cpp":
extern Options *options; // Получение доступа к внешнему объекту. (без инициализации)
// Использование объекта options.

Примечание:
Файл Main.cpp не должен включать в себя файл New.cpp и наоборот.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines