imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 25.10.2005, 15:30     # 1
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Помогите создать 2 экземпляра формы. (VBA,Access)

Доброго времени суток.
Есть 2 формы. 1 вызывает 2 с неким параметром:

DoCmd.OpenForm "ph_f_search_res_form", , , , , , se_list.Column(1)

Все работает. Но если форма ph_f_search_res_form открыта, то нельзя вызвать еще один ее экземпляр. =(

Это возможно ? Если возможно, то подскажите как, пожалуста.
Raven B. вне форума  
Старый 26.10.2005, 09:41     # 2
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
При открытии формы проверяй, открыта ли она, и если да, то копируй форму, и эту копию уже и открывай. Вот код для создания копии формы:
Код:
Dim saveCount As Integer
Const frmname = "ph_f_search_res_form"
Dim newname As String
    If Not IsLoaded(frmname) Then
        DoCmd.OpenForm frmname, , , , , , se_list.Column(1)
    Else
On Error Resume Next
        saveCount = saveCount + 1
        newname = frmname & "-interm-" & saveCount
        DoCmd.DeleteObject acForm, newname
        DoCmd.CopyObject , newname, acForm, frmname
        DoCmd.OpenForm newname, , , , , , se_list.Column(1)
    Next
А вот функция, которая проверяет, открыта ли форма. Эта функция, если не ошибаюсь, есть в учебной базе Борей.
Код:
Function IsLoaded(ByVal strFormName As String) As Boolean
 ' Возвращает значения True, если форма открыта в режиме формы или таблицы.
    Const conObjStateClosed = 0
    Const conDesignView = 0
    
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
        If Forms(strFormName).CurrentView <> conDesignView Then
            IsLoaded = True
        End If
    End If
End Function
А при завершении работы программы можешь подчищать лишние копии формы:
Код:
On Error Resume Next
Const frmname = "ph_f_search_res_form"
Dim newname As String
Dim i As Integer
    For i = 1 To saveCount - 1
        newname = frmname & "-interm-" & i
        DoCmd.DeleteObject acForm, newname
    Next
Переменную saveCount, понятно, желательно объявить глобальной в той форме, которая производит открывание других форм.
__________________
1 миллибайт = 1/1024 байта

Последний раз редактировалось LightImage; 26.10.2005 в 09:47.
LightImage вне форума  
Старый 26.10.2005, 20:40     # 3
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Неработает =(
Говорит что не может найти свеже скопированый обьект.

Цитата:
Run-time error '7874'
Приложению 'Microsoft Office Access' не удается найти обьект 'ph_f_search_res_form-interm-1'
В чем может быть загвоздка ?
Raven B. вне форума  
Старый 27.10.2005, 10:48     # 4
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
А вообще объект копируется? Отладчиком пройди, посмотри, создается копия вообще, и на какой строке ошибка, вдруг это при удалении возникает, если On Error Resume Next не сказал =)
Если при открытии копии ошибка, то м.б. надо закрытую форму копировать, хотя у меня в Access 2002 можно и открытую обрабатывать. Попробуй копировать нужную форму при открытии открывающей, а потом делать копию уже с этой копии.

Вообще то Access какой версии используешь?
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 27.10.2005, 17:33     # 5
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
MS Office Access 2003.
Сейчас попробую выяснить...

Дико извиняюсь - бытавая, я прошу прощения, задолбаность.
Перепутал все что только можно. =)
Уже все работает. Проблема была с удалением еще не созданной формы. формы.
Еще раз извиняюсь за собственную невнимательность.
Raven B. вне форума  
Старый 27.10.2005, 19:25     # 6
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Вопрос по закрытию формы:
Нужно удалять копии когда закрывается эта самая копия. тоесть она дролжна инициировать свое удаление.

Написал:
Цитата:
Sub killform(ByVal str As String)
If IsLoaded(str) Then
DoCmd.Close acForm, str
End If
DoCmd.DeleteObject acForm, str
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim para, tmp As String
tmp = Form.OpenArgs
para = Split(tmp, "|") 'во втором элементе получившегося массива - номер копии

If Not para(1) = 0 Then 'тоесть если это не оригинал - удаляем
killform ("ph_f_search_res_form-interm-ph_f-" & para(1))
End If
End Sub
Однако при попытке выйти из формы получаю:
Цитата:
Run-time error '2501'
Прервано выполнение макрокоманды Close
Как с этим боротся ? Подскажите пожалуста.
Raven B. вне форума  
Старый 28.10.2005, 01:21     # 7
SapeR
::VIP::
 
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310

SapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царстве
Если я правильно помню - форма аксесса неразрывно связанна с неким дата-сорсом - таблицей или рекордсетом. (1) не факт что этот объект копируется при копировании формы - можето он эксклюзивный ? (2) в момент закрытия формы данный объект убивается, при попытке закрытия копии ... могет и заглючить. А поможет ли древнехалявный On Error Resume Next ?
SapeR вне форума  
Старый 28.10.2005, 09:21     # 8
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Цитата:
Если я правильно помню - форма аксесса неразрывно связанна с неким дата-сорсом - таблицей или рекордсетом.
Нет. Форма ни с чем не связана. Но связаны некоторые ее элементы. (listboxсы). Остальные данные формируются как реакция на действия пользователя.

Цитата:
(1) не факт что этот объект копируется при копировании формы - можето он эксклюзивный ?
Ну, таблицы никуда не копируются. Только формы.

Цитата:
(2) в момент закрытия формы данный объект убивается, при попытке закрытия копии ... могет и заглючить. А поможет ли древнехалявный On Error Resume Next
С On Error Resume Next не получается. Та же ошибка.
Насколько я понял, для того что бы обработка ошибки пропускалась ф-я должна выглядеть так ?
Цитата:
Sub killform(ByVal str As String)
On Error Resume Next

If IsLoaded(str) Then
DoCmd.Close acForm, str
End If
DoCmd.DeleteObject acForm, str

End Sub
Заглючить то оно заглючило. Только как эту проблему решить ?

С уважением. Ворон.
Raven B. вне форума  
Старый 28.10.2005, 09:33     # 9
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Попробуй удалять в обработчике события "Закрытия":
Код:
Private Sub Form_Close()
Dim para, tmp As String
tmp = Form.OpenArgs
para = Split(tmp, "|") 'во втором элементе получившегося массива - номер копии

If Not para(1) = 0 Then 'тоесть если это не оригинал - удаляем
killform ("ph_f_search_res_form-interm-ph_f-" & para(1))
End If
End Sub
А вообще лучше при возможности удалять не в коде самой формы, а в коде, её открывающем. Нужно открыть копию модально, а следующей строкой после открытия удалить копию, т.е. примерно так:
Код:
DoCmd.OpenForm newname, , , , , acDialog, se_list.Column(1)
' Управление на следующую строку передается после закрытия
' формы newname
DoCmd.DeleteObject acForm, newname
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 28.10.2005, 10:43     # 10
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Как модальное окно я форму открывать не могу. Дело в том что содержимое форм пользователь хочет сравнивать, а если окно модально - работать с другими окнами не получится.

При событии Close результат тот же - прерывается на

DoCmd.Close acForm, str

С той же ошибкой.
Raven B. вне форума  
Старый 28.10.2005, 11:58     # 11
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Так DoCmd.Close в событии закрытия нельзя вызывать =)
Удалить форму из её же кода вряд ли удастся имхо.
Зачищай лишние экземпляры перед открытием нужной формы. В цикле по именам копий проверяй, открыта ли копия, если да, удаляй. А имена открытых копий можно хранить в динамическом массиве
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 30.10.2005, 16:42     # 12
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
С защитой проблем нет.
И даже с удалением по закрытию вызывающей копии формы. Проблема в том что бы удалить копию сразу после ее закрытия. неужели это не возможно ?
Raven B. вне форума  
Старый 11.11.2005, 11:28     # 13
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Посмотри еще _http://www.sql.ru/forum/actualthread.aspx?bid=4&tid=47734
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 08:37.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.