Страница: 1 |
Страница: 1 |
Вопрос: Как узнать имя материнской (вызывающей) формы?
Добавлено: 14.12.07 01:31
Автор вопроса: nat-z
У меня одна из форм (например, FORM2) в программе может вызываться из различных форм. И имена этих форм используются в самой FORM2. Например, при работе этой FORM2 надо присвоить form1.text1.text = “ssssss”. Как написать такой оператор присвоения, если form1 – это имя формы, откуда произошел вызов и внутри самой form2 он неизвестен?
И еще дальше по этой же теме.
Опять же из различныx форм FORM_1a, FORM_1b … и т.д. возможна загрузка этой моей формы FORM_2, причем она может загружаться как при двойном клике на каком-то поле, так и при клике на например Picture.
Как узнать имя и тип элемента материнской формы FORM_1x, из которой произошел вызов дочерней формы FORM_2?
Как, например, написать form_2.left= form1_1x.text1.left + 3000, когда надо определить имя вызывающей формы (form1_x) и имя элемента, по которому было обращение (клик или двойной клик, вобщем, он был в фокусе – text1)?
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 14.12.07 03:16
похоже на кривость проектирования проги, обычно таких желаний не возникает.
Можно вынести обрабытываемую функцию в модуль, и передавать этой функции ссылку на форму...
т.е. в модулей что-то вроде
public function myfunc (frm as Form)
frm.text1 = "lalalla"
end function
И вызывать эту функцию из нужный форм, передавая в параметр ей ссылку на себя (т.е. Me)
ну типа..
Private Sub Form1_Click()
Call myfunc (Me)
End Sub
Номер ответа: 2
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #2
Добавлено: 14.12.07 05:35
Ну, разве что поизвращаться..
Option Explicit
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_HWNDPARENT = (-8)
Private Sub Form_Activate() ' до этого загружена как модальная
Dim hwndParent As Long
Dim frm As Form
Dim prnt As Form
Dim ctl As Control
hwndParent = GetWindowLong(Me.hwnd, GWL_HWNDPARENT)
If hwndParent Then
For Each frm In Forms
If frm.hwnd = hwndParent Then
Set prnt = frm
Set ctl = prnt.ActiveControl
Exit For
End If
Next
End If
If Not prnt Is Nothing Then Debug.Print "Вызов из " & prnt.Name
If Not ctl Is Nothing Then Debug.Print "Активный контрол " & ctl.Name
End Sub
Но, вообще, полностью согласен с HACKER.
Не парься.
Номер ответа: 3
Автор ответа:
nat-z
Вопросов: 13
Ответов: 85
Профиль | | #3
Добавлено: 14.12.07 15:09
А париться приходится!
Суть проблемы: при заполнении форм почти все поля у меня выбираются по справочнику (типа код товара, цвет, масть и проч). Для этого загружается универсальная форма. Когда выбор произведен, мне нужно в вызывающей форме проставить код товара например, а на два пальца правее - его наименование. Т.е. заполнить поля form1.kod.text и Form1.naim.text. Но этих похожи форм Form1, Form1a, Form1b много разных, поэтому мне надо знать, из какой формы произошел вызов чтобы знать, писать в form1.kod.text или form1a.kod.text
При этом еще не только имена форм разные, но расположение того же kod.text на формах м б разное!!!
Я вот тупо вижу только какую-то глоб. переменную REG=xxx присвоить значение, а в дочерней форме так же тупо сделать DO CASE по значению REG.
Неужели нельзя короче и красивее?
--------------------------------------------
И если допустим я как-то получила имя формы nameform="FORM1", имя textbox nametext="TEXT1", то как в VB пишется оператор присвоения типа x=FORM1.text1.text, чтобы вместо form1,text1 использовать переменные nameform, nametext???
Номер ответа: 4
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #4
Добавлено: 14.12.07 17:27
'в модуле формы FormUnivers
Public frm As Form
Public ctl As Control
'в общем модуле:
'оформляем вызов FormUnivers в виде отдельной
'процедуры передавая в качестве параметров
'ссылки на вызывающую форму и какой-нибудь ее контрол
Sub ShowUnivers(param1 As Form, param2 As Control)
Set FormUnivers.frm = param1
Set FormUnivers.ctl = param2
FormUnivers.Show
End Sub
'в коде FormUnivers можно ссылаться на
'объекты в переменных frm & ctl
Private Sub Command1_Click()
ctl.Text = "qwerty"'
Debug.Print frm.Caption
End Sub
Надеюсь достаточно доходчиво объяснил.
Удачи.
Номер ответа: 5
Автор ответа:
nat-z
Вопросов: 13
Ответов: 85
Профиль | | #5
Добавлено: 15.12.07 00:53
Надеюсь достаточно доходчиво объяснил.
Неа.
FormUnivers - это вызывающая или вызываемая форма? Как в моем примере - Form1 или Form2?
Номер ответа: 6
Автор ответа:
nat-z
Вопросов: 13
Ответов: 85
Профиль | | #6
Добавлено: 15.12.07 01:05
Вот у меня в форме FORM1 стоит:
Form1.Enabled = False
form1.Visible = False
Load form2
Form2.Show
End Sub
………….
Private Sub x2_DblClick()
Form1.Enabled = False
'form1.Visible = False
Load form2
Form2.Show
End Sub
Где нужно расставить твои строчки-операторы, чтобы в Form2 я могла обращаться к полям x1,x2 и знать имя вызывающей формы (FORM1)??
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 15.12.07 02:35
Call ShowUnivers (Form1, Form2)
P.S. Аффтар в курсе что такое функция, параметры функции, что через параметры можно передавать не только переменные (значения) но и ссылки на объекты (и формы в том числе).. указатели на объекты, переменные.. ?? А то может мы тут зря с EUGY распинаемся
Номер ответа: 8
Автор ответа:
nat-z
Вопросов: 13
Ответов: 85
Профиль | | #8
Добавлено: 15.12.07 17:27
Функция - то что в заголовке, там же и параметры (в скобках).
Знаю.