powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как вставить опред.код во все формы (программно)?
25 сообщений из 27, страница 1 из 2
Как вставить опред.код во все формы (программно)?
    #32818436
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно вставить следующий код во все (их более 100) формы, удалив в их модулях все имеющееся там. Как/чем это можно сделать?

Код: plaintext
1.
2.
3.
4.
5.
Dim myEvents As New ДляСправочников

Private Sub Form_Open(Cancel As Integer)
Set myEvents.Form = Me
End Sub

Помогите советом, пожалуйста, а то я замучался уже на втором десятке открывать форму, модуль, выделять все, удалять и вставлять приведенный выше код :(...
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818661
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Application.ReplaceModule acModule, "form_" FORMNAME, "d:\tmp\newcode.txt",  0 

Undocumented
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818691
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh
Код: plaintext
Application.ReplaceModule acModule, "form_" FORMNAME, "d:\tmp\newcode.txt",  0 

Undocumented

Круто!
Посмотри Module Object (Methods and Properties)

Так же, возможно, тебе поможет нижеприведенный код. Я извиняюсь перед его автором (не знаю имени) за плагиат. Этот код помогает уменьшить объем мдб за счет сохранения в файл, стирания и восстановления из файла всех модулей мдб. Дает очень неплохой результат, который, правда, потом быстро ослабевает по мере написания новых ветвей программы.

Public Function ClearMdl()
Dim mdl As Module, arrNames() As String, strName As String
Dim PathTempFile As String, ContainerName As String
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim S As String

Const MyModuleName As String = "ClearModules"

Const FileTempName As String = "~Module.txt"

S = CurrentDb.Name
PathTempFile = Left(S, Len(S) - Len(Dir(S))) + FileTempName

On Error GoTo ErrClear

For i = 1 To 3
Select Case i
Case 1
ContainerName = "Forms"
Case 2
ContainerName = "Reports"
Case 3
ContainerName = "Modules"
End Select

n = CurrentDb.Containers(ContainerName).Documents.Count - 1
If n < 0 Then GoTo Nexti

ReDim arrNames(n)
For j = 0 To n
arrNames(j) = CurrentDb.Containers(ContainerName).Documents(j).Name
Next j

SysCmd acSysCmdInitMeter, ContainerName, (n + 1)

For j = 0 To n

strName = arrNames(j)
Select Case i
Case 1
DoCmd.OpenForm strName, acDesign, , , , acHidden
If Not Forms(strName).HasModule Then GoTo Nextj
Set mdl = Forms(strName).Module
Case 2
DoCmd.OpenReport strName, acDesign
If Not Reports(strName).HasModule Then GoTo Nextj
Set mdl = Reports(strName).Module
Case 3
If strName = MyModuleName Then GoTo Nextj
DoCmd.OpenModule strName
Set mdl = Modules(strName)
End Select

If Dir(PathTempFile) <> "" Then Kill PathTempFile
Open PathTempFile For Binary Access Write As #1
For k = 1 To mdl.CountOfLines
S = mdl.Lines(k, 1) & Chr(13)
m = m + Len(S)
Put #1, , S
Next k
Close #1

Select Case i
Case 1
Forms(strName).HasModule = False
DoCmd.Save acForm, strName
Forms(strName).HasModule = True
Set mdl = Forms(strName).Module
Case 2
Reports(strName).HasModule = False
DoCmd.Save acReport, strName
Reports(strName).HasModule = True
Set mdl = Reports(strName).Module
Case 3
If mdl.Type Then
DoCmd.RunCommand acCmdNewObjectClassModule
Else
DoCmd.RunCommand acCmdNewObjectModule
End If
S = Modules(Modules.Count - 1).Name
DoCmd.Close acModule, strName
DoCmd.DeleteObject acModule, strName
DoCmd.Save acModule, S
DoCmd.Close acModule, S
DoCmd.Rename strName, acModule, S
DoCmd.OpenModule strName
Set mdl = Modules(strName)
End Select

mdl.DeleteLines 1, mdl.CountOfLines

mdl.AddFromFile PathTempFile

Nextj:
Select Case i
Case 1: DoCmd.Close acForm, strName, acSaveYes
Case 2: DoCmd.Close acReport, strName, acSaveYes
Case 3: If strName <> MyModuleName Then DoCmd.Close acModule, strName, acSaveYes
End Select
SysCmd acSysCmdUpdateMeter, (j + 1)
Next j
Nexti:
Next i

If Dir(PathTempFile) <> "" Then Kill PathTempFile
SysCmd acSysCmdClearStatus
MsgBox "Successfully!", vbInformation
Exit Function

ErrClear:
MsgBox ": ContainerName= " & ContainerName & ", DocumentName= " & strName & Chr(13) & _
"Error number = " & Err & ". " & Err.Description
Stop
Resume
End Function
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818730
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что-то не получается (см. код) - ругается на "объект более не задан..." уже со второй строки:
---
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim ctr As Container, doc As Document, mdl As Module
Dim lngReturn As Long

Set ctr = CurrentDb.Containers!Forms
    For Each doc In ctr.Documents
        If doc.Name Like "*lookup" Then
            If MsgBox("Пропатчить форму <" & doc.Name & ">?", vbYesNo) = vbYes Then
                Set mdl = Forms(doc.Name).Module
                mdl.DeleteLines  3 , mdl.CountOfLines
                lngReturn = mdl.CreateEventProc("Open", doc)
                mdl.InsertLines lngReturn +  1 , vbTab & "Set myEvents.Form = Me"
            End If
        End If
    Next
Set ctr = Nothing
---

И правильно я задал синтаксис в выражении "mdl.CreateEventProc("Open", doc)" - интересует указанное doc как объект....
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818738
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Application.ReplaceModule не нашел я :( - может плохо искал?

P.S.: Access'97
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818759
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недокументирован однако ReplaceModule

Вызвать Object Browser, правой кнопкой мыши включить "Show Hidden members" и посмотреть на скрытые методы Application
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818788
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все-таки, что не так в этой строке:
Код: plaintext
1.
Set ctr = CurrentDb.Containers!Forms

- после нее ругается на "указан недопустимый объект или объект более не задан"...
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818795
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
borisbА Application.ReplaceModule не нашел я :( - может плохо искал?

P.S.: Access'97

В Access'97 есть
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818811
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй так

Код: plaintext
1.
2.
Dim dbs As Database, ctr As Container, doc As Document
    Set dbs = CurrentDb
    Set ctr = CurrentDb.Containers!Forms
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818816
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рпечатка вышла при проверке

Код: plaintext
1.
2.
Dim dbs As Database, ctr As Container, doc As Document
    Set dbs = CurrentDb
    Set ctr = dbs.Containers!Forms
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818827
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось :) Странно, однако...
А вот какздесь присвоить правильнее будет?:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
                Set ff = dbs.Containers!Forms(doc.Name)
                Set mdl = ff.Module
                mdl.DeleteLines  3 , mdl.CountOfLines
                lngReturn = mdl.CreateEventProc("Open", doc)
                'mdl.InsertLines lngReturn + 1, vbTab & "Set myEvents.Form = Me"
                mdl.AddFromFile "c:\temp\mod.txt"
                Set ff = Nothing

- в первой строчке что-то не так... (ff as Form)
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818857
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как присвоить переменной типа Form объект типа Document, или вообще как сослать на закрытую форму? Чтобы иметь возможность использовать метод .Module
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818885
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал предложенным ранее методом сделать:
Код: plaintext
1.
Application.ReplaceModule acModule, "form_" & doc.Name, "c:\temp\mod.txt",  0 

- вроде не ругался, а изменения не сохранил :(... Что-то не дописал я?
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818901
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh
Код: plaintext
Application.ReplaceModule acModule, "form_" FORMNAME, "d:\tmp\newcode.txt",  0 

Undocumented

Что здесь означает последний 0? Просто справка недоступна у меня по этому методу...
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818908
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я и сам не знаю что этот 0 значит просили long - дал .
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818913
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
& - просто пропусил
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818918
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а все-таки: как сослаться (присвоить переменной) на закрытую форму, через что? .Documents, .Containers!Forms? Что-то еще?
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818935
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работающий код перечисления всех форм в мдб:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub OpenAllForms()
    Dim db As DAO.Database: Set db = CurrentDb
    Dim ct As Container: Set ct = db.Containers("Forms")
    Dim dc As Document, fm As Form, i As Integer, cr As Control

On Error Resume Next
DoCmd.SetWarnings False
    For i =  0  To ct.Documents.Count -  1 
        Set dc = ct.Documents(i)
        DoCmd.OpenForm dc.Name, acDesign
        Set fm = Forms(dc.Name)
    
        ...
    Next
DoCmd.SetWarnings True

End Sub

Код от 13:53 просматривал?
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818941
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818996
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, А97 знаком с ф-ией ReplaceModule. Но документов никаких!
Во всяком случае в гогле только небольшая ссылка по А2003.

Alexey Sh
Как дожил до такой ф-ии, где нашел документацию? Колись!
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32818999
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не сохраняет-таки, зараза! Вот подправленный код:
---
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Dim ctr As Container, doc As Document, mdl As Module, dbs As Database, ff As Form
Dim lngReturn As Long

Set dbs = CurrentDb
Set ctr = dbs.Containers!Forms
    For Each doc In ctr.Documents
        If doc.Name Like "*lookup" And doc.Name <> "bumaga_lookup" And doc.Name <> "oborudovanie_lookup" And doc.Name <> "izdaniya_lookup" Then
            If MsgBox("Пропатчить форму <" & doc.Name & ">?", vbYesNo) = vbYes Then
                DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
                'Set ff = Forms(doc.Name)
                'Set mdl = Modules("Form_" & doc.Name) 'ff.Module
                'mdl.DeleteLines 0, mdl.CountOfLines
                'lngReturn = mdl.CreateEventProc("Open", doc)
                'mdl.AddFromFile "c:\temp\mod.txt"
                'Set ff = Nothing
                If Forms(doc.Name).HasModule Then
                    Application.ReplaceModule acModule, Forms(doc.Name).Module.Name, "c:\temp\mod.txt",  0 
                End If
                DoCmd.Close acForm, doc.Name, acSaveYes
                
                'Application.ReplaceModule acModule, "form_" & doc.Name, "c:\temp\mod.txt", 0
                'DoCmd.SetWarnings False
                'DoCmd.RunSQL ("insert into [0] (imya) values ('" & doc.Name & "');")
                'DoCmd.SetWarnings True
            Else
                Exit Sub
            End If
        End If
    Next
Set dbs = Nothing
---

- нигде не ругается, а модули форм как были старыми, так и остались :(
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32819010
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так может быть ReplaceModule на самом деле не убивает модуль, а только записывает в файл? Или дело в последнем параметре? Что там за зверь такой token As Long?

Из словаря превод слова token:
прилагательное:
символический, имеющий видимось, имеющий подобие, кажущийся
существительное:
знак, опознавательный знак, подарок на память, признак, примета, талон, жетон

Выбирай подходящее! Мне больше всего нравится "подарок на память"
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32819011
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey ShВызвать Object Browser, правой кнопкой мыши включить "Show Hidden members" и посмотреть на скрытые методы Application
- ух-ты! А зачем, интересно, понадобилась Биллу эта примитивная игра в прятки???
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32819039
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Rivkin Dmitry :

В своё время попались описания LoadFromText и SaveAsText,
а я всегда любил сохранять следы работы всяческих визуальных сред в текстовых файлах (с ЕС ЭВМ ещё пошло, бумага была самым надёжнам носителем, распечатал код и текстовое представление экранных форм(3270) на своём птичьем языке и сдал в архив, накроются ленты с дисками - девочки наберут с листинга )

Результаты SaveasText удобно использовать для анализа базы, в частности поиска вызовов функций в запросах и т п

А дальше - под настроение - смотрю на очередную недок фунцию и подбираю к ней параметры - из общей логики
...
Рейтинг: 0 / 0
Как вставить опред.код во все формы (программно)?
    #32819058
borisb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С Application.ReplaceModule не получилось - не сохраняет и все тут.

Сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Dim ctr As Container, doc As Document, mdl As Module, dbs As Database, ff As Form
Dim lngReturn As Long

Set dbs = CurrentDb
Set ctr = dbs.Containers!Forms
    For Each doc In ctr.Documents
        If doc.Name Like "*lookup" And doc.Name <> "bumaga_lookup" And doc.Name <> "oborudovanie_lookup" And doc.Name <> "izdaniya_lookup" Then
            'If MsgBox("Пропатчить форму <" & doc.Name & ">?", vbYesNo) = vbYes Then
                DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
                Set ff = Forms(doc.Name)
                Set mdl = ff.Module
                mdl.DeleteLines  1 , mdl.CountOfLines
                'lngReturn = mdl.CreateEventProc("Open", doc)
                mdl.AddFromFile "c:\temp\mod.txt"
                'Set ff = Nothing
                'If Forms(doc.Name).HasModule Then
                '    Application.ReplaceModule acModule, Forms(doc.Name).Module.Name, "c:\temp\mod.txt", 0
                'End If
                DoCmd.Close acForm, doc.Name, acSaveYes
                
                'Application.ReplaceModule acModule, "form_" & doc.Name, "c:\temp\mod.txt", 0
                DoCmd.SetWarnings False
                DoCmd.RunSQL ("insert into [0] (imya) values ('" & doc.Name & "');")
                DoCmd.SetWarnings True
            'Else
            '    Exit Sub
            'End If
        End If
    Next
Set dbs = Nothing

- все ок! Аж целых 105 форм прошла ;) Уф...
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как вставить опред.код во все формы (программно)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]