Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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 стоит:

Private Sub x1_DblClick()
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
Функция - то что в заголовке, там же и параметры (в скобках).
Знаю.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам