Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить параметры командной строки в VC++ 
V
    Опции темы
Курсант
Дата 5.10.2015, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



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

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).

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

Это сообщение отредактировал(а) Курсант - 6.10.2015, 13:23
PM ICQ Skype   Вверх
Курсант
Дата 8.10.2015, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Проблема решена, придумал работающий костыль (а может и не костыль). Способ решения:
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] ); }
         }


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

Это сообщение отредактировал(а) Курсант - 8.10.2015, 09:03
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1253 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.