С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
1

Как перенести переменную типа TStringList в другой модуль

23.01.2010, 02:03. Показов 3769. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как перенести глобальную переменную типа TStringList в другой модуль (Unit2 например), чтобы она при этом сохранила свое значение?

Применение extern, static, включение модуля #include "Unit1.h" - не помогает.
Переменная остается объявленной, а свое значение теряет, т.е. полностью опустошается при обращении к ней из другого модуля.

Переменные других типов (float, int AnsiString) вызываются нормально, т.е. сохраняют значения.
TStringList - все теряет

Спасибо!

P.S. ПО: С++ Builder 6
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2010, 02:03
Ответы с готовыми решениями:

В функцию принимающую только TStringList передать переменную типа String
Здравствуйте. В общем вопрос в названии темы. Есть функция void ReplaceMac(TStringList*...

Как скопировать строку из одного TStringList в другой
Файл считывается в List, если строка начинается на символ '/', то строку без этого символа копируем...

Как перенести переменную из одного файла в другой?
У меня есть один файл в котором я получаю последнее id, как мне эту переменную перенести в другой...

Записать исходный код страницы в переменную типа Tstringlist
Есть переменная T типа TStringList. Как в эту переменную записать исходный код страницы? Исходный...

11
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
23.01.2010, 02:41 2
Да нэ может такого быть!
Unit1.cpp:
на форме кнопка при ее нажатии:
C++
1
2
3
4
5
6
7
8
#include "Unit2.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList * ThisList = new TStringList;
        ThisList->Add("Hallo world");
        Form2->Lst=ThisList;    // Вот тут присваиваем указателю второй формы на адрес ThisList
        Form2->ShowModal();
}


Unit2.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class TForm2 : public TForm
{
 
__published:    // Von der IDE verwaltete Komponenten
    TMemo *Memo1;
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:    // Anwender-Deklarationen
public:
TStringList * Lst;
    __fastcall TForm2(TComponent* Owner);
};
Unit2.cpp на форме кнопка и Memo1. При ее нажатии:
C++
1
    Memo1->Lines->Add(Lst->Strings[0]);
При нажатии на кнопку во второй форме, данные из lst(указателя на TStringList из первой формы)
появляются в Memo1
1
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
23.01.2010, 04:10  [ТС] 3
Сергей, спасибо огромное! Так попробовал - отлично работает.
Вот только у меня нет 2-й формы. Есть одна форма и два модуля. А так не получается настроить, т.к. во 2-м модуле нет объявления класса Form2...

Подскажите пожалуйста, в идеале такой же примерчик, только с Form1, Unit1 и Unit2.

Еще раз спасибо!

Добавлено через 18 минут
Короче говоря, у меня изначально была одна форма и модуль. Здесь я работал с переменной типа TStringList. Затем, чтобы не нагромождать один юнит процедурами, я создал Unit2. Но без еще одной формы. Всеми переменные благополучно туда переехали. А вот со TStringList как-то не выходить.
Вот и ваш пример я тоже кручу. С двумя формами все отлично работает. Когда одну форму удаляешь - не выходит...
0
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
23.01.2010, 04:11 4
Конечно! Те же яйца, тока в профиль.
Во вложенном вайл проекта.
Если что не понятно - спрашивайте.
Вложения
Тип файла: zip Project2.zip (201.0 Кб, 77 просмотров)
1
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
23.01.2010, 04:21 5
Вот.. с двумя юнитами:
Вложения
Тип файла: zip Unit1.zip (199.8 Кб, 62 просмотров)
1
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
23.01.2010, 04:36  [ТС] 6
Ой, спасибо огромное, все отлично работает.
Сейчас буду пробовать все сделать по аналогии в своей программе..
Еще раз спасибо!
0
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
23.01.2010, 05:16  [ТС] 7
Вы знаете, стыдно признаться, но опять не получается так, как хотелось бы.

В последнем примере (с тремя модулями) несмотря на то, что используется Dummy класс модуля 2, текст на форму_1 все равно выводится из модуля_1. А мне нужно текст, заданный в модуле_1, вытащить в любую процедуру модуля_2 или 3 (через переменную TStringList).

