Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsFormsForms ProgrammingQueriesModules / DAO / VBAReports / PrintingMacrosDatabase DesignSecurityConversionImporting / LinkingSQL Server / ADPMultiuser / NetworkingReplicationSetup / ConfigurationDeveloper ToolkitsActiveX ControlsNew UsersGeneral 1General 2
Access DirectoryToolsTutorialsUser Groups
Related Topics
SQL ServerOther DB ProductsMS OfficeMore Topics ...

MS Access Forum / General 2 / February 2007

Tip: Looking for answers? Try searching our database.

Creating form from code

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Domac - 23 Feb 2007 09:34 GMT
Hi ,

I am creating form from code using 'CreateForm' and 'CreateControl'
functions.
Everything works fine, as we plan to deploy MDE version soon, question is
will it work in MDE enviroment??

Thanks a lot.
Domac
Allen Browne - 23 Feb 2007 09:44 GMT
No. CreateForm won't work in an MDE.

Signature

Allen Browne - Microsoft MVP.  Perth, Western Australia
Tips for Access users - http://allenbrowne.com/tips.html
Reply to group, rather than allenbrowne at mvps dot org.

> I am creating form from code using 'CreateForm' and 'CreateControl'
> functions.
[quoted text clipped - 3 lines]
> Thanks a lot.
> Domac
Domac - 23 Feb 2007 11:46 GMT
Where to find list of MDE limitatons?

Thanks,
Domagoj

> No. CreateForm won't work in an MDE.
>
[quoted text clipped - 5 lines]
>> Thanks a lot.
>> Domac
Douglas J. Steele - 23 Feb 2007 12:50 GMT
There are some details at
http://msdn2.microsoft.com/en-us/library/aa189988(office.10).aspx (don't
work if you're not using Access 2002: that article applies to all versions)

Signature

Doug Steele, Microsoft Access MVP
http://I.Am/DougSteele
(no e-mails, please!)

> Where to find list of MDE limitatons?
>
[quoted text clipped - 10 lines]
>>> Thanks a lot.
>>> Domac
David W. Fenton - 23 Feb 2007 13:57 GMT
> Where to find list of MDE limitatons?

Well, if you'd bother to read the help file on what an MDE is, you
should have understood already *why* you can't create forms in an
MDE. Most of the "limitations" of an MDE flow directly from what an
MDE *is*, which is an Access project with the canonical code
stripped and only the compiled code left. This means that the Access
project is read-only throughout.

And all of that should be obvious from the definition of what an MDE
is. At least, for anyone who takes the time to think about it.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 23 Feb 2007 14:44 GMT
Is it possible to create an empty form (report) and use it somehow in MDE?
Ie. create controls, modufy class module code and run? IMHO, it would fix
some problems...

Vlado

>> Where to find list of MDE limitatons?
>
[quoted text clipped - 7 lines]
> And all of that should be obvious from the definition of what an MDE
> is. At least, for anyone who takes the time to think about it.
Tony Toews [MVP] - 23 Feb 2007 18:51 GMT
>Is it possible to create an empty form (report) and use it somehow in MDE?
>Ie. create controls, modufy class module code and run? IMHO, it would fix
>some problems...

But you can't open an object in design view in an MDE.

Tony
Signature

Tony Toews, Microsoft Access MVP
  Please respond only in the newsgroups so that others can
read the entire thread of messages.
  Microsoft Access Links, Hints, Tips & Accounting Systems at
http://www.granite.ab.ca/accsmstr.htm

Vladimír Cvajniga - 23 Feb 2007 21:00 GMT
Unfortunatelly, it's true. Can this be changed in future versions of Access?
What do you think?
Vlado

>>Is it possible to create an empty form (report) and use it somehow in MDE?
>>Ie. create controls, modufy class module code and run? IMHO, it would fix
[quoted text clipped - 3 lines]
>
> Tony
Tony Toews [MVP] - 25 Feb 2007 19:23 GMT
>Unfortunatelly, it's true. Can this be changed in future versions of Access?
>What do you think?

Highly unlikely.  Not being able to open an object in design view is
why MDEs even exist.

Tony
Signature

Tony Toews, Microsoft Access MVP
  Please respond only in the newsgroups so that others can
read the entire thread of messages.
  Microsoft Access Links, Hints, Tips & Accounting Systems at
http://www.granite.ab.ca/accsmstr.htm

David W. Fenton - 23 Feb 2007 23:01 GMT
> Is it possible to create an empty form (report) and use it somehow
> in MDE? Ie. create controls, modufy class module code and run?
> IMHO, it would fix some problems...

Create a generic form with controls and labels and at runtime, set
the recordsource, bind the controls to the appropriate fields,
change the labels and last position and resize the controls. That
will take care of your problem, though I can't for the life of me
figure out *why* you'd ever need to do such a thing.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 24 Feb 2007 08:33 GMT
As to me, I don't understand why MS has added those Create... functions to
Access. The only situation when I need to create a new form/report is when I
run out of resources (1000 objects). I NEVER use CreateForm/CreateReport.
When I'm in open MDB-project I often use design mode to create
reports/forms.

I have added "automatic reports" feature to my projects. They are based on
form's recordset. User has ability to select fields, sort, totals... plus
some more options (page breaks on group level, save/read automatic report
settings, etc.). To make it work I had to add a few template reports to each
of the project. Template reports contain "raw" controls and I "play games"
with this stuff.

The idea of automatic reports comes from Czech relational DB system PC FAND.
I just wonder why we don't have automatic reports in MS Access. :-/

BTW, I desperatly miss incremental search in MS Access, too. I had to create
one form plus some supporting code to have thic functionality in my
projects.

Vlado

>> Is it possible to create an empty form (report) and use it somehow
>> in MDE? Ie. create controls, modufy class module code and run?
[quoted text clipped - 5 lines]
> will take care of your problem, though I can't for the life of me
> figure out *why* you'd ever need to do such a thing.
Vladimír Cvajniga - 24 Feb 2007 09:39 GMT
Images

--------------------
Report templates:
http://img148.imagevenue.com/img.php?image=09743__AutoReport_Template1_418lo.jpg
http://img104.imagevenue.com/img.php?image=09787__AutoReport_Template2_454lo.jpg
http://img20.imagevenue.com/img.php?image=09776__AutoReport_Template3_418lo.jpg
http://img144.imagevenue.com/img.php?image=09754__AutoReport_WTemplate1_407lo.jpg
http://img21.imagevenue.com/img.php?image=09759__AutoReport_WTemplate2_327lo.jpg
http://img158.imagevenue.com/img.php?image=09789__AutoReport_WTemplate3_401lo.jpg

User interface form:
http://img137.imagevenue.com/img.php?image=09765__AutoReport_frm1_582lo.jpg
http://img14.imagevenue.com/img.php?image=09771__AutoReport_frm2_315lo.jpg

The report:
http://img161.imagevenue.com/img.php?image=09748__AutoReport_The_Report_401lo.jpg

--------------------

Incremental search:
http://img165.imagevenue.com/img.php?image=09782__IncrementalSearch_481lo.jpg

--------------------

I hope that now it'll be very easy to understand the ideas... and that MS
guys will do their best ASAP! ;-)

Vlado

> As to me, I don't understand why MS has added those Create... functions to
> Access. The only situation when I need to create a new form/report is when
[quoted text clipped - 27 lines]
>> will take care of your problem, though I can't for the life of me
>> figure out *why* you'd ever need to do such a thing.
David W. Fenton - 25 Feb 2007 01:56 GMT
> Incremental search:
> http://img165.imagevenue.com/img.php?image=09782__IncrementalSearch
> _481lo.jpg

It's extremely easy to implement that in code. It's easy enough to
do with the built-in tools -- the FIND dialog has different sets for
whole field match, start of field, or anywhere in field; plus you
can type "H*" and find all recordsbeginning with H. And filtering
works the same way, with the ability to use the * wildcard (or ? or
@) in the built-in filtering mechanism without any need to code for
it.

That said, I wouldn't want to have to train my users on how to use
that generalized tool. Instead I'd do what you've done and program a
specific interface for them to accomplish what they need to do.
That's not an issue of built-in features being included or lacking
-- it's just a matter of choosing whether you want to train your
users on the built-in features or build something customized
specifically for their needs.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

David W. Fenton - 25 Feb 2007 01:52 GMT
> I don't understand why MS has added those Create... functions to
> Access.

So you can create a database in code.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 25 Feb 2007 08:02 GMT
We are talking about forms and reports: CreateForm, CreateReport,
CreateControl, CreateReportControl. I could easily live without those
because I don't need them at all. I wonder if anybody uses these functions.

CreateDatabase, CreateTable, etc., is totally different kind of stuff. I use
them quite often.

Vlado

