Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 25
Записей в блоге: 2
1

Запуск программы через командную строку с одним аргументом

05.07.2017, 07:17. Показов 2053. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, возникла необходимость реализовать следующее:
При запуске программы через командную строку с одним аргументом, этот аргумент проходит через Main (string[] args), где создается объект главной формы, вызывая конструктор с одним параметром, являющимся как раз этим аргументом. Этот аргумент осуществляет определенное действие на форме.

Теперь вопрос, как осуществить, чтобы при повторном запуске программы (так же через командную строку, но с другим аргументом) на той же форме выполнилось второе действие (нового аргумента) с сохранением всего, включая результат первого действия.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2017, 07:17
Ответы с готовыми решениями:

Передача значений аргументов через командную строку
К примеру, видел такие реализации как prog.exe -server 10.10.10.1 -mask 255.255.255.192 -key...

Запуск exe с аргументом
Дана программка, которая при запуске в обычном режиме (без аргумента) просто загружается сама...

Запуск программы через командную строку
Проблема в следующем! Например написана программка сложения двух чисел, после её запуска в КС и...

Цикл в цикле, зацикливание, запуск программы через командную строку
Здравствуйте. Такая схема: var strin: AnsiString; answer: string; BEGIN while not eof do...

6
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.07.2017, 12:39 2
Нужно сохранять состояние формы между запусками. Можно через настройки, но лучше не нужно, т.к. вычисления к настройкам не относятся.
Поэтому нужна модель данных. Состояние этой модели нужно читать при старте, изменять в соответствии с параметрами командной строки, передавать в форму для отображения и сохранять при выходе из приложения.
Итого:
Модель данных, которая хранит целое число.
C#
1
2
3
4
public class Model
{
    public int Sum { get; set; }
}
Обработка параметров командной строки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
static class Program
{
    private const string FileName = "model.xml";
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        var fullPath = Path.GetFullPath(FileName);
        var model = new Model();
        if (File.Exists(fullPath))
        {
            model = Deserialize<Model>(fullPath);
        }
        if (args.Length > 0)
        {
            //изменяем модель в соответствии с аргументами командной строки
            model.Sum += int.Parse(args[0]);
        }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1(model));
        Serialize(model, fullPath);
    }
 
    //Десериализация (чтение состояния модели)
    static T Deserialize<T>(string path)
    {
        var result = default(T);
        using (var stream = new StreamReader(path))
        {
            var serializer = new XmlSerializer(typeof(T));
            result = (T)serializer.Deserialize(stream);
        }
        return result;
    }
 
    //Сериализация (сохранение состояния модели)
    static void Serialize<T>(T obj, string path)
    {
        using (var stream = new StreamWriter(path))
        {
            var serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(stream, obj);
        }
    }
}
Форма:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
 
    public Form1(Model model)
        : this()
    {
        label1.Text = $"Сумма в модели: {model.Sum}";
    }
}
Вложения
Тип файла: zip WindowsFormsApp1.zip (15.7 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 25
Записей в блоге: 2
05.07.2017, 21:12  [ТС] 3
Спасибо вам большое, реализация подошла для первоначальной задачи. Однако недавно выяснилось, что все необходимо делать в одной форме, то есть открыв один раз, больше не создавать объектов Form. Можно ли как-нибудь подогнать ваш метод?
0
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
06.07.2017, 07:00 4
Цитата Сообщение от Donil Посмотреть сообщение
открыв один раз, больше не создавать объектов Form
это называется синглтон, если речь идёт о форме, т.е. объекте существующем в единственном экземпляре, пока запущено приложение.
Ежели речь идёт об одном экземпляре приложения, то это совсем другая задача.
0
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 25
Записей в блоге: 2
06.07.2017, 07:38  [ТС] 5
В данный момент речь идет все-таки об одном экземпляре приложения. То есть запусков через командную строку может быть более одного с разными аргументами, а приложение должно запуститься только один раз (при первом запуске), и аргументы должны выполнять соответствующие действия каждый раз именно в открытом приложении.
Пробовал реализовать это при помощи findWindow() и SendMessage(), но никак не выходит. Не подскажете какую-нибудь идею реализации, возможно, стоит что-то изучить для этого
0
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
06.07.2017, 09:43 6
Лучший ответ Сообщение было отмечено Donil как решение

Решение

Donil, это посложнее. Есть вариант
Вложения
Тип файла: zip SingletonApp.zip (15.1 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 25
Записей в блоге: 2
06.07.2017, 13:45  [ТС] 7
Большое спасибо вам, все получилось!
0
06.07.2017, 13:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2017, 13:45
Помогаю со студенческими работами здесь

Запуск через командную строку
Имеется код: #include &lt;stdio.h&gt; int main(int argc,char *argv) { char *rezhim;...

Запуск через командную строку
Всем доброго времени суток. Изучаю java Герберт Шилдт 4 издание. Пытаюсь запустить java файл через...

Запуск через командную строку
Всем доброго времени суток. Пытаюсь освоить запуск программы с командной строки. Что делаю не так?...

Запуск через командную строку
При запуске программы через командную строку возникает ошибка: Может быть, кто сталкивался

Запуск програмки через командную строку
Сразу говорю, что Builder'ом не дружу, и с с++ не очень, но писать надо, потому у меня несколько...

Запуск через командную строку с параметрами
Помогите плиз!!! void main(int argc, char *argv) { int k,N; clrscr(); LIST *lst; FILE...


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

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