Во вложенном файлике я добавил пару кнопок и две пустые процедурки: Показать тот же текст (заданый в модуле_1), только выводя его из Unita2, а также из Unita3.

Еще надеюсь на ваш спортивный интерес
Спасибо!
Вложения
Тип файла: zip V03.zip (347.4 Кб, 15 просмотров)
0
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
23.01.2010, 15:07  [ТС] 8
Вдохновленный вашим примером с двумя формами, я вчера до 4.00 утра пытался применить вашу идею с классом-пустышкой Dummy, но так желаемого и не получилось. Уже сделал так, что программа компилируется и запускается без ошибок, но когда нажимаю [Button1], выдает ошибку при вызове переменной TStringList в Unit2 из Unit1.

Видимо, класс TForm имеет какое-то уникальное свойство, которого не хватает классу Dummy...
0
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
23.01.2010, 17:22 9
Скиньте Ваш пример, пожалуйста, потому, как тот пример, что Вы послали - это тот же пример, что я Вам послал в моем втором сообщении. Видимо, вы не сохранив проект и при открытом билдере заархивировали содержимое папки Вашего проекта и выложили его.
1
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
23.01.2010, 17:52 10
Вот еще один пример.
В классе TDummy объявленны 2 ф-ции и один указатель на TStringList.
Одна ф-ция устанавливает указатель, другая возвращает его.
Указатель на класс TDummy * Dummy объявлен сейчас глобально. Память под него выделяется при создании главной формы. И сразу же используется ф-ция установки указателя на TStringList из главной формы. После этого можно использовать ф-цию получения указателя на TStringList из TDummy в любом модуле. Пример этого использования происходит при нажатии на кнопку в Form1 и Form2.

Если у Вас что-либо не будет получаться, пишите, или еще лучше, если есть скайп дайте свое скайп имя я свяжусь.
Вложения
Тип файла: zip Unit3.zip (196.0 Кб, 33 просмотров)
1
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
23.01.2010, 20:09  [ТС] 11
Вот теперь все получилось на 100%

Проблема довольно очевидна: Проэкт состоял из Form1, Unit1. По мере роста программного кода появилась потребность в создании еще одного модуля Unit2, а заодно и перетащить все используемые в Unit1 переменные, классы, массивы и т.д. Так вот проблема возникла только с указателями типа TStringList.

Из полученного результата видно, что такие переменные переносятся в другой модуль довольно таки не тривиальным способом (требуется новый класс, множество дополнительных указателей и т.д). В отличие от обычных переменных и массивов, где просто достаточно добавить ключевое слово extern.

Но, как говориться, опыт - великое дело!
В приложении я сделал то, что хотел с самого начала.
Еще раз спасибо!

--------------------------
P.S. Был бы благодарен, если бы вы черкнули пару строк своих мыслей в след. теме:
Создание базы данных (ошибка)
Вложения
Тип файла: zip V06.zip (525.5 Кб, 25 просмотров)
0
5 / 5 / 0
Регистрация: 22.01.2010
Сообщений: 48
23.01.2010, 21:59  [ТС] 12
Кстати, как временное решение, сохранил переменную типа TStringList в виде массива AnsiString, который, в свою очередь, благополучно переехал во 2-й модуль..
0
23.01.2010, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2010, 21:59
Помогаю со студенческими работами здесь

Как конвертировать переменную типа Double в переменную типа String?
Как конвертировать переменную типа Double в переменную типа String. И наоборот.

Как добавить текст в список типа TStringList
Здравствуйте. Мне необходимо добавить произвольный текст в список типа TStringList. Так как текст...

Как строковую переменную(String) сканвертировать в переменную типа(Real)
У меня есть Edit1.Text (строковая) а var x: Real каким образом мне сконвертировать Edit1.Text в...

Как передать из ACCESS переменную STRING в переменную окружения (типа CMD команды SET=)
Добрый день! Подскажите как установить переменную окружения из ACCESS. Допустим у меня есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru