Вызов процедуры из модуля другой формы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Вызов процедуры из модуля другой формы

Сообщение Source » 11.11.2007 (Вс) 6:40

Как из модуля одной формы вызвать процедуру модуля другой формы, не делая процедуру Public и не перемещая её в общий модуль?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.11.2007 (Вс) 6:44

Сделать в том же модуле Public-процедуру, которая бы вызывала нужную.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.11.2007 (Вс) 7:15

не понял

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.11.2007 (Вс) 7:49

можно обработчик таймера сменить с Private на Public?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.11.2007 (Вс) 7:56

кажись, разобрался: в Form2 объявляем общую процедуру MyPublic, в Form1 пишем Form2.MyPublic.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.11.2007 (Вс) 9:45

Source писал(а):можно обработчик таймера сменить с Private на Public?

Можно.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.11.2007 (Вс) 17:19

и не будет никаких неприятных последствий? А почему, когда общая процедура объявлена в модуле формы для её вызова надо использовать имя формы, а если в общем модуле - только имя процедуры?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.11.2007 (Вс) 20:29

Последствий не будет.

У формы может быть несколько экземпляров, поэтому нужно указывать, метод какого экземпляра вызывается.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.11.2007 (Вс) 21:16

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

Выходит всё-таки, что не все понимают...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.11.2007 (Вс) 22:16

tyomitch писал(а):У формы может быть несколько экземпляров, поэтому нужно указывать, метод какого экземпляра вызывается.
Имеется ввиду массив форм?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 12.11.2007 (Пн) 3:09

а, понял, что за экземпляры - собственно и есть формы под разным именем. Но модули тоже имеют свои имена, но мы же не пишем NameModule.NameProc!

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 12.11.2007 (Пн) 3:16

Как это не пишем :shock:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.11.2007 (Пн) 6:57

Source

Код: Выделить всё
Private Type MyType
    x As Long
    z As String
    u As Boolean
End Type

Sub Main()

    Dim foo As MyType
    Dim bar As MyType
   
   
    foo.x = 123
    bar.z = 612
End Sub


Надеюсь, не возникается вопроса, зачем перед .x = 123 и z.=612 написанно foo и bar?

А теперь, как это на самом деле в VB:

Код: Выделить всё
Private Type MyType
    x As Long
    z As String
    u As Boolean
End Type

Sub Main()
    Dim MyType As MyType
       
    MyType.x = 4215454
    Module1.Zulu
   
End Sub

Sub Zulu()
    MsgBox "ffoooooooooasdasdasd"
End Sub


Почему перед .Zulu можно не писать Module1, а перед .x = 4215454 писать обязательно?

Хотя VB поступает грязно и подло.

Строчку(и)

Dim Form1 As New Form1
Dim FormX As New FormX

Dim frmXXXXx as new frmXXXXXXXXX

от от нас скрывает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.11.2007 (Пн) 16:50

Source писал(а):а, понял, что за экземпляры - собственно и есть формы под разным именем. Но модули тоже имеют свои имена, но мы же не пишем NameModule.NameProc!

Ты не можешь создать экземпляр модуля. Они всегда в единственном экземпляре.
Для форм, напротив, можно создавать дополнительные экземпляры.
Изображение

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 12.11.2007 (Пн) 17:12

Source, вот пример:
Код: Выделить всё

Dim colForms    As New Collection

Sub Main()
Dim newForm1 As Form1

    'Создаем 9 экземпляров формы Form1
    For i = 1 To 9
        Set newForm1 = New Form1
        newForm1.Show
        colForms.Add newForm1
    Next i
   
    'Допустим, в форме Form1 есть процедура Sub01
    'Если вызвать просто Sub01 то VB не поймет
    'в каком экземпляре формы вызывается Sub01 =>
    'надо указать конкретную форму
   
    colForms(1).Sub01

End Sub
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 12.11.2007 (Пн) 20:29

'Допустим, в форме Form1 есть процедура Sub01
'Если вызвать просто Sub01 то VB не поймет
'в каком экземпляре формы вызывается Sub01 =>
'надо указать конкретную форму

Почему не поймёт, она же Public, т.е. она должна быть одна для всех модулей проекта! Но это почему-то не так. Т.е. Public в модуле формы не тот Public, что в общем модуле. И зачем тогда нужен Public, если для вызова процедуры необходимо указывать имя формы?

Хакер, вот ты интересный, зачем ты проводишь аналогию общей процедуры с переменными? Переменные занимают в памяти разное место и потому могут содержать разные значения. Потому к ним надо обращаться точно. А общая процедура одна, её код неизменен. Так почему я не могу к ней обратиться из любого места проги без указания имени модуля? Просто Public для процедуры формы не тот, что Public в общем модуле. Я предполагаю, что это м.б. связано с параллельным выполнением кода (потоки и др.), который я ещё не программил, поэтому для каждой формы, не принадлежащей одной коллекции, создаётся свой экземпляр общей процедуры, которая является единственной для форм, принадлежащих одной коллекции. Наверное так... Ну а как тогда работает код, описанный как Private для нескольких экземпляров форм с одной коллекции?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.11.2007 (Пн) 20:58

Почему не поймёт, она же Public, т.е. она должна быть одна для всех модулей проекта!


Полнейший бред. Public-процедура и Public-член класса это разные вещи.

Т.е. Public в модуле формы не тот Public, что в общем модуле.

Public в модуле тот же, что и в классе. Public означает, что не Private. Private означает, что вызвать можно только в контексте модуля.

