|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
|
Builder 6 Файл: Как загрузить в динамически создаваемый массив булевых значений информацию из текстового файла?25.09.2019, 17:39. Показов 3828. Ответов 34
Метки нет (Все метки)
Уважаемые форумчане!
Кто знает, как загрузить в динамически (при запуске программы) создаваемый массив булевых значений информацию из текстового файла? Есть massive.txt, в котором прописаны через пробел значения: 0 0 1 0 0 1 0 1 и т. д. Соответственно, там, где 0 - должно в массиве быть значение false (или тот же ноль), где 1 - значение true (или единица) Как это реализовать при загрузке формы в событии OnCreate ? Или, может, лучше для этой цели использовать какой-либо иной формат, как .ini или .xml ? Буду рад любым дельным подсказкам. Спасибо. С уважением, QuantumSH.
0
|
|
| 25.09.2019, 17:39 | |
|
Ответы с готовыми решениями:
34
Загрузить информацию из текстового файла в StringGrid Запись в динамически создаваемый файл |
|
Модератор
|
|||||
| 28.09.2019, 13:47 | |||||
|
Не по теме: Лично мне просто не нравятся методы чистого C++ для работы с файлами...
0
|
|||||
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
||||||||||||
| 28.09.2019, 14:16 [ТС] | ||||||||||||
|
Изменить значение вектора простым присваиванием не получается, вероятно, нужны какие-то его, вектора, методы. Вот как программа создает стикеры с отсутствующими индексами (те, которые были созданы и сохранены ранее, автоматически загрузились - соответственно тому коду, который прочитал значения из масива massiv.txt):
Но вот когда какой-то стикер закрывается, то бишь уничтожается, в обработчике формы стикера (это другая форма - поэтому массив или вектор объявляется глобальным!) OnClose также значения по соответствующему индексу должно быть приведено в ноль, чтобы этот индекс был свободным для повторного создания стикера. Получить индекс конкретного стикера несложно; но передача его обратно по
0
|
||||||||||||
|
Модератор
|
||||
| 28.09.2019, 20:32 | ||||
|
2. Есть подозрение, что просто Вы что-то с областью видимости запутались... Я же Вам уже говорил - уносите объявление вектора в отдельный модуль и прицепляйте этот модуль в модуле класса новой Вашей формы... Совсем ни к чему, чтобы дочерняя форма что-либо "знала" о родительской, а уж оперировать ее глобальными переменными - это совсем уже не по феншую... Принцип инкапсуляции пока никто не отменял...
0
|
||||
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
||
| 28.09.2019, 20:47 [ТС] | ||
|
Хотя, разве простое подключение h-файла основной формы к модулю дочерней с помощью #include не должно разрешить видеть объявленный в h-файле вектор? Добавлено через 8 минут Кстати, у меня в проекте билдера все h-файлы (от трех форм) почему-то подключены друг ко другу в файлах реализации - .cpp ... Это правильно? Не должны ли они быть подключаемы друг ко другу взаимно в h-файлах? Или я чего-то не понимаю?..
0
|
||
|
Модератор
|
||
| 28.09.2019, 22:44 | ||
|
Еще раз повторюсь: дочерние формы надо подключать к главной, для того, чтобы создать и Show() сделать... Но использовать свойства и методы дочерних форм в главной - это уже не кошерно... Но вот главную форму к дочерним подключать не надо ни в коем случае!!! Не должны они знать о ее существовании... Нет ее для них - и точка! Повторите основные принципы ООП!
0
|
||
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
|||
| 29.09.2019, 02:31 [ТС] | |||
|
Дочерняя форма - это просто заготовка стикеров, которые создаются лишь по желанию пользователя из главной формы. Они нумерованы от 1 до 10 - чтобы программа "помнила", какие были созданы, и при повторном запуске создавала те же что были созданы при закрытии программы в прошлый раз (т.е. в прошлом сеансе работы программы). Но стикер можно просто закрыть - тогда он удаляется и память освобождается. При закрытии стикера закрывается знамо дело дочерняя форма, в ее обработчике счетчику (в нрашем случае определенному значению в векторе) присваивается НОЛЬ. Но этот вектор объявлен в модуле ГЛАВНОЙ формы, а не дочерней, при этом доченяя должна с ним работать - как минимум чтобы изменить одно из значенирй при закрытии!! и если не подключать главную форму к дочерней (т.е. хидер к хидеру), то как дочерняя "узнает" о существовании вектора, который объявлен в хидере главной формы? Как я понимаю, Вы предлагаете создать вообще отдельный третий модуль, и туда прописать вектор (и все остальное что должно быть глобальным). В таком случае этот модуль к чему подключать - к модулю главной, дочерней, или к обеим??? А то я че-то уже запутался... ((( Добавлено через 3 часа 37 минут
0
|
|||
|
Модератор
|
||
| 29.09.2019, 09:09 | ||
|
Не по теме: Вы - начальник и Вы находитесь в кабинете со своим подчиненным. Оба Вы пьете кофе... Где хранить кофейные принадлежности? Можно в тумбочке подчиненного, но не всегда удобно, а иногда и просто невозможно отвлекать подчиненного, чтобы попасть в его тумбочку... Можно в Вашей, но это уж будет вообще прямое нарушение субординации, чтобы подчиненный лазил в тумбочке начальника. Логичнее всего поставить отдельную тумбочку, куда и у Вас и у подчиненного будет доступ независимо друг от друга... Аналогия, я думаю, понятна...
0
|
||
|
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
|
||
| 30.09.2019, 22:04 | ||
![]() я даю только дельную подсказку. точно так же можно и новые значения сохранить.
0
|
||
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
|||||||||||||||||
| 02.10.2019, 00:45 [ТС] | |||||||||||||||||
|
Ведь написал же D1973 обратный алгоритм без вникания в остальной код - и все прекрасно работает. Добавлено через 3 часа 33 минуты Для заинтересованных - вот еще раз общая логика работы программы. Программа-органайзер имеет дополнительную функцию - создает стикеры для размещения их на десктопе. Можно создать от 1 до 10 стикеров (число взято для примера и чисто произвольное). 1. При загрузке программа читает из текстового файла массив чисел от 0 до 10 (всего - 11 цифр), где нуль пропускается (для простоты счета), и загружает массив булевыми значениями - нулями или единицами. Скажем, текстовый файл в котором есть запись 0 0 0 1 0 1 0 1 0 0 0 - преобразуется в массив (или, по подсказке уважаемого D1973, вектор), где BStick[3], BStick[5] и BStick[7] будут соответсвенно инициализированы единицами, остальные числа - нулями. При создании главной формі программі в обработчике OnCreate срабатывает код
2. Дальше, можно в процессе сеанса работы с программой создать и другие стикеры - причем программа по отдельному обработчику нажатия на кнопу "Создать стикер" проверят вектор BStick на наличие в нем нулей, и создает стикеры с индексами, которым соответствуют нули, при этом меняя их значения на единицу:
======================================== ====== Теперь то, что не работает. В процессе сеанса работы могут быть созданы новые стикеры, а могут быть некоторые удалены. К примеру, мы загрузили программу со стикерами "Стикер 3", "Стикер 5" и "Стикер 7" (как в прмере выше), удалили "Стикер 3", но при этом создали "Стикер 1" и "Стикер 1". И закрыли программу. Теперь 3. При удалении стикера закрывается ДОЧЕРНЯЯ форма (форма-шаблон, на основании которого и создаются стикеры, изначально встроенные в главную форму с помощью Drag&Dock). Итак в обработчике событие OnClose стикера (доченей формы) вектор BStick должен на месте индекса стикера (который он читает по свойству Caption из самой формы - напр., "Стикер 5"! поставить НУЛЬ, т.е. освободить индекс для создания опять когда-нибудь стикера с таким же индексом). Но когда я обработчике событий OnClose дочерней формы я передаю ГЛОБАЛЬНОМУ (объявленному в отдельном файле, как советовали) вектору BStick значение НУЛЬ - обычным присваиванием -
программа вылетает с ошибкой "Access violation at address (какой-то адресс). Address of write 00000000" ... Почему? и как это исправить? 4. Наконец, программа должна "запомнить", какие стикеры в ней созданы теперь - то есть уже не 3, 5 и 7, а 1, 2, 5 и 7). Соответсвенно в обработчике событий OnClose главного окна индексы стикеров должны быт записаны обратно из вектора - в файл, и он должен быть ПЕРЕзаписан к следующему виду: 0 1 1 0 0 1 0 1 0 0 0. Как это реализовать? Вышенаведенный lifeforce код не ПЕРЕзаписывает файл, а ДОписывает цифры к его содержимому.
0
|
|||||||||||||||||
|
Модератор
|
||
| 02.10.2019, 07:36 | ||
![]() Если Вы реализовываете что-то аналогичное, то, как по мне, одного индекса пусто/не пусто недостаточно... Тут идеально подойдет INI-файл, где каждая секция - описание отдельной формы-стикера: ее размер, положение, текст на стикере, цвет стикера... Тогда алгоритм будет примерно таким: 1. При старте программы ищем наш INI-файл. Если его нет - никаких стикеров изначально не создаем, делаем список свободных индексов, куда вносим все значения от 1 до 10. 2. При создании нового стикера ему присваивается первый свободный индекс от 1 до 10... Этот индекс будет именем секции ини-файла, описывающей данный стикер. Создали форму - записали новую секцию - добавили индекс в список занятых - удалили его из списка свободных; закрыли форму - удалили секцию - индекс вернули в список свободных, из списка занятых его удалили... 3. Если при старте приложения ини-файл присутствует - читаем из него список секций - получаем список занятых индексов, составляем список отсутствующих индексов. При создании нового - присваиваем первый свободный индекс, при удалении - удаляем из списка занятых и добавляем обратно в список свободных... Ну это так, просто черновик, так сказать - информация к размышлению...
0
|
||
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
|||||
| 02.10.2019, 09:13 [ТС] | |||||
|
Но все же - если реализовать через ini, то все равно без массива не обойтись. Или мне так кажется.
0
|
|||||
|
Модератор
|
|||
| 02.10.2019, 10:35 | |||
Сообщение было отмечено QuantumSH как решение
Решение
1
|
|||
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
|
| 02.10.2019, 12:55 [ТС] | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 10.08.2019
Сообщений: 21
|
|
| 21.10.2019, 17:46 [ТС] | |
|
Все реализовано с помощью ini-файла. Всем спасибо за дельные советы!!! Тему можно закрыть.
0
|
|
|
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
|
|
| 21.10.2019, 22:07 | |
|
QuantumSH,
тема будет закрыта автоматически - когда поставишь правильный ответ тому кто реально решил твой вопрос темы.
0
|
|
| 21.10.2019, 22:07 | |
|
Помогаю со студенческими работами здесь
35
Как считать информацию из текстового файла и записать в динамический массив? Динамически создаваемый массив Combobox Динамически создаваемый массив в свойствах класса
Из текстового файла переписать информацию в другой текстовый файл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|