0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
||||||
1 | ||||||
Редактирование файла с использованием checkbox07.02.2017, 20:02. Показов 1019. Ответов 15
Метки нет (Все метки)
Доброго времени суток.
Подскажите пожалуйста как подойти к решению такой задачи: Есть три сущности: - Программа "А" - Приложение "В" - Файл питоновский "test.py" 1) test.py является по сути перечнем настроек, которые программа "А" из него считывает при запуске. Настроек много и они разбиты на 10 отдела (для визуального удобства), в каждом из которых около 10 -20 настроек. 2) Программ "А" несколько и все они лежат в разных папках, со своими test.py. 3) Приложение "В" одно, содержит в себе TabControl, вкладки которого являются теми самыми файлами test.py. В каждом таком TabControl есть еще один TabControl с 10 вкладками, которые являются отделами настроек test.py. И в каждом этом отделе уже чекбоксы, которые отвечают за вкл/выкл определённой настройки в этом файле. Снизу кнопка "Принять", перезаписывающая test.py в зависимости от выставленных чекбоксами настройками. Перезапись нужно сделать именно поиском нужно строки и перезаписью её значения, потому как в файл периодически добавляется новый функционал и нужна быстрая поддержка. *Создание формы с путями ко всем файлам есть. Не хватает именно понимания как отредактировать файл с помощью чекбоксов. Настройки в файле выглядят примерно так:
У меня есть какие-то части данного функционала, но я уже сейчас понимаю, что эту задачу нужно решать изначально как единый механизм, до которого я не могу дойти из-за своего малого опыта. Поэтому не имеет смысла выкладывать что есть, потому как этим запросто можно пренебречь, если будет единое решение. Был бы очень благодарен за любую помощь в решении.
0
|
07.02.2017, 20:02 | |
Ответы с готовыми решениями:
15
Создание и редактирование cmd-файла с использованием bat-файла CheckBox и редактирование в бд CheckBox редактирование файлов в бд Вывод, редактирование и удаление полей из таблицы в checkbox |
Администратор
|
|
07.02.2017, 20:54 | 2 |
Insearchman, имена параметров уникальны в рамках одного файла? Вкладки с названиями отделов фиксированы или должны создаваться на лету исходя из наличия отделов в .py файле? Если нужно создание на лету, то каким образом делить параметры на отделы? Чекбоксы во вкладках фиксированы или должны создаваться на лету исходя их содержимого файла? Могут ли в файле встречаться закоментированные настройки и что должна делать программа с ними?
1
|
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
|
|||||||||||
07.02.2017, 21:04 | 3 | ||||||||||
Читаются параметры с их значениями примерно так:
Проверяем чекбокс, ищем в файле нужный параметр и заменяем.
Ну это как предложения. Возможно, найдутся и более удобные решения.
1
|
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
|
07.02.2017, 21:08 [ТС] | 4 |
В рамках одного файла имена уникальные, да. Вкладки с названиями отделов созданы как и чекбоксы фиксированные. На лету конечно было бы хорошо сделать, но на самом деле нет уверенности что данный файл в последствии не будет радикально реарганизован. Поэтому всё сделал фиксированным с прописанными именами. Закоментированные настройки трогать не нужно, как и отображать. Вначале хотя бы вручную всё сделать.
0
|
Администратор
|
||||||
08.02.2017, 19:48 | 5 | |||||
Insearchman, тогда я предлагаю следующую систему:
1) для закладок первого tabControl в Tag записываем полный путь к файлу (через дизайнер или в конструкторе формы) 2) для каждого checkbox в Tag записываем название настройки. Вместо этого можно указать название настройки в имени элемента управления. Чтобы не было конфликта между одноименными настройки в разных файлах, то можно взять следующую схему именования - cb_имяФайла_имяНастройки. 3) В событии Load делаем цикл по всем закладкам первого tabControl. На каждой итерации читаем файл (имя его хранится в Tag у TabPage). Читаем файл целиком в память (File.ReadAllLines). Далее получаем список всех checkbox (см. AllControlsOfType() ниже) и заносим в Dictionary<string,CheckBox> где ключом является имя настройки. Пробегаемся по всем строкам файла, получаем имя параметра и значение параметра (проще с помощью регулярок), если параметр закоментирован (начинается с #), то скрываем соответствущий checkbox. Иначе ставим иди убираем его отметку исходя из значения (True или False) параметра. 4) Всем кнопкам "принять" назначаем одинаковый обработчик события click. В этом обработчике мы получаем tabPage в котором находится эта кнопка (чтобы получить имя файла). Далее читаем весь файл в память, получаем все видимые checkbox-ы из таба и делаем Replace значения с помощью регулярного выражения (имя параметра получаем из Tag или имени чекбокса). В конце сохраняем файл. Как-то так ... Добавлено через 21 час 33 минуты Забыл привести код функции AllControlsOfType и FindParent которые могут оказаться полезными для решения задачи Кликните здесь для просмотра всего текста
1
|
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
|
08.02.2017, 21:33 [ТС] | 6 |
Большое спасибо за ответы! Очень помогли понять что делать дальше.
На основании ваших ответов я смог составить следующий набор функций, необходимых для реализации моей задачи: 1) Написать функцию "GetFunction()", создающую массив "_functions[name]" из считанных имён всех чекбоксов* 2) Написать функцию "GetStatus()", создающую двумерный массив "_status[name, status]" из названий функций (путём поиска строк из массива "_functions[name]" в файле test.py) и текущего её значения. А также, выставлением чекбоксов на основании полученных значений статуса каждой функции. 3) Написать метод в каждом чекбоксе, изменяющий значение статуса каждой функции в массиве "_status[name, status]" в зависимости от вкл./выкл. соответствующего чекбокса. 4) Написать функцию "SetStatus()", заменяющую текущее значение статусов функций в файле, значением из массива "_status[name, status]" Буду благодарен если вы меня поправите в плане задач, а так же подскажете как это сделать. Времени на программирование у меня час-полтора после работы, поэтому любая помощь была бы крайне кстати) *Имена чекбоксов совпадают с именами функций. При таком подходе если и появится какая-нибудь новая функция, мне достаточно будет добавить чекбокс с её именем.
0
|
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
|
21.02.2017, 21:13 [ТС] | 7 |
Спасибо, очень помогли!
А как удалить комменты вместе со знаком #, которые идут в первой строке массива после него?
0
|
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
||||||
01.03.2017, 13:26 [ТС] | 9 | |||||
Спасибо, очень помогло. Правда теперь другая проблема, я не совсем понимаю как работать со строкой. Мне нужно заменить путь в строке вида:
разбивая на части от ковычек, заменяя, а потом склеивая строчку. Подскажите правильно ли я иду или есть способ проще?
0
|
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
|
||||||
01.03.2017, 13:53 | 11 | |||||
Конкретно по Вашему примеру получится массив из трех элементов. Вам нужен второй, а точнее str[1].
1
|
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
|
01.03.2017, 18:04 [ТС] | 12 |
Спасибо за уточнение. И еще тогда вопрос - можно ли в массиве, созданного из строк прочитанного файла, вставить новую строку (элемент массива) в середине оного?
0
|
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
|
||||||
01.03.2017, 20:02 | 13 | |||||
Массив имеет фиксированную длину, поэтому напрямую вставить элемент в массив строк не получится. Можно извращаться по-разному, например, создать еще один массив на 1 символ длиннее, скопировать в него элементы ДО вставляемого элемента, потом сам элемент, а за ним оставшуюся часть массива. Но как по мне, так это полнейший изврат. Лично я использовала бы List, это очень удобная штука, имеет массу разных функций для манипулирования элементами. https://msdn.microsoft.com/ru-... .110).aspx
Пример:
1
|
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 25
|
|
02.03.2017, 11:59 [ТС] | 14 |
Да, полностью согласен, но у меня с листом как-то с самого начала не заладилось. Видимо в силу моего малого опыта.
А именно, File.ReadAllLines не работает с листом, также при преобразовании массива в лист пишет о что инициализатор поля не может обращаться к не статичному (а мне нужно его изменять и потом записывать обратно в файл). Это можно как-то решить? Подскажите пожалуйста, а как убрать знак \ из строки? Если писать его в "" - происходит какая-то отмена следующего знака (даже в этой форме форума я не могу его написать) или что-то вроде того. Мне это нужно в проверке что если в строке первый знак \ тогда его нужно удалить.
0
|
Администратор
|
|||||||||||
02.03.2017, 12:32 | 15 | ||||||||||
Массив можно превратить в список
1
|
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
|
||||||
02.03.2017, 12:41 | 16 | |||||
1
|
02.03.2017, 12:41 | |
02.03.2017, 12:41 | |
Помогаю со студенческими работами здесь
16
Поиск с использованием Checkbox Поиск с использованием checkbox Задачка с использованием CheckBox Папка с использованием CheckBox Автофильтр в эксель с использованием checkbox Фильтрация с использованием ComboBox и CheckBox. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |