Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как получить параметры командной строки в VC++


Автор: Курсант 5.10.2015, 15:25
Доброго времени суток!
Решил к своей программе добавить возможность вытаскивать имя файла из командной строки. Однако параметры командной строки получить из тела метода не могу. То есть я вижу, что параметры командной строки передаются приложению, и выглядит это так:
Код

int main(array<System::String ^> ^args)
{
        Form1->    // Попытка обратиться к какому-нибудь свойству объекта Form1 приводит к тому, что компилятор ругается, мол, не знаю что такое Form1...
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
    // Create the main window and run it
    Application::Run(gcnew Form1());

    return 0;
}

Однако из модуля класса Form1 я не могу получить доступ к переменной args (если я правильно понял, это переменная ссылочного типа?). 
Код

#pragma once
#include "Typedefs.h"
#include "vcclr.h"



namespace MKU_Control_Tool {

// трам-пам-пам

    public ref class Form1 : public System::Windows::Forms::Form
    {

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
             LoadParametersFromFile (args[1]); // эта строка вызывает ошибку, что и логично - переменная args определена только внутри функции main ()
         }

        };
}


А из тела функции main я не могу получить доступ к свойствам объекта Form1, чтобы туда записать или копию args, или значение некоторого элемента массива. Вопрос: как быть? Как получить параметры командной строки в методе какого-нибудь компонента окна (я так понимаю, лучше всего в методе Load компонента Form1).

Спасибо за внимание.

Автор: Курсант 8.10.2015, 09:00
Проблема решена, придумал работающий костыль (а может и не костыль). Способ решения:
1. В функции main () вызываем конструктор объекта Form1 с параметром args.
Код

int main(array<System::String ^> ^args)
{
        Form1->    // Попытка обратиться к какому-нибудь свойству объекта Form1 приводит к тому, что компилятор ругается, мол, не знаю что такое Form1...
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
    // Create the main window and run it
    Application::Run(gcnew Form1(args));
    return 0;
}


Исправляем конструктор Form1 таким образом, чтобы он принимал аргумент args и вызывал с ним функцию InitializeComponent ()
Код

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(array<System::String ^> ^args)
        {
            InitializeComponent(args);
            //
            //TODO: Add the constructor code here
            //
        }

         .....


В классе Form1 создаём поле fargs для хранения аргументов.
Код

public: array<System::String ^> ^fargs;


Функцию InitializeComponents() исправляем таким образом, чтобы она принимала аргумент args и сохраняла его в поле fargs объекта Form1.
Код

        void InitializeComponent(array<System::String ^> ^args)
        {
            this->components = (gcnew System::ComponentModel::Container());

            ........

            fargs = args;

        }


В обработчике Form1.Load проверяем размер массива fargs, и если он больше нуля, открываем файл, имя берём из первого элемента массива fargs. 
Код

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
             ...................
             if ( fargs->GetLength(0) > 0 ) { LoadDeviceFromFile ( fargs[0] ); }
         }


Т.о. если пользователь запустил программу перетаскиванием на неё файла, созданного этой программой, то программа загрузит этот файл для редактирования/работы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)