Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
1

Как объявить переменную с областью видимости в пределах класса формы

12.10.2012, 10:15. Показов 2850. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Приложение ищет опечатки, используя свой словарь и словарь MS Word. Но у некоторых пользователей нет MS Word, поэтому сделал опцию useWord.

При начале проверки:

C#
1
2
3
4
5
6
7
8
9
10
if (useWord)
    try{
         Word.Application app = new Word.Application();
        app.Visible = false;
    }
catch(Exception ex)
{
    useWord = false;
    ItemUseWord.Checked = false;
}
далее (через 100 строчек кода) мне нужно применять созданный ранее объект "app":

C#
1
2
3
4
5
6
7
8
9
10
if (useWord)
{
    if (app.CheckSpelling(word))
    {
        NewWordsDic.Add(lo);
        continue;
    }
    BadWordsCount++;
    dataGridView1.Rows.Add(topic, word, line);
}
Но c# не видит этот объект: Элемент app не существует в текущем контексте.

Каким образом мне создать объект app (т.к. запустить Word в фоновом режиме), чтобы потом к нему можно было обращаться?

Переписывать всю функцию в двух вариантах:
if (useWord)
вся функция проверки с учетом Word
else
вся функция проверки без учета Word

как-то не хочется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2012, 10:15
Ответы с готовыми решениями:

Как обеспечить видимость класса в пределах формы и всех ее методов
Здравствуйте! Подскажите новичку :) Такая проблема: недавно взялся изучать C#. Пытаюсь написать...

Что-то с областью видимости
Приветствую! Пытаюсь распарсить локальные файлы на предмет JSON. Пишу так: if...

Может ли областью видимости структуры быть тело метода класса?
Может ли областью видимости структуры быть тело метода класса?

Объявить переменные, область видимости которых распространялась бы на все формы
Здравствуйте! Я создаю приложение в visual studio 2008, которое содержит несколько форм. И мне...

5
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
12.10.2012, 10:28 2
Suppir, вы создаете и инициализируете app в блоке try catch поэтому ваш app и не видно за его пределами, вынесети объявление куда-нибудь повыше
0
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
12.10.2012, 10:33  [ТС] 3
Непонятно, куда его повыше выносить, если приложение имеет вид:

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
namespace Название_приложения
{
    public partial class Form1 : Form
    {    
        public Form1()
        {
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            bool useWord = ItemUseWord.Checked;
            if (useWord)
                try{
                Word.Application app = new Word.Application();
                app.Visible = false;
            }
            catch(Exception ex)
            {
            useWord = false;
            ItemUseWord.Checked = false;
            }
            
            ...
            //здесь куча кода
            ...
            
            if (useWord)
            {
                if (app.CheckSpelling(word))
                {
                    NewWordsDic.Add(lo);
                    continue;
                }
                BadWordsCount++;
                dataGridView1.Rows.Add(topic, word, line);
            }
        
        }
        
    }
     
}
Добавлено через 1 минуту
Можно ли создавать объект внутри функции таким образом, чтобы он был виден глобально?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
12.10.2012, 10:42 4
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
public partial class Form1 : Form
    {    
        private Word.Application app;
        public Form1()
        {
               app = null;
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            if (useWord)
                try{
                app = new Word.Application();
                app.Visible = false;
            }
            catch(Exception ex)
            {
            useWord = false;
            ItemUseWord.Checked = false;
            }
            
            ...
            //здесь куча кода
            ...
            
            if (useWord && app != null)
            {
                if (app.CheckSpelling(word))
                {
                    NewWordsDic.Add(lo);
                    continue;
                }
                BadWordsCount++;
                dataGridView1.Rows.Add(topic, word, line);
            }
        
        }
        
    }
вот так, думаю лучше

либо так
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
private void button1_Click(object sender, EventArgs e)
        {
            Word.Application app = null;
            if (useWord)
                try{
                app = new Word.Application();
                app.Visible = false;
            }
            catch(Exception ex)
            {
            useWord = false;
            ItemUseWord.Checked = false;
            }
            
            ...
            //здесь куча кода
            ...
            
            if (useWord && app != null)
            {
                if (app.CheckSpelling(word))
                {
                    NewWordsDic.Add(lo);
                    continue;
                }
                BadWordsCount++;
                dataGridView1.Rows.Add(topic, word, line);
            }
        
        }
Добавлено через 7 минут
Цитата Сообщение от Suppir Посмотреть сообщение
Можно ли создавать объект внутри функции таким образом, чтобы он был виден глобально?
если так созададите то будет виден внутри метода и будет он локальным, а глобальным только как переменная класса.
1
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,172
12.10.2012, 10:53  [ТС] 5
Сейчас попробую, чуть позже отпишусь.

Добавлено через 7 минут
Спасибо, вот эта строчка очень помогла!

C#
1
Word.Application app = null;
Добавлено через 23 секунды
Т.е. мы тупо создали пустую переменную, заняв место "повыше".
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
12.10.2012, 10:58 6
Цитата Сообщение от Suppir Посмотреть сообщение
Т.е. мы тупо создали пустую переменную, заняв место "повыше".
почти, мы вынесли переменную из блока try catch, дав ей видимость для всего метода, плюс ко всему этому переменной присвоено значение null, на тот случай если переменная useWord станет true и в конце метода может ошибочно вызваться app.CheckSpelling(word), но судя по данному коду такого возникнуть не может, остальную часть я не знаю.
0
12.10.2012, 10:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2012, 10:58
Помогаю со студенческими работами здесь

Как и где создать процедуру с глобальной областью видимости
Здравствуйте. Я хотел спросить, можно ли создать подпрограмму(процедуру или что то на подобии), что...

За областью видимости
Привет всем, начал недавно изучать java по Шилдту, прочитал что есть такая хорошая вещь как...

Грабли с областью видимости пременных
Объясните плиз, уже второй раз наступаю app.post('/auth',function(req,res,next){ var db =...

Проблема с областью видимости объектов.
При изучении Java столкнулся со следующей проблемой: объекты (например JFrame) создаваемые в одном...


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

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