>> I don't understand why MS has added those Create... functions to
>> Access.
>
> So you can create a database in code.
David W. Fenton - 26 Feb 2007 00:04 GMT
> We are talking about forms and reports: CreateForm, CreateReport,
> CreateControl, CreateReportControl. I could easily live without
[quoted text clipped - 3 lines]
> CreateDatabase, CreateTable, etc., is totally different kind of
> stuff. I use them quite often.

Well, it wasn't designed specifically for *you*. I'm sure there are
commands I never use that you use all the time (and vice versa), but
I'm not calling for the elimination of those commands just because I
don't use them.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

James A. Fortune - 26 Feb 2007 18:49 GMT
> We are talking about forms and reports: CreateForm, CreateReport,
> CreateControl, CreateReportControl. I could easily live without those
> because I don't need them at all. I wonder if anybody uses these functions.
>
> CreateDatabase, CreateTable, etc., is totally different kind of stuff. I
> use them quite often.

I am in the middle of using them to create a wizard to generate search
forms automatically right now.  I want the wizard to allow the user to
select an Access table and some options and use the selections to create
three forms, e.g., for tblEmail frmEmailSearch, frmEmailResults,
frmEmailInfo.  The first form is unbound and is used to create a dynamic
sql string that can be used to populate a read-only bound results form.
 Once a record is selected from the results form, an info form (bound
or unbound depending on the selection) can be used to edit the record.
I'm almost done with the controls for the first search form.  I have to
decide what to do if the table has more than 80 fields since non-date
fields are placed vertically and there's an integer twips limit on the
size of the form.  Instead of using an API function so get text widths I
assume that field names are Camel Case (the user can resize the controls
afterward otherwise).  I set up two textboxes for each date field.  The
idea is to limit the date field to that range, but to select the exact
date if only the first textbox is filled in.  I'll probably adjust the
basic idea for things like Y/N fields, but that will be after the basics
are in place.  Here's the code so far:

Option Compare Database
Option Explicit

Private Sub cmdCreateSearchForms_Click()
Dim MyDB As Database
Dim MyRS As Recordset
Dim strSQL As String
Dim tdf As TableDef
Dim idx As Index
Dim fld As Field
Dim ctl As Control
Dim strFieldNames() As String
Dim intFieldTypes() As Integer
Dim intFieldActSize() As Integer
Dim intNonKeyFields As Integer
Dim intI As Integer
Dim intJ As Integer
Dim strField As String
Dim boolFieldFound As Boolean
Dim strPrimaryKeyField As String
Dim strTable As String
Dim strForm As String
Dim ctnr As Container
Dim doc As Document
Dim boolSearchFormFound As Boolean
Dim boolResultsFormFound As Boolean
Dim boolInfoFormFound As Boolean
Dim Response As Variant
Dim strPrompt As String
Dim strTitle As String
Dim frmSearch As Form
Dim frmResults As Form
Dim frmInfo As Form
Dim strSearchForm As String
Dim strResultsForm As String
Dim strInfoForm As String
Dim strCreatedForm As String
Const FORMWIDTH = 7
Const VERTSPACING = 360
Const NORMALWEIGHT = 400
Const SEMIBOLD = 600
Const TEXTALIGNLEFT = 1
Const TEXTALIGNCENTER = 2
Const TEXTALIGNRIGHT = 3
Const SHADOWED = 4
Const NORMALBACKSTYLE = 1
Dim lngFormHeightTwips As Long
Dim intDateFields As Integer
Dim intNonDateFields As Integer
Dim lngTitleTwipsL As Long
Dim lngTitleTwipsT As Long
Dim lngTitleTwipsW As Long
Dim lngTitleTwipsH As Long
Dim lngCommandNewTwipsL As Long
Dim lngCommandNewTwipsT As Long
Dim lngCommandNewTwipsW As Long
Dim lngCommandNewTwipsH As Long
Dim lngCommandGoTwipsL As Long
Dim lngCommandGoTwipsT As Long
Dim lngCommandGoTwipsW As Long
Dim lngCommandGoTwipsH As Long
Dim lngCommandExitTwipsL As Long
Dim lngCommandExitTwipsT As Long
Dim lngCommandExitTwipsW As Long
Dim lngCommandExitTwipsH As Long
Dim lngLabelsRef0TwipsL As Long
Dim lngLabelsRef0TwipsT As Long
Dim lngLabelsRef0TwipsW As Long
Dim lngLabelsRef0TwipsH As Long
Dim lngComboboxRef0TwipsL As Long
Dim lngComboboxRef0TwipsT As Long
Dim lngComboboxRef0TwipsW As Long
Dim lngComboboxRef0TwipsH As Long
Dim dblLabelMaxW As Double
Dim dblDateLabelMaxW As Double
Dim dblComboboxMaxW As Double
Dim lngDateLabelDRTwipsL As Long
Dim lngDateLabelDRTwipsT As Long
Dim lngDateLabelDRTwipsW As Long
Dim lngDateLabelDRTwipsH As Long
Dim lngDateLabelFldTwipsL As Long
Dim lngDateLabelFldTwipsT As Long
Dim lngDateLabelFldTwipsW As Long
Dim lngDateLabelFldTwipsH As Long
Dim lngDateLabelStartTwipsL As Long
Dim lngDateLabelStartTwipsT As Long
Dim lngDateLabelStartTwipsW As Long
Dim lngDateLabelStartTwipsH As Long
Dim lngDateLabelEndTwipsL As Long
Dim lngDateLabelEndTwipsT As Long
Dim lngDateLabelEndTwipsW As Long
Dim lngDateLabelEndTwipsH As Long
Dim lngDateLabelRef0TwipsL As Long
Dim lngDateLabelRef0TwipsT As Long
Dim lngDateLabelRef0TwipsW As Long
Dim lngDateLabelRef0TwipsH As Long
Dim lngNudgeDateLabelDown As Long
Const CharToInches = 0.08

If IsNull(cbxTableName.Value) Then
  MsgBox ("No table has been selected.")
  Exit Sub
End If
'Check for the existence of a primary key
Set MyDB = CurrentDb
Set tdf = MyDB.TableDefs(cbxTableName.Value)
strPrimaryKeyField = ""
For Each idx In tdf.Indexes
  If idx.Primary = True Then
    'Make sure the type of the primary key is Long
    'and that it is on a single field
    strField = Right(idx.Fields, Len(idx.Fields) - 1)
    boolFieldFound = False
    For Each fld In tdf.Fields
      If fld.Name = strField Then
        boolFieldFound = True
        strPrimaryKeyField = strField
        Exit For
      End If
    Next fld
    If boolFieldFound = True Then
      If tdf.Fields(strField).Type <> dbLong Then
        MsgBox ("The primary key must have a Long data type.")
        Set tdf = Nothing
        Set MyDB = Nothing
        Exit Sub
      End If
    Else
      MsgBox ("The primary key must be on a single field.")
      Set tdf = Nothing
      Set MyDB = Nothing
      Exit Sub
    End If
    Exit For
  End If
Next idx
Set tdf = Nothing
'Allocate VERTSPACING for total number of Non-Date and Non-PK fields
unless there are lots of date fields
intDateFields = 0
intNonDateFields = 0
Set tdf = MyDB.TableDefs(cbxTableName.Value)
'I should set up an array to store the field names and their types.
intNonKeyFields = tdf.Fields.Count - 1
ReDim strFieldNames(intNonKeyFields)
ReDim intFieldTypes(intNonKeyFields)
ReDim intFieldActSize(intNonKeyFields)

For Each fld In tdf.Fields
  If fld.Name <> strPrimaryKeyField Then
    If fld.Type = dbDate Then
      intDateFields = intDateFields + 1
    Else
      intNonDateFields = intNonDateFields + 1
    End If
    strFieldNames(intDateFields + intNonDateFields) = fld.Name
    intFieldTypes(intDateFields + intNonDateFields) = fld.Type
    'Get the actual max size if it's a text field, otherwise use fld.Size
    If fld.Type = dbText Then
      strSQL = "SELECT Max(Len(Nz(" & fld.Name & ", ''))) AS MaxLen
FROM " & cbxTableName.Value & ";"
      Set MyRS = MyDB.OpenRecordset(strSQL, dbOpenSnapshot)
      intFieldActSize(intDateFields + intNonDateFields) = 0
      If MyRS.RecordCount > 0 Then
        MyRS.MoveFirst
        intFieldActSize(intDateFields + intNonDateFields) = MyRS("MaxLen")
      End If
      MyRS.Close
      Set MyRS = Nothing
    Else
      intFieldActSize(intDateFields + intNonDateFields) = fld.Size
    End If
  End If
Next fld
Set tdf = Nothing
'MsgBox ("Date Fields: " & intDateFields)
'MsgBox ("Non-Date Fields: " & intNonDateFields)
'Determine how large vertically to make the form; allow 1/2" for title
and lower command buttons
'Allow two lines for the Date label and sublabels
If intDateFields + 2 > intNonDateFields Then
  lngFormHeightTwips = (intDateFields + 2) * VERTSPACING + 1440 + 0.5 *
1440 + 0.25 * 1440
Else
  lngFormHeightTwips = intNonDateFields * VERTSPACING + 1440 + 0.5 *
1440 + 0.25 * 1440
End If
strTable = cbxTableName.Value
If Left(strTable, 3) = "tbl" Then
  If Len(strTable) > 3 Then
    strTable = Right(strTable, Len(strTable) - 3)
  End If
End If
'Check for pre-existing forms: e.g., frmMyTableSearch (tblMyTable)
boolSearchFormFound = False
boolResultsFormFound = False
boolInfoFormFound = False
strSearchForm = "frm" & strTable & "Search"
strResultsForm = "frm" & strTable & "Results"
strInfoForm = "frm" & strTable & "Info"
For Each ctnr In MyDB.Containers
  If ctnr.Name = "Forms" Then
    For Each doc In ctnr.Documents
      Select Case doc.Name
      Case strSearchForm: boolSearchFormFound = True
      Case strResultsForm: boolResultsFormFound = True
      Case strInfoForm: boolInfoFormFound = True
      End Select
      If boolSearchFormFound = True And boolResultsFormFound = True And
boolInfoFormFound = True Then Exit For
    Next doc
  End If
Next ctnr
If boolSearchFormFound = True Then
  strPrompt = strSearchForm & " already exists.  Delete?"
  strTitle = "Action Confirmation"
  Response = MsgBox(strPrompt, vbOKCancel, strTitle)
  If Response <> vbOK Then
    Set MyDB = Nothing
    Exit Sub
  End If
  DoCmd.DeleteObject acForm, strSearchForm
End If
If boolResultsFormFound = True Then
  strPrompt = strResultsForm & " already exists.  Delete?"
  strTitle = "Action Confirmation"
  Response = MsgBox(strPrompt, vbOKCancel, strTitle)
  If Response <> vbOK Then
    Set MyDB = Nothing
    Exit Sub
  End If
  DoCmd.DeleteObject acForm, strResultsForm
End If
If boolInfoFormFound = True Then
  strPrompt = strInfoForm & " already exists.  Delete?"
  strTitle = "Action Confirmation"
  Response = MsgBox(strPrompt, vbOKCancel, strTitle)
  If Response <> vbOK Then
    Set MyDB = Nothing
    Exit Sub
  End If
  DoCmd.DeleteObject acForm, strInfoForm
End If
DoEvents
Set frmSearch = CreateForm()
'Set basic form properties
frmSearch.HasModule = True
frmSearch.ViewsAllowed = 1 'Form
frmSearch.ScrollBars = 2 'Vertical Only
frmSearch.RecordSelectors = False
frmSearch.NavigationButtons = False
frmSearch.DividingLines = False
frmSearch.ShortcutMenu = False
frmSearch.Width = FORMWIDTH * 1440
frmSearch.Section(acDetail).Height = lngFormHeightTwips
strCreatedForm = frmSearch.Name
'Add Controls and code to the newly created form after it has been renamed
DoCmd.Close acForm, strCreatedForm, acSaveYes
Do While IsFormOpen(strCreatedForm)
  DoEvents
Loop
Set frmSearch = Nothing
DoCmd.Rename strSearchForm, acForm, strCreatedForm
DoEvents
DoCmd.OpenForm strSearchForm, acDesign
DoEvents
lngTitleTwipsL = 2.5 * 1440
lngTitleTwipsT = 0.25 * 1440
lngTitleTwipsW = 2 * 1440
lngTitleTwipsH = 0.25 * 1440
lngCommandNewTwipsW = 0.875 * 1440
lngCommandNewTwipsH = 0.25 * 1440
lngCommandNewTwipsT = lngTitleTwipsT
lngCommandNewTwipsL = Int((lngTitleTwipsL - lngCommandNewTwipsW) / 2)
Set ctl = CreateControl(strSearchForm, acLabel, , "lblTitle", ,
lngTitleTwipsL, lngTitleTwipsT)
Call SetControlProperties(ctl, "lblTitle", 12, SEMIBOLD,
TEXTALIGNCENTER, lngTitleTwipsW, lngTitleTwipsH, "Search Form")
Set ctl = Nothing
Set ctl = CreateControl(strSearchForm, acCommandButton, acDetail, ,
"New", lngCommandNewTwipsL, lngCommandNewTwipsT)
Call SetControlProperties(ctl, "cmdNew", 10, SEMIBOLD, ,
lngCommandNewTwipsW, lngCommandNewTwipsH, "New")
Set ctl = Nothing
'Do any non-date fields first
'Allocate 1.05" for every 10 characters at 10 point
dblLabelMaxW = GetMaximumLabelSize(strFieldNames(), intFieldTypes(), 10,
"NonDate") 'Characters
'Convert to inches
dblLabelMaxW = dblLabelMaxW * CharToInches
lngLabelsRef0TwipsL = 0.5 * 1440
lngLabelsRef0TwipsT = 0.75 * 1440
lngLabelsRef0TwipsW = dblLabelMaxW * 1440
lngLabelsRef0TwipsH = 0.8 * VERTSPACING
dblComboboxMaxW = GetMaximumTextFieldSize(intFieldTypes(),
intFieldActSize(), 20) 'Characters
'Convert to inches
dblComboboxMaxW = dblComboboxMaxW * CharToInches
lngComboboxRef0TwipsL = lngLabelsRef0TwipsL + lngLabelsRef0TwipsW + 0.25
* 1440
lngComboboxRef0TwipsT = 0.75 * 1440
lngComboboxRef0TwipsW = dblComboboxMaxW * 1440
lngComboboxRef0TwipsH = 0.8 * VERTSPACING
If intNonDateFields > 0 Then
  For intI = 1 To intNonKeyFields
    If intFieldTypes(intI) <> dbDate Then
      'Set up the label
      Set ctl = CreateControl(strSearchForm, acLabel, , "lbl" &
strFieldNames(intI), , lngLabelsRef0TwipsL, lngLabelsRef0TwipsT + (intI
- 1) * VERTSPACING)
      Call SetControlProperties(ctl, "lbl" & strFieldNames(intI), 10,
NORMALWEIGHT, TEXTALIGNRIGHT, lngLabelsRef0TwipsW, lngLabelsRef0TwipsH,
strFieldNames(intI))
      'Set up the combobox
      Set ctl = CreateControl(strSearchForm, acComboBox, , , ,
lngComboboxRef0TwipsL, lngComboboxRef0TwipsT + (intI - 1) * VERTSPACING)
      Call SetControlProperties(ctl, "cbx" & strFieldNames(intI), 10,
NORMALWEIGHT, TEXTALIGNLEFT, lngComboboxRef0TwipsW, lngComboboxRef0TwipsH)
      ctl.Properties("RowSource") = "SELECT DISTINCT " &
strFieldNames(intI) & " FROM " & cbxTableName.Value & " WHERE " &
strFieldNames(intI) & " IS NOT NULL ORDER BY " & strFieldNames(intI) & ";"
    End If
  Next intI
