Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как вставить опред.код во все формы (программно)? / 25 сообщений из 27, страница 1 из 2
08.12.2004, 12:36:55
    #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
08.12.2004, 13:42:51
    #32818661
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Код: plaintext
Application.ReplaceModule acModule, "form_" FORMNAME, "d:\tmp\newcode.txt",  0 

Undocumented
...
Рейтинг: 0 / 0
08.12.2004, 13:53:40
    #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
08.12.2004, 14:09:11
    #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
08.12.2004, 14:10:56
    #32818738
borisb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
А Application.ReplaceModule не нашел я :( - может плохо искал?

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

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

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

P.S.: Access'97

В Access'97 есть
...
Рейтинг: 0 / 0
08.12.2004, 14:37:44
    #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
08.12.2004, 14:38:39
    #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
08.12.2004, 14:40:55
    #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
08.12.2004, 14:51:31
    #32818857
borisb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Как присвоить переменной типа Form объект типа Document, или вообще как сослать на закрытую форму? Чтобы иметь возможность использовать метод .Module
...
Рейтинг: 0 / 0
08.12.2004, 14:59:20
    #32818885
borisb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Попробовал предложенным ранее методом сделать:
Код: plaintext
1.
Application.ReplaceModule acModule, "form_" & doc.Name, "c:\temp\mod.txt",  0 

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

Undocumented

Что здесь означает последний 0? Просто справка недоступна у меня по этому методу...
...
Рейтинг: 0 / 0
08.12.2004, 15:08:17
    #32818908
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
я и сам не знаю что этот 0 значит просили long - дал .
...
Рейтинг: 0 / 0
08.12.2004, 15:10:47
    #32818913
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
& - просто пропусил
...
Рейтинг: 0 / 0
08.12.2004, 15:11:35
    #32818918
borisb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Ну а все-таки: как сослаться (присвоить переменной) на закрытую форму, через что? .Documents, .Containers!Forms? Что-то еще?
...
Рейтинг: 0 / 0
08.12.2004, 15:14:55
    #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
08.12.2004, 15:17:06
    #32818941
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Код: plaintext
DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
...
Рейтинг: 0 / 0
08.12.2004, 15:34:19
    #32818996
Rivkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Действительно, А97 знаком с ф-ией ReplaceModule. Но документов никаких!
Во всяком случае в гогле только небольшая ссылка по А2003.

Alexey Sh
Как дожил до такой ф-ии, где нашел документацию? Колись!
...
Рейтинг: 0 / 0
08.12.2004, 15:36:03
    #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
08.12.2004, 15:42:47
    #32819010
Rivkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить опред.код во все формы (программно)?
Так может быть ReplaceModule на самом деле не убивает модуль, а только записывает в файл? Или дело в последнем параметре? Что там за зверь такой token As Long?

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

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

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

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

А дальше - под настроение - смотрю на очередную недок фунцию и подбираю к ней параметры - из общей логики
...
Рейтинг: 0 / 0
08.12.2004, 16:00:22
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как вставить опред.код во все формы (программно)? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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