Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2009, 15:23   #1
Голованов Д.
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию Передача поля объекта в процедуру в качестве параметра

Определение класа Class1:

Код:
Public a As Double
В модуле Module1 две процедуры:

Код:
Sub Sub1(ByRef a As Double)
    a = 5
End Sub

Sub Main()
    Dim C1 As Class1
    Set C1 = New Class1
    Sub1 C1.a
    MsgBox "a = " & CStr(C1.a), vbOKOnly, "Результат"
End Sub
Вопрос: почему в результате выплнения Main получается а = 0, и как получить а = 5?

Последний раз редактировалось Голованов Д.; 01.11.2009 в 17:03. Причина: Ошибка
Голованов Д. вне форума Ответить с цитированием
Старый 01.11.2009, 17:31   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Смысла такого кода я не понял,но посмотрите варианты,может помогут
Вложения
Тип файла: rar Не понял.rar (9.0 Кб, 11 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 01.11.2009, 17:50   #3
Голованов Д.
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Спасибо за ответ, но неподойдёт. Смысл делать такой код есть, уж поверьте мне )

Попробую описать словами. Есть процедура, которая меняет значение передаваемой ей переменной. Есть объект, поле которого хотелось бы поменять с помощью этой функции. При этом делать функцию частью объекта (методом или свойством) в этом конкретном случае мне видится нелогичным.

Так что повторю вопрос: как передать поле объекта в функцию в качестве изменяемого параметра?

Последний раз редактировалось Голованов Д.; 01.11.2009 в 17:52. Причина: Афтар тупит
Голованов Д. вне форума Ответить с цитированием
Старый 01.11.2009, 19:28   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Смысл делать такой код есть, уж поверьте мне )
Смысла использовать классы нет. Уж поверьте мне

Вы всё слишком усложняете. Решение Вам уже подсказали.
Если интересует что-то другое - подробно сформулируйте задачу.
EducatedFool вне форума Ответить с цитированием
Старый 01.11.2009, 20:05   #5
Голованов Д.
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

EducatedFool

Мой предыдущий вопрос с этим связан только косвенно. Хотя думаю, попробуй я передать поле визуального объекта в процедуру - результат был бы тот же.

Про смысл. Почему вы считаете, что его нет? В действительност есть уже написанный класс (400 строк, а не одна, как в выше приведённом примере). И есть процедура вне класса, в которую мне сильно-сильно хочется отправитью на изменение одно из полей этого класса, доступное для записи. И я недоумеваю, почему отправляя его таким образом, как в примере, я не могу его изменить. Что же мне по-вашему делать?

PS: Не устаю повторять предельно конкретный вопрос: как передать поле объекта в функцию в качестве изменяемого параметра?
Голованов Д. вне форума Ответить с цитированием
Старый 01.11.2009, 20:32   #6
Голованов Д.
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Вот такое на паскале запросто проходит:

Код:
type
  TClass1 = class
  public
    a: Double;
  end;

procedure Sub1(var a: Double);
begin
  a := 5;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
  Class1: TClass1;
begin
  Class1 := TClass1.Create;
  Sub1(Class1.a);
  Form1.Label1.Caption:= FloatToStr(Class1.a); // результат - 5
end;
Голованов Д. вне форума Ответить с цитированием
Старый 02.11.2009, 04:09   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Да, такая штука не пройдет. Можно передать объекты по ссылке, но не элементы класса.
А почему бы не записать эту процедуру внутри класса?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 02.11.2009, 05:30   #8
Голованов Д.
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
А почему бы не записать эту процедуру внутри класса?
Ну... ето может чисто моя заморочка, но. В процедуре происходит проверка входных данных на корректность и некоторая их модификация. Т.е. процедура зависит от способа ввода данных. Но! Сегодня я хочу вводить их в форму, завтра - в яцейки таблицы. Сегодня в одном формате и с одними размерностями, завтра - в другом и с другими. Класс же по-моему (именно этот конкретный класс) не должен от этого зависеть. Типа, Юпитеру - юпитерово )

PS: Наверное введу доп. переменную, буду её отправлять в процедуру, потом присваивать полю объекта... Тянемся правой ного к левому уху )
Голованов Д. вне форума Ответить с цитированием
Старый 02.11.2009, 10:38   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот так будет работать:

Код:
Sub Процедура(ByRef ЭкземплярКласса As Class1)
    ЭкземплярКласса.a = 5
End Sub

Sub Main()
    Dim C1 As New Class1
    Процедура C1
    MsgBox "a = " & C1.a, , "Результат"
End Sub
Можно сделать и так:

Код:
Function Функция(a As Double) As Double
    Функция = a * 5
End Function

Sub Main()
    Dim C1 As New Class1
    C1.a = 1
    C1.a = Функция(C1.a)
    MsgBox "a = " & C1.a, , "Результат"
End Sub

Последний раз редактировалось EducatedFool; 02.11.2009 в 10:42.
EducatedFool вне форума Ответить с цитированием
Старый 02.11.2009, 16:12   #10
Голованов Д.
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

EducatedFool, спасибо за ответы.

Первый вариан не подходит, ибо с помощью функции заполняются разные поля:

Код:
Процедура C1.а1
Процедура C1.а2
...
Второй вариант можно использовать, но я настаивал на отправке именно в качестве параметра потому, что хотел использовать результат функции как индикатор её успешного выполнения, а-ля:

Код:
Function  Функция(a As Double) As Boolean
    If изменение a успешно then
        Функция = True
    Else
        Функция = False
    End If
End Function


If Функция(C1.a) then
    ...
PS: подскажите ещё, как получить минимлаьно возможное число типа Double?
Голованов Д. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TextBox в качестве параметра функции/процедуры Голованов Д. Microsoft Office Excel 6 01.12.2009 10:38
Массив в качестве параметра DeKot Общие вопросы Delphi 6 15.10.2009 22:32
Пользовательская функция с диапазоном в качестве параметра SanSanblch Microsoft Office Excel 2 29.05.2009 17:37
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
Передача метода класса в качестве параметра в другой метод Dmytry87 Общие вопросы C/C++ 0 12.11.2008 15:28