End If
'If date fields exist, set up some labels and textboxes for them
dblDateLabelMaxW = GetMaximumLabelSize(strFieldNames(), intFieldTypes(),
10, "Date") 'Characters
'Convert to inches
dblDateLabelMaxW = dblDateLabelMaxW * CharToInches
lngDateLabelDRTwipsL = lngComboboxRef0TwipsL + lngComboboxRef0TwipsW +
(0.5 + dblDateLabelMaxW) * 1440
lngDateLabelDRTwipsT = lngComboboxRef0TwipsT
lngDateLabelDRTwipsW = 1800
lngDateLabelDRTwipsH = 288
lngDateLabelFldTwipsL = lngComboboxRef0TwipsL + lngComboboxRef0TwipsW +
0.5 * 1440
lngDateLabelFldTwipsT = lngComboboxRef0TwipsT
lngDateLabelFldTwipsW = dblDateLabelMaxW * 1440
lngDateLabelFldTwipsH = 288
lngDateLabelStartTwipsL = lngComboboxRef0TwipsL + lngComboboxRef0TwipsW
+ (dblDateLabelMaxW + 0.8) * 1440
lngDateLabelStartTwipsT = lngComboboxRef0TwipsT
lngDateLabelStartTwipsW = 864
lngDateLabelStartTwipsH = 288
lngDateLabelEndTwipsL = lngComboboxRef0TwipsL + lngComboboxRef0TwipsW +
(dblDateLabelMaxW + 1.6) * 1440
lngDateLabelEndTwipsT = lngComboboxRef0TwipsT
lngDateLabelEndTwipsW = 864
lngDateLabelEndTwipsH = 288
lngDateLabelRef0TwipsL = lngComboboxRef0TwipsL + lngComboboxRef0TwipsW +
0.5 * 1440
lngDateLabelRef0TwipsT = lngComboboxRef0TwipsT
lngDateLabelRef0TwipsW = dblDateLabelMaxW * 1440
lngDateLabelRef0TwipsH = 0.8 * VERTSPACING
lngNudgeDateLabelDown = 30
If intDateFields > 0 Then
  'Set up the four labels
  'Date Ranges
  Set ctl = CreateControl(strSearchForm, acLabel, , "lbl_DateRanges", ,
lngDateLabelDRTwipsL, lngDateLabelDRTwipsT)
  Call SetControlProperties(ctl, "lbl_DateRanges", 10, SEMIBOLD,
TEXTALIGNCENTER, lngDateLabelDRTwipsW, lngDateLabelDRTwipsH, "Date
Ranges", NORMALBACKSTYLE, , SHADOWED, , 2)
  'Field
  Set ctl = CreateControl(strSearchForm, acLabel, , "lbl_Field", ,
lngDateLabelFldTwipsL, lngDateLabelFldTwipsT + VERTSPACING)
  Call SetControlProperties(ctl, "lbl_Field", 8, SEMIBOLD,
TEXTALIGNCENTER, lngDateLabelFldTwipsW, lngDateLabelFldTwipsH, "Field",
NORMALBACKSTYLE, , SHADOWED, , 2)
  'Starting
  Set ctl = CreateControl(strSearchForm, acLabel, , "lbl_Starting", ,
lngDateLabelStartTwipsL, lngDateLabelStartTwipsT + VERTSPACING)
  Call SetControlProperties(ctl, "lbl_Starting", 8, SEMIBOLD,
TEXTALIGNCENTER, lngDateLabelStartTwipsW, lngDateLabelStartTwipsH,
"Starting", NORMALBACKSTYLE, , SHADOWED, , 2)
  'Ending
  Set ctl = CreateControl(strSearchForm, acLabel, , "lbl_Ending", ,
lngDateLabelEndTwipsL, lngDateLabelEndTwipsT + VERTSPACING)
  Call SetControlProperties(ctl, "lbl_Ending", 8, SEMIBOLD,
TEXTALIGNCENTER, lngDateLabelEndTwipsW, lngDateLabelEndTwipsH, "Ending",
NORMALBACKSTYLE, , SHADOWED, , 2)
  intJ = 0 'Keep track of jth date field
  For intI = 1 To intNonKeyFields
    If intFieldTypes(intI) = dbDate Then
      intJ = intJ + 1
      'Set up the label
      Set ctl = CreateControl(strSearchForm, acLabel, , "lbl_" &
strFieldNames(intI), , lngDateLabelRef0TwipsL, lngDateLabelRef0TwipsT +
(intJ + 1) * VERTSPACING + lngNudgeDateLabelDown)
      Call SetControlProperties(ctl, "lbl_" & strFieldNames(intI), 8,
NORMALWEIGHT, TEXTALIGNRIGHT, lngDateLabelRef0TwipsW,
lngDateLabelRef0TwipsH, strFieldNames(intI), , , , , 2)
      'Set up the date textboxes
      Set ctl = CreateControl(strSearchForm, acTextBox, , , ,
lngDateLabelStartTwipsL, lngDateLabelRef0TwipsT + (intJ + 1) * VERTSPACING)
      Call SetControlProperties(ctl, "txt" & strFieldNames(intI) &
"Start", 10, NORMALWEIGHT, TEXTALIGNLEFT, lngDateLabelStartTwipsW,
lngDateLabelRef0TwipsH)
      Set ctl = CreateControl(strSearchForm, acTextBox, , , ,
lngDateLabelEndTwipsL, lngDateLabelRef0TwipsT + (intJ + 1) * VERTSPACING)
      Call SetControlProperties(ctl, "txt" & strFieldNames(intI) &
"End", 10, NORMALWEIGHT, TEXTALIGNLEFT, lngDateLabelStartTwipsW,
lngDateLabelRef0TwipsH)
    End If
  Next intI
  Set ctl = Nothing
End If
'Set up the final two command buttons
'The bottom 1/2" was saved for them, so for 1/4" height command buttons
centered vertically:
'top = lngFormHeightTwips - 0.375 * 1440
lngCommandGoTwipsL = lngTitleTwipsL - 0.75 * 1440 + lngTitleTwipsW / 2
lngCommandGoTwipsT = lngFormHeightTwips - 0.375 * 1440
lngCommandGoTwipsW = lngCommandNewTwipsW
lngCommandGoTwipsH = lngCommandNewTwipsH
lngCommandExitTwipsL = lngTitleTwipsL + 0.75 * 1440 + lngTitleTwipsW / 2
lngCommandExitTwipsT = lngCommandGoTwipsT
lngCommandExitTwipsW = lngCommandNewTwipsW
lngCommandExitTwipsH = lngCommandNewTwipsH
Set ctl = CreateControl(strSearchForm, acCommandButton, acDetail, ,
"Go", lngCommandGoTwipsL, lngCommandGoTwipsT)
Call SetControlProperties(ctl, "cmdGo", 10, SEMIBOLD, ,
lngCommandGoTwipsW, lngCommandGoTwipsH, "Go")
Set ctl = CreateControl(strSearchForm, acCommandButton, acDetail, ,
"Exit", lngCommandExitTwipsL, lngCommandExitTwipsT)
Call SetControlProperties(ctl, "cmdExit", 10, SEMIBOLD, ,
lngCommandExitTwipsW, lngCommandExitTwipsH, "Exit")
Erase strFieldNames
Erase intFieldTypes
Erase intFieldActSize
DoCmd.Restore
DoCmd.Close acForm, strSearchForm, acSaveYes
DoEvents
Set MyDB = Nothing
End Sub

Private Sub cmdExit_Click()
DoCmd.Close acForm, Me.Name
End Sub

Private Function GetMaximumLabelSize(strNames() As String, intTypes() As
Integer, intMinimum As Integer, strType) As Integer
Dim lngI As Long
Dim intMax As Integer

intMax = intMinimum
For lngI = 1 To UBound(strNames())
  If strType = "Date" Then
    If intTypes(lngI) = dbDate Then
      If Len(strNames(lngI)) > intMax Then
        intMax = Len(strNames(lngI))
      End If
    End If
  Else
    If intTypes(lngI) <> dbDate Then
      If Len(strNames(lngI)) > intMax Then
        intMax = Len(strNames(lngI))
      End If
    End If
  End If
Next lngI
GetMaximumLabelSize = intMax
End Function

Private Function GetMaximumTextFieldSize(strTypes() As Integer,
strSizes() As Integer, intMinimum As Integer) As Integer
Dim lngI As Long
Dim intMax As Integer

intMax = intMinimum
For lngI = 1 To UBound(strTypes())
  If strTypes(lngI) = dbText Then
    If strSizes(lngI) > intMax Then
      intMax = strSizes(lngI)
    End If
  End If
Next lngI
GetMaximumTextFieldSize = intMax
End Function

Private Sub Form_Load()
Dim MyDB As Database
Dim tdf As TableDef
Dim strList As String

'Create the list of tables
strList = ""
Set MyDB = CurrentDb
For Each tdf In MyDB.TableDefs
  If Left(tdf.Name, 4) <> "MSys" Then
    strList = strList & tdf.Name & ";"
  End If
Next tdf
Set MyDB = Nothing
If Len(strList) > 0 Then strList = Left(strList, Len(strList) - 1)
cbxTableName.RowSourceType = "Value List"
cbxTableName.RowSource = strList
End Sub

Public Function IsFormOpen(strForm As String) As Boolean
Dim frmX As Form

IsFormOpen = False
For Each frmX In Forms
  If frmX.Name = strForm Then
    IsFormOpen = True
    Exit For
  End If
Next frmX
End Function

Private Sub SetControlProperties(ctl As Control, Optional strName As
String, Optional intFontSize As Integer, Optional intFontWeight As
Integer, Optional intTextAlign As Integer, Optional lngWidthTwips As
Long, Optional lngHeightTwips As Long, Optional strCaption As String,
Optional intBackStyle As Integer, Optional lngBackColor As Long,
Optional intSpecialEffect As Integer, Optional lngBorderColor As Long,
Optional intBorderWidth As Integer)
If Not IsMissing(strName) Then ctl.Properties("Name") = strName
If intFontSize <> 0 Then ctl.Properties("FontSize") = intFontSize
If intFontWeight <> 0 Then ctl.Properties("FontWeight") = intFontWeight
If intTextAlign <> 0 Then ctl.Properties("TextAlign") = intTextAlign
If lngHeightTwips <> 0 Then ctl.Properties("Height") = lngHeightTwips
If lngWidthTwips <> 0 Then ctl.Properties("Width") = lngWidthTwips
If strCaption <> "" Then ctl.Properties("Caption") = strCaption
If intBackStyle <> 0 Then ctl.Properties("BackStyle") = intBackStyle
If lngBackColor <> 0 Then ctl.Properties("BackColor") = lngBackColor
If intSpecialEffect <> 0 Then ctl.Properties("SpecialEffect") =
intSpecialEffect
If lngBorderColor <> 0 Then ctl.Properties("BorderColor") = lngBorderColor
If intBorderWidth <> 0 Then ctl.Properties("BorderWidth") = intBorderWidth
End Sub

James A. Fortune
MPAPoster@FortuneJames.com
David W. Fenton - 25 Feb 2007 01:53 GMT
> The idea of automatic reports comes from Czech relational DB
> system PC FAND. I just wonder why we don't have automatic reports
> in MS Access. :-/

The form wizard can create "automatic" reports. You can print a
table view, with lots of room for formatting if you want.

> BTW, I desperatly miss incremental search in MS Access, too. I had
> to create one form plus some supporting code to have thic
> functionality in my projects.

What is "incremental" search?

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 25 Feb 2007 07:53 GMT
Users edit recordsets based on queries. I never give user an option to edit
a table in table view. I'd like automatic report based on current form's
recordset. Imagine recordset for the following form:

http://img165.imagevenue.com/img.php?image=09782__IncrementalSearch_481lo.jpg

Vlado

>> The idea of automatic reports comes from Czech relational DB
>> system PC FAND. I just wonder why we don't have automatic reports
[quoted text clipped - 8 lines]
>
> What is "incremental" search?
David W. Fenton - 26 Feb 2007 00:05 GMT
> Users edit recordsets based on queries. I never give user an
> option to edit a table in table view. I'd like automatic report
> based on current form's recordset.

You can create a datasheet form that replicates the table view and
gives you the ability to do all sorts of additional things
(everything you can do in a form).

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 25 Feb 2007 09:35 GMT
There's some info about Incremental find @ Wikipedia:
http://en.wikipedia.org/wiki/Incremental_find.

Database incremental search:
http://www.usabilityfirst.com/glossary/term_918.txl
http://www.codeproject.com/vb/net/Incremental_search.asp

You could fine more about incremental search in Google:
http://www.google.co.uk/search?hl=en&q=what+is+%22incremental+search%22&meta=

Also see
http://img165.imagevenue.com/img.php?image=09782__IncrementalSearch_481lo.jpg.

I have to try Pinnacle Studio or Windows Screen Recorder so that I can
create some videos...

Vlado

>> The idea of automatic reports comes from Czech relational DB
>> system PC FAND. I just wonder why we don't have automatic reports
[quoted text clipped - 8 lines]
>
> What is "incremental" search?
Tony Toews [MVP] - 25 Feb 2007 19:24 GMT
>As to me, I don't understand why MS has added those Create... functions to
>Access.

MS needed those tools themselves for creating forms and reports using
the wizards.   So they just made those available to the public.

Tony
Signature

Tony Toews, Microsoft Access MVP
  Please respond only in the newsgroups so that others can
read the entire thread of messages.
  Microsoft Access Links, Hints, Tips & Accounting Systems at
http://www.granite.ab.ca/accsmstr.htm

Domac - 23 Feb 2007 11:48 GMT
Is there any way to create form and controls, wich is compatible with MDE?
Douglas J. Steele - 23 Feb 2007 12:51 GMT
To be honest, it's very unusual to be creating forms and controls
programmatically in an application.

Why not explain why you feel it's necessary, and perhaps someone can suggest
an alternative?

Signature

Doug Steele, Microsoft Access MVP
http://I.Am/DougSteele
(no e-mails, please!)

> Is there any way to create form and controls, wich is compatible with MDE?
Domac - 23 Feb 2007 14:26 GMT
Here is situation :

Something about applivation : Application is developed for purpose of
manufacture menagment.
We are currently designing a module for check-list functionality, wich
consists of serie of properties and each of them is different data-type and
has different type of entry.
In practise , it looks like this:

   PropertyName                          PropertyDataType
PropertyControl
   WIDTH                                    NUMBER                TEXTBOX
   HEIGHT                                   NUMBER                TEXTBOX
   LENGHT                                  NUMBER                TEXTBOX
   CHIPBOARD_DECOR           TEXT                       COMBOBOX
   CHIPBOARD_THICKNES     NUMBER                COMBOBOX

In real situation we have from 30 to 100 properties per product.
Idea is to enable design department to define properies and list of values
(for combobox properties) for each of product entity.
Different set of key properties is for wardrobe, table , laboratory table,
office closet.
So when sales personal create demand towards manufacturing department, they
must fill check-list to define each of key properties for product entity.
What is my problem?
I have to dynamically define a form depending on product entity user
selected, and i have achive it , but it must be compatible with MDE
deployment.
My solution is based on 'CreateForm' and 'CreateControl' functions, works
great ,each time i generate frmSubForm and display it throught SubForm
control.
Back few years, when I developed in VB6 i had comfort to dinamically create
controls from code using load function (if my memory works), in access i can
achive it only in design view using 'CreateControl' function.
Is there alternative ?
I have another idea, but I would like to avoide playing with visible
property.

Here is my code:

<CODE START>
On Error Resume Next

       SubStavke.SourceObject = "frmProdajaPLIzradaSubPrazno"
       DoCmd.DeleteObject acForm, "frmProdajaPLIzradaSub"

Dim frmTmp As Form

'Podesi svojstva forme u ovoj fazi
 Set frmTmp = CreateForm

     frmTmp.Section(acDetail).BackColor = Me.Section(acDetail).BackColor

Dim rstGrupe As DAO.Recordset

Dim ctlLabels() As Label
Dim ctlCombos() As ComboBox
Dim ctlTexts() As TextBox
Dim ctlLines() As Line

Dim lngLabelsCount As Long
Dim lngCombosCount As Long
Dim lngTextsCount As Long
Dim lngLinesCount As Long

Dim lngRazmak As Long 'Izmeðu kontrola!
Dim lngVertikalnoStanje As Long

Dim lngGrupeXOffset As Long
Dim lngSvojstvaXOffset As Long
Dim lngSvojstvaNazivWidth As Long

'Postavi uvlaku po x-u
lngGrupeXOffset = 500
lngSvojstvaXOffset = 500

'Postavi dimenzije
lngSvojstvaNazivWidth = 2500

       'Vertikalni razmak izmeðu kontrola!
       lngRazmak = 100

Dim strSvojstvaGrupe As String

strSvojstvaGrupe = "SELECT ProdajaPLSvojstvaGrupe_INT.SGrupaRb,
ProdajaPLSvojstvaGrupe_INT.SGrupaNaziv ,SGrupaId " & _
                 "FROM ProdajaPLSvojstvaGrupe_INT " & _
                 "GROUP BY ProdajaPLSvojstvaGrupe_INT.SGrupaRb,
ProdajaPLSvojstvaGrupe_INT.SGrupaNaziv,SGrupaId " & _
                 "ORDER BY ProdajaPLSvojstvaGrupe_INT.SGrupaRb;"

Set rstGrupe = CurrentDb.OpenRecordset(strSvojstvaGrupe, dbOpenSnapshot)

       'Odma n a prvu grupu u listi
       rstGrupe.MoveFirst

'Sve kreiraj pod generiranim imenom tipa "From1"

While Not rstGrupe.EOF = True

      ReDim Preserve ctlLabels(lngLabelsCount)
      ReDim Preserve ctlLines(lngLinesCount)
      'Kreiraj kapcije za grupe svojstava
      Set ctlLabels(lngLabelsCount) = CreateControl(frmTmp.Name, acLabel,
acDetail, , , lngGrupeXOffset, lngVertikalnoStanje, 1000, 300)
      Set ctlLines(lngLinesCount) = CreateControl(frmTmp.Name, acLine,
acDetail, , , lngGrupeXOffset, lngVertikalnoStanje, 1000, 300)

       'Svojstva labela!
       ctlLabels(lngLabelsCount).Caption = rstGrupe!SGrupaNaziv
       ctlLabels(lngLabelsCount).FontName = "Arial CE"
       ctlLabels(lngLabelsCount).FontSize = 9
       ctlLabels(lngLabelsCount).ForeColor = 16776960
       ctlLabels(lngLabelsCount).FontBold = 800
       ctlLabels(lngLabelsCount).SizeToFit
       'Linija
       ctlLines(lngLinesCount).Top = ctlLabels(lngLabelsCount).Top +
ctlLabels(lngLabelsCount).Height
       ctlLines(lngLinesCount).Left = ctlLabels(lngLabelsCount).Left
       ctlLines(lngLinesCount).Width = 5000
       ctlLines(lngLinesCount).Height = 0
       ctlLines(lngLinesCount).SpecialEffect = 2
       'Pomakni brojaèe!
       lngVertikalnoStanje = lngVertikalnoStanje + lngRazmak +
ctlLabels(lngLabelsCount).Height
       lngLabelsCount = lngLabelsCount + 1
       lngLinesCount = lngLinesCount + 1
       'Pobroji svojstva za grupu sortirano po rb unosa!
       Dim strSvojstvaZaGrupu As String
       Dim rstSvojstvaZaGrupu As DAO.Recordset

       strSvojstvaZaGrupu = "SELECT * FROM ProdajaPLSvojstva_INT WHERE
SvojstvoGrupaId=" & rstGrupe!SGrupaId & " ORDER BY SvojstvoRb"
       Set rstSvojstvaZaGrupu = CurrentDb.OpenRecordset(strSvojstvaZaGrupu,
dbOpenSnapshot)

           'Træi na prvi!
           rstSvojstvaZaGrupu.MoveFirst

           While Not rstSvojstvaZaGrupu.EOF = True
                           'NASLOVI SVOJSTAVA
                           'Prvo label zatim kontrola za unos!
                            ReDim Preserve ctlLabels(lngLabelsCount)

                           'Kreiraj kapcije za grupe svojstava
                           Set ctlLabels(lngLabelsCount) =
CreateControl(frmTmp.Name, acLabel, acDetail, , , lngSvojstvaXOffset,
lngVertikalnoStanje, lngSvojstvaNazivWidth, 300)

                            'Svojstva labela!
                            ctlLabels(lngLabelsCount).Caption =
rstSvojstvaZaGrupu!SvojstvoNaziv & " :"
                            ctlLabels(lngLabelsCount).FontName = "Arial CE"
                            ctlLabels(lngLabelsCount).FontSize = 9
                            ctlLabels(lngLabelsCount).ForeColor = RGB(255,
255, 255)
                            ctlLabels(lngLabelsCount).FontBold = 400
                            'ctlLabels(lngLabelsCount).SizeToFit
                            ctlLabels(lngLabelsCount).TextAlign = 3 'Right

                            'Pomakni brojaèe!
                            lngLabelsCount = lngLabelsCount + 1

                            'Kontrole za unos Select case
                            Select Case
(rstSvojstvaZaGrupu!SvojstvoUnosVrsta)

                               Case "UNOS"
                                   'Textboxovi!
                                   ReDim Preserve ctlTexts(lngTextsCount)

                                   Set ctlTexts(lngTextsCount) =
CreateControl(frmTmp.Name, acTextBox, acDetail, , , lngSvojstvaXOffset,
lngVertikalnoStanje, 1500, 300)
                                   ctlTexts(lngTextsCount).Left =
ctlLabels(lngLabelsCount - 1).Left + ctlLabels(lngLabelsCount - 1).Width +
50
                                   ctlTexts(lngTextsCount).Width = 1500
                                   ctlTexts(lngTextsCount).FontName =
"Courier New CE"
                                   ctlTexts(lngTextsCount).FontSize = 9
                                   ctlTexts(lngTextsCount).Name =
rstSvojstvaZaGrupu!SvojstvoNaziv

                                   Select Case
(rstSvojstvaZaGrupu!SvojstvoTip)
                                       Case "BROJ"
                                           ctlTexts(lngTextsCount).DefaultValue
= 0
                                           ctlTexts(lngTextsCount).Format =
"Standard"

                                       Case "TEKST"
                                           ctlTexts(lngTextsCount).DefaultValue
= ""
                                           ctlTexts(lngTextsCount).Format =
""

                                   End Select

                                   lngTextsCount = lngTextsCount + 1

                               Case "LISTA"

                                   'Textboxovi!
                                   ReDim Preserve ctlCombos(lngCombosCount)

                                   Set ctlCombos(lngCombosCount) =
CreateControl(frmTmp.Name, acComboBox, acDetail, , , lngSvojstvaXOffset,
lngVertikalnoStanje, 2000, 300)
                                   ctlCombos(lngCombosCount).Left =
ctlLabels(lngLabelsCount - 1).Left + ctlLabels(lngLabelsCount - 1).Width +
50
                                   ctlCombos(lngCombosCount).Width = 2000
                                   ctlCombos(lngCombosCount).FontName =
"Courier New CE"
                                   ctlCombos(lngCombosCount).FontSize = 9
                                   ctlCombos(lngCombosCount).Name =
rstSvojstvaZaGrupu!SvojstvoNaziv
                                   ctlCombos(lngCombosCount).RowSourceType
= "Table/Query"
                                   ctlCombos(lngCombosCount).RowSource =
"SELECT Vrijednost FROM ProdajaPLSvojstvaListe_INT " & _
                                                                         "WHERE
SvojstvoId=" & rstSvojstvaZaGrupu!SvojstvoId & " " & _
                                                                         "ORDER
BY ItemId"

                                   ctlCombos(lngCombosCount).LimitToList =
True

                                   lngCombosCount = lngCombosCount + 1

                            End Select

                   '---------------------------------------------------------------------------------------------------------
                   lngVertikalnoStanje = lngVertikalnoStanje + lngRazmak +
ctlLabels(lngLabelsCount - 1).Height
                   rstSvojstvaZaGrupu.MoveNext

           Wend

       '----------------------------------------------------------------------

       rstGrupe.MoveNext

Wend
'Finalne korekcije!

frmTmp.Section(acDetail).Height = frmTmp.Section(acDetail).Height + 200
frmTmp.DividingLines = False
frmTmp.NavigationButtons = False
frmTmp.RecordSelectors = False
frmTmp.ScrollBars = 2

Dim strFrmTmpName As String

   strFrmTmpName = frmTmp.Name

DoCmd.Save acForm, frmTmp.Name
DoCmd.Close acForm, frmTmp.Name, acSaveYes
DoCmd.Rename "frmProdajaPLIzradaSub", acForm, strFrmTmpName

<CODE END>

> To be honest, it's very unusual to be creating forms and controls
> programmatically in an application.
[quoted text clipped - 4 lines]
>> Is there any way to create form and controls, wich is compatible with
>> MDE?
Douglas J. Steele - 23 Feb 2007 21:37 GMT
The most common solution is to create a form that has the maximum number of
textboxes that you'd need, and to toggle their visibility properties.

Signature

Doug Steele, Microsoft Access MVP
http://I.Am/DougSteele
(no private e-mails, please)

> Here is situation :
>
[quoted text clipped - 272 lines]
>>> Is there any way to create form and controls, wich is compatible with
>>> MDE?
Vladimír Cvajniga - 23 Feb 2007 14:56 GMT
IMHO, MS Acces limits are too low. 1000 objects and 2GB MDB file size is not
enough for large projects (nor programs, neither data storage!!!). Dynamic
objects (forms, reports, modules) or objects stored in a separate MDB could
solve this problem.

What I'm missing is a possibility to call a sub-project from the main
project. Main project should store common objects, functions & procedures,
sub-projects should store only its specific functions (procs, objects,
etc.).

Long time ago I was programming in Czech relation database system called PC
FAND. IMO, it was best DOS DB system ever. It's best feature was that it was
declaration-based. And it was possible to create REALLY HUGE structured
projects without any problem... well except RAM & HD limitations.

Vlado

> To be honest, it's very unusual to be creating forms and controls
> programmatically in an application.
[quoted text clipped - 4 lines]
>> Is there any way to create form and controls, wich is compatible with
>> MDE?
storrboy - 23 Feb 2007 15:13 GMT
> IMHO, MS Acces limits are too low. 1000 objects and 2GB MDB file size is not
> enough for large projects (nor programs, neither data storage!!!).

  Point me to a program (games don't count) that is over 2Gb in size
and
  intended to be a desktop application. If you need more than 1000
objects
  in one database file, you really shouldn't be designing it.

>Dynamic
> objects (forms, reports, modules) or objects stored in a separate MDB could
> solve this problem.

  You just disputed your first argument.

> What I'm missing is a possibility to call a sub-project from the main
> project. Main project should store common objects, functions & procedures,
> sub-projects should store only its specific functions (procs, objects,
> etc.).

  Because as others have pointed out, you haven't spent much time
reading
  or planning.
Vladimír Cvajniga - 23 Feb 2007 15:49 GMT
Have you heard about accountings? Earnings? Properties? Complete information
systems that include oll of those plus many many more? :O

Or do you play games only? :D

Vlado

>> IMHO, MS Acces limits are too low. 1000 objects and 2GB MDB file size is
>> not
[quoted text clipped - 22 lines]
> reading
>   or planning.
storrboy - 23 Feb 2007 16:08 GMT
> Have you heard about accountings? Earnings? Properties? Complete information
> systems that include oll of those plus many many more? :O
[quoted text clipped - 29 lines]
> > reading
> >   or planning.

Or perhaps the designers of those upsize to something other than a
desktop application. Ask Microsoft, EBay or Indigo if they run off of
Access. There are bigger hammers for bigger jobs. Don't complain when
your 5 oz ball-peen dosen't drive a 12" stake.
Vladimír Cvajniga - 23 Feb 2007 20:33 GMT
I'm affraid you don't know what you're talking about... Sry, I must quit
that discussion.
V.

On Feb 23, 10:49 am, Vladimír Cvajniga <nos...@thank.you> wrote:
> Have you heard about accountings? Earnings? Properties? Complete
> information
[quoted text clipped - 34 lines]
> > reading
> >   or planning.

Or perhaps the designers of those upsize to something other than a
desktop application. Ask Microsoft, EBay or Indigo if they run off of
Access. There are bigger hammers for bigger jobs. Don't complain when
your 5 oz ball-peen dosen't drive a 12" stake.
David W. Fenton - 23 Feb 2007 23:07 GMT
> IMHO, MS Acces limits are too low. 1000 objects and 2GB MDB file
> size is not enough for large projects (nor programs, neither data
> storage!!!). Dynamic objects (forms, reports, modules) or objects
> stored in a separate MDB could solve this problem.

Or judicious use of forms and reports in a single Access project.

If you're really running into a problem like that, you can still use
library databases with your "extra" objects in those. It does cause
some issues for databound objects and can conceivable lead to
concurrency issues if you don't manage things correctly.

But I just don't see that the limits are problematic. I've never had
a front end over 50MBs (including embedded graphics!) nor one with
the number of objects that would come close to bumping up against
the limits.

Perhaps you're simply not re-using your forms and reports and
setting recordsources at runtime? If you do what lots of Access
novices do, and save a copy of a report for every single set of
criteria, you'll end up with way too many reports. I have plenty of
objects in my apps that dynamically change the recordsource at
runtime. Some even base themselves on different tables, depending on
the recordsource. And some hide/show/resize/move controls depending
on the context. I do this because I hate having two very similar
forms/reports that do slightly different things. I hate having to
maintain multiple versions of the same object, so instead, I make it
dynamic.

Perhaps that approach would relieve you of the need to have a
generic form.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 24 Feb 2007 09:57 GMT
In fact, as to front-end file size, there no storage problem... except 1000
objects limit!
But 2GB for data storage is too low... :-(

Also, I'd like to store common functions in main project where I'd create an
interface for calling sub-projects.

My A97 largest project so far is nearly 50MB (FE), but it contains ~800
class-module objects (forms, reports & code modules).

I re-use objects (as I did years ago in PC FAND), ei. I don't use different
form/report for different recordsets... I couln't live without that. ;-)
And without that I should have exceeded Access limits long time ago.

There are many "dynamics" in my projects. A few weeks ago I've started a new
structured project and it surely will exceed current Access limits.

Vlado

>> IMHO, MS Acces limits are too low. 1000 objects and 2GB MDB file
>> size is not enough for large projects (nor programs, neither data
[quoted text clipped - 27 lines]
> Perhaps that approach would relieve you of the need to have a
> generic form.
David W. Fenton - 25 Feb 2007 01:59 GMT
> In fact, as to front-end file size, there no storage problem...
> except 1000 objects limit!

I've never gotten anywhere close to that in any of my projects.

> But 2GB for data storage is too low... :-(

Then don't use Jet to store your data -- use SQL Server or some
other server database.

> Also, I'd like to store common functions in main project where I'd
> create an interface for calling sub-projects.

Not sure what you mean, but you can do this quite with a library
database.

> My A97 largest project so far is nearly 50MB (FE), but it contains
> ~800 class-module objects (forms, reports & code modules).

Do you actually have code in all the forms/reports that have
modules? You might want to uncheck the HasModule property of
forms/reports that have no code. Dunno if this will reduce your
object count or not, but it's there.

> I re-use objects (as I did years ago in PC FAND), ei. I don't use
> different form/report for different recordsets... I couln't live
[quoted text clipped - 4 lines]
> started a new structured project and it surely will exceed current
> Access limits.

I think you *must* be doing something wrong as I can't conceive of a
project that needs that many objects.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 25 Feb 2007 10:18 GMT
There are plenty of forms/reports which have HasModule set to FALSE.

Example to call a sub-project in PC FAND:
Call(SubProject)
or
Call(SubProject,SpecificProcedureOrFunction)
The second one is simply SUPERB!!! In Access: I think it can be done via
reference to an appropriate MDE, but I think you must specify all data
connections to each sub-projects' databases from main project :-(.

In MS Access terms:
- I have a main project (Main.mde) for commonc functions & a dashboard
- I have several sub-projects (Sub1.mde, Sub2.mde, Sub3.mde) for specific
tasks
- I'd like to use Call "Sub1.mde" (imagine some kind of dashboard) from
within Main.mde; any sub-project can recognize & use all functions declared
in Main.mde... as well as tables (data connections), forms, reports, etc.
...

> I've never gotten anywhere close to that in any of my projects.
Have you ever programmed accountings & taxes & earnings & properties (&
more)? Can you imagine all of these in one project?

Vlado

>> In fact, as to front-end file size, there no storage problem...
>> except 1000 objects limit!
[quoted text clipped - 31 lines]
> I think you *must* be doing something wrong as I can't conceive of a
> project that needs that many objects.
David W. Fenton - 26 Feb 2007 00:09 GMT
> Example to call a sub-project in PC FAND:
> Call(SubProject)
[quoted text clipped - 4 lines]
> specify all data connections to each sub-projects' databases from
> main project :-(.

No, actually, you don't need to do that at all. I call the Zoom
wizard in my apps (the same one that is called with Shift F2) and I
do it with no reference set using Application.Run.

> In MS Access terms:
> - I have a main project (Main.mde) for commonc functions & a
[quoted text clipped - 4 lines]
> functions declared in Main.mde... as well as tables (data
> connections), forms, reports, etc.

Investigate Application.Run.

>> I've never gotten anywhere close to that in any of my projects.
> Have you ever programmed accountings & taxes & earnings &
> properties (& more)? Can you imagine all of these in one project?

I've dealt with parts of that and still can't imagine how you'd need
that mean objects.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 26 Feb 2007 10:26 GMT
Project scenario (based on file system, ie. sub-project is in an appropriate
sub-dir, but it can be re-directed through so called Catalog; as it works in
PC FAND !!!):
http://img7.imagevenue.com/img.php?image=84348_Project_122_146lo.jpg

If MS Access had this functionality I wouldn't need ANY references to
library databases... neither I would need ANY add-in!

I think that Application.Run can't do anything like that because it runs as
a separate task, ie. it can't see superior functions in main project.

Vlado

P.S. In PC FAND you can call a simple procedure in any sub-project from main
project! When you Call(SubProject,Procedure) it opens the sub-project. But
it runs only a bit of it's code.
Unfortunatelly, PC FAND has no Windows version. If PC FAND was transformed
for Windows I would never try MS Access.

>> Example to call a sub-project in PC FAND:
>> Call(SubProject)
[quoted text clipped - 26 lines]
> I've dealt with parts of that and still can't imagine how you'd need
> that mean objects.
Vladimír Cvajniga - 26 Feb 2007 11:02 GMT
I think I was right. I've tried Application.Run according to MS Access 2002
help. Application runs as a separate task. :-(

Vlado

> Project scenario (based on file system, ie. sub-project is in an
> appropriate sub-dir, but it can be re-directed through so called Catalog;
[quoted text clipped - 45 lines]
>> I've dealt with parts of that and still can't imagine how you'd need
>> that mean objects.
David W. Fenton - 26 Feb 2007 19:29 GMT
> I think I was right. I've tried Application.Run according to MS
> Access 2002 help. Application runs as a separate task.

Not if you're running a wizard/library database. For instance, to
call the Zoom box from the Utility wizard, you call this:

 Application.Run("UTILITY.BuilderZoom", strObjName, _
    strCtlName, strCurrValue)

(with appropriate values for the arguments, of course).

It doesn't run out of process, but within the current instance of
Access. Of course, you are also passing the data in and the control
names, and internally the code is doing what is necessary to update
the control you called it from.

But it *definitely* works. In fact, it's how Access launches its
wizards (which are really just MDEs written in VBA and Access).

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 26 Feb 2007 20:43 GMT
I'll have to check and see how I can handle database access. I think I
must define connections for all tables in main project instead of handling
them seperatly in "sub-project" FE DBs. I have tried to call a public sub in
a referenced MDB (sub-project) to run sub-project's main form but I've got
problems with data connections and with file system based operations. It
seems that all necessary files in sub-project's directory (external EXEs,
local DBs, etc.) should be moved to main project directory... due to CurDir,
CurrentDb.Name, and similar functions.
   In other words: sub-project runs OK if it's run separately. From main
project I can't easily call a public function  in a referenced MDB to run
the sub-project. It seems it's necessary to make many changes in sub-project
so that it could be run from main project.

Main project: c:\Documents and Settings\Vlado\Dokumenty\Dashboard.mdb.
Sub-project (FE): c:\Documents and Settings\Vlado\Dokumenty\_Moje
projekty\KEO\EO11.mdb
Sub-project FE handles two main databases, one on MySQL-server, another one
is BE MDB for EO11's data. I use several temporary databases for different
tasks which reside in EO11.mdb's dir ()c:\Documents and
Settings\Vlado\Dokumenty\_Moje projekty\KEO\.

EO11.mdb run fine if it's run separately.

1) I have added a public procedure to one of sub-project's modules:
Public Sub RunProject()
  DoCmd.OpenForm "frm_Login"
End Sub

... and a function for testing:
Public Function fncCurrentDBname()
  MsgBox CurrentDb.Name
End Function

2) I have created a new "main" project and added a reference to a
sub-project MDB.

3) I have created a "dashboard" form in main project with two buttons:
Private Sub btnEO11_Click()
  EO11.modMain.RunProject
End Sub

It should open EO11.mdb's (there are some functions that work with
CurrentDB.Name on a start-up). See below.

Private Sub btnTest_Click()
  EO11.modMain.fncCurrentDBname
End Sub

When I click btnTest I get a message-box with the following path:
c:\Documents and Settings\Vlado\Dokumenty\Dashboard.mdb

It's a path of main project MDB! But I'd expect
c:\Documents and Settings\Vlado\Dokumenty\_Moje projekty\KEO\EO11.mdb

So... I'm affraid I can't use this scenario. I may be doing something wrong.
But I can't imagine that should have to re-programm all file-system based
stuff. :O

And more... when I click btnEO11 I get run-time error 2485 concerning
menubar talking something about macro: Microsoft Access couldn't find macro
HobbyMenu.
- HobbyMenu is EO11's menubar.
- I never use macros.

Don't understand what I'm doing wrong. But I'm sure I can't use any
file-system-based functions in sub-project.

Vlado

P.S. Thenk you for your time.

>> I think I was right. I've tried Application.Run according to MS
>> Access 2002 help. Application runs as a separate task.
[quoted text clipped - 14 lines]
> But it *definitely* works. In fact, it's how Access launches its
> wizards (which are really just MDEs written in VBA and Access).
David W. Fenton - 27 Feb 2007 18:50 GMT
> So... I'm affraid I can't use this scenario. I may be doing
> something wrong.

You can set the recordsource of the form loaded from a library
database at runtime, using the "IN 'database.mdb'" clause to set
which database the tables are drawn from. You would do this in the
form's OnOpen event. You wouldn't have any linked tables in your
library database at all.

I suggest that you attempt to acquire the Access Developers Handbook
which covers the whole process of using library databases in great
detail.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 26 Feb 2007 11:39 GMT
One more thing:

When a sub-project is called both main project & sub-project should run as
one task. They should perform as one joined project! This is what you might
not understand. PC FAND's philosophy is a bit diffrent from MS Access's one.
:-)

Vlado

> Project scenario (based on file system, ie. sub-project is in an
> appropriate sub-dir, but it can be re-directed through so called Catalog;
[quoted text clipped - 45 lines]
>> I've dealt with parts of that and still can't imagine how you'd need
>> that mean objects.
David W. Fenton - 26 Feb 2007 19:30 GMT
> When a sub-project is called both main project & sub-project
> should run as one task.

When Access uses its built-in wizards and when I call the ZoomBox
function in the Utility wizard, it does not run out of process. Same
for when you create a reference to a library database.

So, I really don't know what you're talking about.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 24 Feb 2007 13:28 GMT
How do I use "library databases"? Never heard of this function.

Vlado

>> IMHO, MS Acces limits are too low. 1000 objects and 2GB MDB file
>> size is not enough for large projects (nor programs, neither data
[quoted text clipped - 27 lines]
> Perhaps that approach would relieve you of the need to have a
> generic form.
storrboy - 24 Feb 2007 16:49 GMT
> How do I use "library databases"? Never heard of this function.

That would be one of the games some of us play.
The idea is to use a database like a DLL, OCX or addin.

Take a bunch of the DB objects you use often and put them all together
in a database of thier own. Reference this new one in other projects
and use it's public objects and functions. It takes a bit of planning
but it can cut the size of a project and make your most used stuff
more portable. I believe one drawback is that both dbs must be in the
same format - mdb or mde. I don't think you can mix them.
Vladimír Cvajniga - 24 Feb 2007 18:41 GMT
I'm affraid you're wrong. MDBs can't be handled as DLLs or OCXs. I have no
experience with add-ins... but I think add-in would not meet my needs.

Vlado

On Feb 24, 8:28 am, Vladimír Cvajniga <nos...@thank.you> wrote:
> How do I use "library databases"? Never heard of this function.

That would be one of the games some of us play.
The idea is to use a database like a DLL, OCX or addin.

Take a bunch of the DB objects you use often and put them all together
in a database of thier own. Reference this new one in other projects
and use it's public objects and functions. It takes a bit of planning
but it can cut the size of a project and make your most used stuff
more portable. I believe one drawback is that both dbs must be in the
same format - mdb or mde. I don't think you can mix them.
Vladimír Cvajniga - 24 Feb 2007 19:00 GMT
I have tried to reference to an MDB and I will test some tricks ASAP.
TYVM for the idea! It's new to me - haven't read about it in any Access
book. There are many restrictions when referencing to an MDB (MDE?) but it
should help a little. It will really need some planning...

Vlado
> I'm affraid you're wrong. MDBs can't be handled as DLLs or OCXs. I have no
> experience with add-ins... but I think add-in would not meet my needs.
[quoted text clipped - 13 lines]
> more portable. I believe one drawback is that both dbs must be in the
> same format - mdb or mde. I don't think you can mix them.
storrboy - 24 Feb 2007 23:26 GMT
> I'm affraid you're wrong. MDBs can't be handled as DLLs or OCXs. I have no
> experience with add-ins... but I think add-in would not meet my needs.
[quoted text clipped - 14 lines]
> more portable. I believe one drawback is that both dbs must be in the
> same format - mdb or mde. I don't think you can mix them.

Put some public functions in a DB, create a refernce in another and
call those functions. The comparison was in setting the reference and
using it's contents, not in specific usages.
Vladimír Cvajniga - 25 Feb 2007 11:35 GMT
Will surely try referencing! TYVM for driving me right way.

Vlado

On Feb 24, 1:41 pm, Vladimír Cvajniga <nos...@thank.you> wrote:
> I'm affraid you're wrong. MDBs can't be handled as DLLs or OCXs. I have no
> experience with add-ins... but I think add-in would not meet my needs.
[quoted text clipped - 15 lines]
> more portable. I believe one drawback is that both dbs must be in the
> same format - mdb or mde. I don't think you can mix them.

Put some public functions in a DB, create a refernce in another and
call those functions. The comparison was in setting the reference and
using it's contents, not in specific usages.
David W. Fenton - 25 Feb 2007 02:01 GMT
> I'm affraid you're wrong. MDBs can't be handled as DLLs or OCXs. I
> have no experience with add-ins... but I think add-in would not
> meet my needs.

No, you're wrong. Like a DLL, you can use a library MDB/MDE as a
library of functions that can be called from another project by
setting a reference to it.

In regard to OCX's (or ActiveX controls), the comparison is not
quite so close, but you can have forms and reports in a library
database and use them from a database that has a reference to the
library database (or just calls the library databse directly). The
Access wizards are delivered in this format and the forms you see
onscreen when running wizards are not stored in your own MDB.

The Access Developers Handbook has extensive coverage of how to do
this kind of thing.

Signature

David W. Fenton                  http://www.dfenton.com/
usenet at dfenton dot com    http://www.dfenton.com/DFA/

Vladimír Cvajniga - 25 Feb 2007 11:33 GMT
TYVM for your respond. I'll try to get The Access Developers Handbook. And
I'll try some referencing to see how it works. I'm affraid it will not cover
all my needs but I'd better try.
IMHO, all the developers' stuff (basic & advanced) should be a part of MS
Access Help system! :-/

Vlado

>> I'm affraid you're wrong. MDBs can't be handled as DLLs or OCXs. I
>> have no experience with add-ins... but I think add-in would not
[quoted text clipped - 13 lines]
> The Access Developers Handbook has extensive coverage of how to do
> this kind of thing.
Tony Toews [MVP] - 25 Feb 2007 19:26 GMT
>How do I use "library databases"? Never heard of this function.

See my Add-in Tips, Hints and Gotchas page at
http://www.granite.ab.ca/access/addins.htm

Tony
Signature

Tony Toews, Microsoft Access MVP
  Please respond only in the newsgroups so that others can
read the entire thread of messages.
  Microsoft Access Links, Hints, Tips & Accounting Systems at
http://www.granite.ab.ca/accsmstr.htm

 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.