Хакер, вот ты интересный, зачем ты проводишь аналогию общей процедуры с переменными?

Чтобы ты понял.
Потому что очевидно, что ты ничерта не понимаешь, что такое класс.


А общая процедура одна, её код неизменен.

А каждого экземпляра класса есть своя собственная Public-процедура. (Вообще нет - процедура лишь одна. Но ей передаются разные указатели на объект. Именно для этого надо указывать то, что в по твоему, указывать не надо)

Так почему я не могу к ней обратиться из любого места проги без указания имени модуля?

ОК.
Тяжёлый случай, конечно, но попробую объяснить.

Dim BlueForm As New Form1
Dim RedForm As New Form1

BlueForm1.BackColor = vbBlue
RedForm1.BackColor = vbRed

Hide

ВНИМАНИЕ ВОПРОС: Какое из окон (красное или синее, или же которое Form1 As New Form1) должно закрыться?

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

Какой же всё-таки бред. Ничего из написанного даже близко не походит на правду.

Ну а как тогда работает код, описанный как Private для нескольких экземпляров форм с одной коллекции?

Какой ещё коллекцией? Откуда они появились в обсуждении?
Вложения
1.rar
Пример для понимания.
(1.36 Кб) Скачиваний: 54
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 12.11.2007 (Пн) 21:16

Source, просто форма - это шаблон, макет (называй как хочешь) будущего окна. Используя одну форму ты можешь создать много окон (я приводил пример), которые будут иметь все переменные, процедуры и функции, которые имеет форма.

Как аналог можно привести контролы. Кинь на форму три TextBox'а. Каждый из твоих TextBox'ов - экземпляр класса TextBox, каждый имеет public процедуру Refresh (к примеру). Однако для вызова этой процедуры необходимо указать конкретный TextBox иначе как VB узнает какой из них обновлять? Так же и с формами.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 13.11.2007 (Вт) 5:20

Ну, Хакер, теперь понятно - общие процедуры в модулях форм тесно связаны с экземпляром формы. Т.е. в них можно использовать Me и не надо указывать имя формы при обращениях к контролам, т.е. ту же общую процедуру можно было бы описать в общем модуле в виде:
Код: Выделить всё
Public Sub MyProc (frm as Form)
   frm.Text1.Text="Ку-ку!"
End Sub

А теперь такой вопрос:
Создаётся массив форм и эти формы показываются немодально одна за другой. Как будет работать код, написанный в модуле формы-исходника? Предполагаю, что события будут просто ставиться в очередь и при этом есть риск, что общие переменные проекта в этом коде м.б. изменены в "произвольном порядке" в зависимости от порядка попадания событий в очередь, что приведёт к ошибкам в программе...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 13.11.2007 (Вт) 8:24

Source писал(а):А теперь такой вопрос:
Создаётся массив форм и эти формы показываются немодально одна за другой. Как будет работать код, написанный в модуле формы-исходника? Предполагаю, что события будут просто ставиться в очередь и при этом есть риск, что общие переменные проекта в этом коде м.б. изменены в "произвольном порядке" в зависимости от порядка попадания событий в очередь, что приведёт к ошибкам в программе...

На этот счет есть правильное проектирование программы, чтобы избежать случайно-произвольного изменения общих переменнных
Весь мир матрица, а мы в нем потоки байтов!

Arcady_XQST
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 17.09.2007 (Пн) 1:27
Откуда: Russia, Bryansk

Сообщение Arcady_XQST » 13.11.2007 (Вт) 17:02

А теперь такой вопрос:
Создаётся массив форм и эти формы показываются немодально одна за другой. Как будет работать код, написанный в модуле формы-исходника?
Напиши простенький пример для проверки :lol:
// тили-тили, трали-вали
if (jsLoaded) {
// это дело мне по силе, откажусь теперь едва ли
} else {
// это мы не проходили, это нам не задавали
}

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.11.2007 (Вт) 17:05

Невозможно создать массив форм.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 13.11.2007 (Вт) 20:11

а это чё: Public Frm(10) As New Form1?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.11.2007 (Вт) 20:36

Это массив ссылок на экземпляры формы.

Они вполне могут ссылаться на один и тот же экземпляр формы (все 10 ссылок)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 13.11.2007 (Вт) 22:24

если они ссылаются на 1 экземпляр формы, почему же тогда этот экземпляр формы может иметь разные значения свойств?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.11.2007 (Вт) 22:28

Ты теперь путаешь "ссылаются на один экземпляр форм" и "ссылаются на разные экземпляры одной формы".

И ты пропусти слово "могут". В приведённом тобой коде 10 ссылок указывают изначально на 10 разных экземпляров одной и той же формы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 13.11.2007 (Вт) 23:01

Хакер писал(а):Это массив ссылок на экземляры формы.

Они вполне могут ссылаться на один и тот же экземляр формы (все 10 ссылок)

Хакер, это ты напутал!
Сделал пример, который показывает, что все переменные, объявленные в модуле формы дублируюся для каждого экземпляра формы. Это я и хотел здесь узнать.
Вложения
PublicVariable.zip
(1.72 Кб) Скачиваний: 44

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.11.2007 (Вт) 23:06

Хакер, это ты напутал!

1) Кто бы говорил.
2) К чему приведена моя цитата?
3) Что показывает пример? Что члены класса локальны для каждого экземпляра класса? Кто-то это оспаривал?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 69

    TopList  
cron