| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > В чем хранить натсройки программы. |
| Автор: Хоббит 22.6.2006, 14:04 |
| Настройки храняться в файле. Как организовать класс с данными натсройками, чтобы было красивше. Сделать статический класс, который будет грузить данные из файла, туда же их сохранять при изменении. + доступ из любой точки - не люблю статические классы Или сделать не статический класс, создавать его элемент. запускать функцию типа Load которая будет грузить настройки программы и работать с ними. |
| Автор: Prehistorik 22.6.2006, 15:55 |
| Попробуй работать с AppConfig... Там уже всё сделано :-) |
| Автор: Хоббит 22.6.2006, 16:50 |
| вот те раз... пояните что такое System.Comfgi и AppConfig чем они отличаються... Мне надо хранить настройки программы типа .размеры окон .рабочая директория .настройки видимости контролов. панелей и.т.д... для удобства работы А также надо хоранить данные проектов, которые программа создает (типа файлов) то есть почти теже настройки что и для программы, только отдельные для каждого файла проекта |
| Автор: Pankon 22.6.2006, 17:01 |
| Вначале вставь app.config Проект -> Вставить -> Конфиг. файл А потом смотри System.Configuration.ConfigurationManager.AppSettings |
| Автор: mr.DUDA 22.6.2006, 22:53 | ||||
ИМХО, не катит, потому что хранить нужно информацию динамически изменяемую приложением:
В таких случаях можно либо воспользоваться средствами .NET 2.0 (вроде, специальные конфиги создаются с доп. расширением ".config.user"), либо создав типизированный датасет, сохранять и загружать из него в XML-файл в директории приложения, а уже в датасете (в виде таблиц с полями) хранить хоть какие угодно настройки. Например, добавить табличку "WindowLayouts" с ключевым полем "FormName" и полями "X", "Y", "Width", "Height", "State" и т.п. Датасет можно запихнуть в статик-класс (или синглтон, как кому больше нравится) и делать Load при первом обращении на чтение, а Save - при выходе из приложения. Тогда прочитать или записать любую настройку обязан уже класс-обёртка датасета, а приложение работает с удобным классом конфигурации. |
| Автор: Hidrag 23.6.2006, 06:31 |
| .... а почему про реестр никто не вспомнил или я чего то не понимаю? Разве там не удобно хранить настройки? |
| Автор: mr.DUDA 23.6.2006, 10:05 | ||
удобно, если только не предполагается copy deployment и наличие настроек по умолчанию |
| Автор: Pankon 23.6.2006, 12:45 |
| и другие подобние вещи (например, измененный текст в текстбоксе В дизайнере -> выбрать элемент управления -> Свойства -> Данные -> Установки приложения(ApplicationSettings) -> PropertyBinding -> Вылетает окно (Установки для элемента управления) -> Выбираешь свойство (Size, Text, Location, ...) -> В дропдавн выбираешь нью -> задаешь Name -> Ок Все Посмотреть все используемые установки Проект -> Свойства -> Установки Здесь, кстати, можно задать уровень "доступа" - Пользователь или Приложение. Студия сама пихает нужные узлы в апп.конфиг (в userSettings) и организует классы для сериализации. |
| Автор: ivashkanet 23.6.2006, 13:09 | ||
Класс, а я и не знал |
| Автор: Хоббит 23.6.2006, 13:39 |
| а изменять их как... например надо хранить адресс сервера БД |
| Автор: ivashkanet 23.6.2006, 13:44 | ||
Хоббит, тебе ж сказали:
2 Pankon, у тебя что? Студия русифицированная? |
| Автор: Pankon 23.6.2006, 13:49 |
| Нет Это я пытался переводить |
| Автор: mr.DUDA 23.6.2006, 14:09 |
| Ага, круто конечно. Только есть неудобства: если таким образом привязать размер формы к settings, то в дизайнере изменить размер не получится - при открытии формы, будут восстанавливаться настройки из settings. Другое неудобство: файл "моё_приложение.user.config" располагается в нескольких местах сразу (вот незадача), но только не в папке с приложением. Например, нажав на кнопку "Synchronize" (в окне редактирования setting-ов), получаю приаттаченный мессадж бокс. Это что же выходит, конфиг для приложения лежит в восьми директориях сразу ! З.Ы. так и не получилось привязать размер/позицию формы к сеттингам - просто ничего не сохраняется, и всё. З.Ы.(2) а то что сделано руками, будет работать как предполагалось... |
| Автор: Pankon 23.6.2006, 15:37 | ||||
Согласен.
странно, у меня он удаляет только из "одной" директории...(но об этом позже)
как я писал http://forum.vingrad.ru/index.php?showtopic=101468&view=findpost&p=771801 добираюсь до окна установок.. и выбираю свойство Location (раз уж размер, так и местоположение тоже потестим), даю имя MyLocation(Score-User), нахожу ClientSize, даю имя для "установки" MyClientSize(Score-User). Все. Запускаю... Меняю размер и местоположение.. Закрываю... Снова запускаю - Ура - Новые установки работают. Дизaйнер. Хм... Остались старые размеры... Хочу снова иметь размеры, как в дизайнере Проект -> Свойства -> Установки -> (Сверху кнопочка ) Синхринизировать(нажимаю) -> окно "Удалить один файл где-то в "C:\Do...\Lokale Einstellungen\Anwendungsdaten\...\WindowsApplication1.vshos_Url_vvqvm5ec15fnt2kctiy1x4zdx2w5ervc\1.0.0.0\user.config" Теперь компилирую.. Из каталога (у меня это) \bin\Release\ запускаю WindowsApplication1.exe. Проверяю.. Все работает А вот после запуска ехе в "C:\Do...\Lokale Einstellungen\Anwendungsdaten\...\ появился новый (что-то такое я уже сверху предпологал(см.выше)) WindowsApplication1.exe_Url_yqe2yhwgoaqgsrrlwbyhvaqxgzec1nox !!!!, где и хранится 1.0.0.0\user.config для экзешника. А если мы теперь скопируем(или перенесем) наш экзешник (конечно с WindowsApplication1.exe.config) в другое место и запустим, то .. правильно.. появится файл установок для нового местоположения "C:\Do...\Lokale Einstellungen\Anwendungsdaten\...\WindowsApplication1.exe_Url_'вероятно хеш местоположения'\версия сборки\user.config" т.е. Один узер может иметь одно приложение и настройки к нему(одни), а если такая же сборка запускается из другого каталога, то это, извините, "другое" приложение. Ну вот и все кажется. ПС. Если бы я это все знал раньше, ПС. После компиляции, решил еше раз "синхронизировать".. Пришло сообшение об удалении двух(логично) файлов (дебуг и екзе)... сейчас напишу, только "попью" .. |
| Автор: Pankon 23.6.2006, 16:43 |
1. Создаешь в проекте новую "установку" (Проект -> Свойства....) Напимер - "BaseAddr" 2. В программе - для чтения: strAddr = My.Settings.BaseAddr - для сохранения My.Settings.BaseAddr= "121.123.233.233" Все. Неприятность Работает только для виндовсприложения, для консоли - нет По крайней мере я не смог заставить консоль сохранять результаты.... Консоль вообще не создает файл настроек... |
| Автор: Хоббит 23.6.2006, 17:55 |
| Как бы не было смешно, но ничего не работает. Создаю проект. Выбираю в идзайнере форму. В свойсвах ApplicationSetings там PropertyBinding даю имя .. все появляется... запускаю меняю размеры, перезапускаю, все по прежнему... В свойствах есть ... жму на Синхронизировать no user.config file found Добавлено @ 17:56 и что за обьет My в строчке My.Settings. ... |
| Автор: mr.DUDA 23.6.2006, 17:58 | ||
Это в ихнем бейсике есть такой хитрый фич, "My namespace" называется
То же что и у меня ? |
| Автор: ivashkanet 23.6.2006, 20:10 | ||||
| На VB действительно все пашет. А на C# нет. Дальше больше. Залез я в дизайнер сеттингов и нашел охриненный метод:
Который, судя по названию, сохраняет изменения сэттингов в... а хрен знает куда он их сохраняет. Потому что даже без файла app.config приложение запоминает свое предыдущее расположение. В C# такого нет
И... нифига. Код сеттера отрабатывает, но форма своего положения не помнит P.S. Прикрепляю приложение VB которое умеет сохранять свое положение на экране. |
| Автор: mr.DUDA 23.6.2006, 22:40 |
| Короче, не продумали до конца, либо нужно где-то дёргать какой-то метод SaveSettings P.S. не могли уж в деструктор запихать это всё, я не знаю |
| Автор: Хоббит 24.6.2006, 09:00 | ||
а может в C# надо еще что то ручками дописать ..... если на класс Settings посмотреть так в нем ничего ... пару коментарирве только стоит
вот тут то кажется и надо все делать!!! Добавлено @ 09:12 Какой я умный... вот и решил проблемы... раскоментариваем обработчик SettingsChanging и в нем пишем this.Save() и все работает под C# на самом деле все просто |
| Автор: mr.DUDA 24.6.2006, 15:04 | ||
будешь сохранять в файл при каждом изменении каждой настройки ? |
| Автор: Хоббит 24.6.2006, 17:44 |
| ну на произвводительность не влияет ... а хочешь по закрытию пропиши сохранение и все |
| Автор: ivashkanet 26.6.2006, 08:04 | ||
А у меня не работало Что я делал не так |
| Автор: Хоббит 26.6.2006, 09:22 |
| не знаю ... 2 действия расокмнетарить событие (оно в коментариях) и дописать в обработчик строку this.Save() примитивный вариант ... Можно по закрытию формы. отдельно вызвать Settings.Save(); |
| Автор: ivashkanet 24.10.2006, 13:44 |
Я сегодня нашел почему В свойствах VB проекта есть зампенчательная галка, дословно: "Save My.Settings on Shutdown" Во какая суперфича Т.е. с C# проекте нужно сохранять их руками |
| Автор: Rapalex 24.10.2006, 14:00 |
| Длинный форум я так просмотрел, и не видел у вас такой ссылки, а вы посмотрите!!! http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/SettingsCS_RL.asp |
| Автор: Elfet 9.7.2007, 21:42 |
| А если я не хочу хранить настройки программы в папке там где и находится программа, а в какой-нибудь другой папке скрытой от пользователей, но всём доступной? |
| Автор: mr.DUDA 9.7.2007, 23:06 | ||
Тогда ручками сохраняй/читай файл откуда угодно в своём собственном формате. |
| Автор: Azzdorf 9.7.2007, 23:16 | ||
тут сериализация подойдет, там можна настройки как захочеш запихнуть, я например привращаю их в пару-значение, или пару - 10 значений и использую те которые нужно, притом в этом файле попрописую после каждого открытия откуда последний раз открывался файл конфигцрации и если его не перемещать то програма в начале не бедт создавать файл из стандартными настройками, если кому надо выложу исходник... |
| Автор: Elfet 10.7.2007, 09:16 |
| угу, это всё уже понятно. А вот в какую папку сохранять настройки? |
| Автор: ivashkanet 10.7.2007, 09:22 |
| C:/Windows/System32/CriticalData/VeryCriticalData/DoNotModify Elfet, да где хочешь. Можно, например, использовать C:\Documents and Settings\<UserName>\Application Data\MySuperPuperApp либо C:\Documents and Settings\All Users\Application Data\MySuperPuperApp |
| Автор: Elfet 10.7.2007, 10:07 |
| Ок! |
| Автор: ivashkanet 10.7.2007, 10:22 |
| Токи шо попробовал: Application.CommonAppDataPath == C:\Documents and Settings\All Users\Application Data\Enterprise\caTestcs\1.0.0.0 Application.LocalUserAppDataPath == C:\Documents and Settings\<UserName>\Local Settings\Application Data\Enterprise\caTestcs\1.0.0.0 Application.UserAppDataPath == C:\Documents and Settings\<UserName>\Application Data\Enterprise\caTestcs\1.0.0.0 P.S. 'Enterprise' -- хз что, скорее всего производитель. 'caTestcs' -- название проета (или что-то похожее) '1.0.0.0' -- Версия |
| Автор: Elfet 10.7.2007, 10:41 |
| ivashkanet, ок! спаибо! |
| Автор: thomas 23.7.2007, 23:16 | ||
| Приветствую всех. Несколько раз прочитал всю тему. Плюс в своем тестовом приложении кое что попробовал. В дизайнере settings создал несколько штук, значения оставил пустыми. Предполагается что их внесет пользователь при настройке приложения и далее по ходу пьесы будет менять по мере необходимости. Приложение на "барсике", т.е. использую Me.Settings . Все вроде работает. Созданный студией файл app.config остается без изменений. Настройки сохраняются в файл user.config, расположенный в моей директории. Если в дизайнере запросить синхронизацию, то этот файл удаляется. А теперь у меня "хитрый" вопрос к уважаемому сообществу. А куда будут писаться настройки(какой файл и где сохраняется) введенные пользователем программы, после её установки на другом компе? И почему не вносятся изменения в app.config? ivashkanet, А это
где пишеться? И плюс еще вопрос в догонку: а как во время run time можно записать значения в app.config? |
| Автор: ivashkanet 24.7.2007, 09:01 | ||
А это сташная тайна (во всяком случае я так и не нашел когда искал. Может кому повезет больше Нигде. Это вычисляет сам .Net. Доступ к этим путям есть из класса Application. |
| Автор: Rapalex 30.11.2007, 17:00 |
| Привет всем, только что увидел что моя ссылка не решила проблемы. Сейчас она не доступна, нашел что-то похожее http://msdn2.microsoft.com/en-us/library/aa730869(VS.80).aspx Видимо вы ее не прочитали, или не поняли, или не поняли результатов своих опытов. 1 - вы заметили что создаётся конфиг файл с названием экзешника, верно, но настройки пользователя в нем не хранятся. В нём хранятся настройки по умолчанию. И если вам необходимо какойто параметр при редистрибуции изменить, его можно изменить в файле и распространять и при этом НЕ пересобирать сборку. А если этот файл удалить то значения возьмутся непосредственно из сборки, и ничего страшного не произойдёт. 2 - как я уже сказал настройки хранятся не в нём а хранятся они в спецальных XML файла в той самой папке апп дата, для каждого пользователя свои, да ещё с учётом версий проги, да и сохраняются только измененные переметры. Т.е. никаких велосипедов изобретать не надо. |