Avatar billede zeon_rm Nybegynder
02. oktober 2001 - 10:24 Der er 19 kommentarer og
2 løsninger

Type MisMatch Error 13...Haster!!

ok jeg er ved at blive lettere sindssyg her.

Jeg har 2 projekter kørende det ene er mit test projekt, hvor jeg sidder og får alt det jeg laver til at virke. Det andet projekt er mit egentlige projekt. Nu er det sådan at jeg har fået lavet en Print funktion over i mit Test projekt som printer et Datagrid ud, og den virker helt fint der. Nu har jeg så prøvet at ligge den over i mit egentlige projekt, og så får jeg en Type Mismatch fejl??? Jeg syntes snart at jeg har kontrolleret alt uden resultat...Nogen der har en ide om hvad det er der foregår??

Alle forslag er velkommende og hvis i vil se kode må i sige til..:)

/Zeon_rm
Avatar billede jelzin101 Praktikant
02. oktober 2001 - 10:30 #1
ummidelbart lyder det som om du prøver at gøre noget med en variabel som du ikke kan.... prøv at tjekke alle typerne igennem.
Avatar billede jelzin101 Praktikant
02. oktober 2001 - 10:30 #2
men prøv at smide kode.
Avatar billede jelzin101 Praktikant
02. oktober 2001 - 10:34 #3
Avatar billede zeon_rm Nybegynder
02. oktober 2001 - 11:03 #4
Det der er mærkligt er at det virker i det ene projekt men ikke i det andet...

------kode-----
Private Sub Command1_Click()
Call PrintGrid(Datagrid) <<--her opstår problemet. Ved debug skriver den Datagrid =\"100001\"
End Sub

------ny kode-----
Sub PrintGrid(dgdSource As Datagrid, _
              Optional blnUseGridFont As Boolean = True, _
              Optional blnUseGridFormatting As Boolean = True)

  \' Grid-related variables
  Dim intCol As Integer, lngRow As Long, _
      intTotalCols As Integer, lngTotalRows As Long, _
      sngCellWidth As Single, sngCellHeight As Single, _
      sngGridWidth As Single, sngCellPadding As Single, _
      strCellContents() As String
     
  \' Printer-related variables
  Dim sngPositionX As Single, sngPositionY As Single, _
      sngMarginLeft As Single, sngMarginRight As Single, _
      sngMarginTop As Single, sngMarginBottom As Single, _
      sngRealPrinterWidth As Single, sngRealPrinterHeight As Single, _
      fntDefaultFont As StdFont, blnNewPage As Boolean, _
      intPageNumber As Integer, strPrintDate As String, _
      sngHeaderTop As Single, sngHeaderHeight As Single, _
      sngTextWidth() As Single, sngTextHeight() As Single, _
      sngColumnWidth() As Single

  \' Data-related variables
  Dim objDataSource As Object, rstData As Recordset
     
  \' Set printer defaults
  sngCellPadding = 36
  sngMarginLeft = 720
  sngMarginRight = 720
  sngMarginTop = 360
  sngMarginBottom = 360
  Printer.ScaleLeft = -sngMarginLeft
  Printer.ScaleTop = -sngMarginTop
  sngRealPrinterWidth = Printer.ScaleWidth - sngMarginLeft - sngMarginRight
  sngRealPrinterHeight = Printer.ScaleHeight - sngMarginTop - sngMarginBottom
  blnNewPage = True
  strPrintDate = CStr(Now)
  Set fntDefaultFont = New StdFont
  fntDefaultFont.Name = \"Times\"
  fntDefaultFont.Size = 8
  Set Printer.Font = fntDefaultFont
     
  \' Get data source (use clone for the recordset so that the DataGrid won\'t be
  \' affected by traversing it)
  Set objDataSource = dgdSource.DataSource
  If objDataSource Is Nothing Then Exit Sub
    Set rstData = objDataSource.Recordset.Clone
  rstData.Sort = objDataSource.Recordset.Sort
 
  \' Get row and column count
  intTotalCols = dgdSource.Columns.Count
  lngTotalRows = rstData.RecordCount
 
  \' Declare column arrays
  ReDim sngColumnWidth(intTotalCols) As Single
  ReDim sngTextWidth(intTotalCols) As Single
  ReDim sngTextHeight(intTotalCols) As Single
  ReDim strCellContents(intTotalCols) As String
 
  \' Store column widths
  For intCol = 0 To intTotalCols - 1
    If dgdSource.Columns(intCol).Visible = True And _
      dgdSource.Columns(intCol).Width > 0 Then
      sngColumnWidth(intCol) = dgdSource.Columns(intCol).Width
      sngGridWidth = sngGridWidth + sngColumnWidth(intCol)
    End If
  Next intCol
 
  \' Rescale column widths to fill the page
  For intCol = 0 To intTotalCols - 1
    sngColumnWidth(intCol) = sngColumnWidth(intCol) * sngRealPrinterWidth / sngGridWidth
  Next intCol
 
  \' Print rows
  rstData.MoveFirst
  Do Until rstData.EOF
 
    \' Do preprocessing on the current row
    For intCol = 0 To intTotalCols - 1
     
      If dgdSource.Columns(intCol).Visible = True And _
        dgdSource.Columns(intCol).Width > 0 Then
       
        \' Get cell contents
        strCellContents(intCol) = rstData.Fields(dgdSource.Columns(intCol).DataField) & \"\"
       
           
        \' Apply formatting, if any
        If Len(dgdSource.Columns(intCol).DataFormat.Format) > 0 And _
          Len(strCellContents(intCol)) > 0 Then _
          strCellContents(intCol) = Format(rstData.Fields(dgdSource.Columns(intCol).DataField), dgdSource.Columns(intCol).DataFormat.Format)
   
        \' Store dimensions of cell contents as printed
        sngTextWidth(intCol) = Printer.TextWidth(strCellContents(intCol))
        sngTextHeight(intCol) = Printer.TextHeight(strCellContents(intCol))
   
        \' Find tallest column in the current row (so we know how tall to make the
        \' borders)
        If sngTextHeight(intCol) + 2 * sngCellPadding > sngCellHeight Then _
          sngCellHeight = sngTextHeight(intCol) + 2 * sngCellPadding
      End If
    Next intCol
 
    \' If we don\'t have room at the bottom of the page for another line...
    If sngPositionY + 200 + sngCellHeight > sngRealPrinterHeight Then
     
      \' Draw bottom row-separator line
      Printer.Line (0, sngPositionY)-(sngRealPrinterWidth, sngPositionY)
     
      \' Draw column separators
      sngPositionX = 0
      Printer.Line (0, 0)-(0, sngPositionY)
      For intCol = 0 To intTotalCols - 2
        sngPositionX = sngPositionX + sngColumnWidth(intCol)
        Printer.Line (sngPositionX, sngHeaderTop)-(sngPositionX, sngPositionY)
      Next intCol
      Printer.Line (sngRealPrinterWidth, 0)-(sngRealPrinterWidth, sngPositionY)
     
      \' Move to next page
      Printer.NewPage
      blnNewPage = True
    End If
   
    \' If starting a new page, print column headers
    If blnNewPage = True Then
     
      blnNewPage = False
     
      \' Write page footer (date and page number)
      If blnUseGridFont Then
        Set Printer.Font = fntDefaultFont
      End If
     
      Printer.CurrentX = 0
      Printer.CurrentY = sngRealPrinterHeight - Printer.TextHeight(strPrintDate)
      Printer.Print strPrintDate
     
      intPageNumber = intPageNumber + 1
      Printer.CurrentX = sngRealPrinterWidth - Printer.TextWidth(\"Page \" & intPageNumber)
      Printer.CurrentY = sngRealPrinterHeight - Printer.TextHeight(\"Page \" & intPageNumber)
      Printer.Print \"Page \" & intPageNumber
     
      \' Reset position
      sngPositionX = 0
      sngPositionY = 0
     
      \' Draw top row-separator line
      Printer.Line (0, sngPositionY)-(sngRealPrinterWidth, sngPositionY)
     
      \' Use datagrid header font
      If blnUseGridFont Then
        Printer.Font.Name = dgdSource.HeadFont.Name
        Printer.Font.Size = dgdSource.HeadFont.Size
        Printer.Font.Weight = dgdSource.HeadFont.Weight
        Printer.Font.Italic = dgdSource.HeadFont.Italic
        If Printer.Font.Name <> dgdSource.HeadFont.Name Then Set Printer.Font = fntDefaultFont
      End If
     
      \' Print datagrid caption, if any
      If Len(dgdSource.Caption) > 0 Then
        Printer.CurrentX = (sngRealPrinterWidth - Printer.TextWidth(dgdSource.Caption)) / 2
        Printer.CurrentY = sngCellPadding
        Printer.Print dgdSource.Caption
       
        sngPositionY = sngPositionY + _
                      Printer.TextHeight(dgdSource.Caption) + 2 * sngCellPadding
       
        \' Draw row-separator line
        Printer.Line (0, sngPositionY)-(sngRealPrinterWidth, sngPositionY)
      End If
     
      sngHeaderTop = sngPositionY
     
      \' Print column headers
      For intCol = 0 To intTotalCols - 1
   
        \' Print column headers
        If dgdSource.ColumnHeaders = True And _
          dgdSource.HeadLines > 0 And _
          dgdSource.Columns(intCol).Visible = True And _
          dgdSource.Columns(intCol).Width > 0 Then
     
          \' Set text position and print text
          sngHeaderHeight = Printer.TextHeight(dgdSource.Columns(intCol).Caption) + 2 * sngCellPadding
          Printer.CurrentX = sngPositionX + (sngColumnWidth(intCol) - Printer.TextWidth(dgdSource.Columns(intCol).Caption)) / 2
          Printer.CurrentY = sngPositionY + sngCellPadding
          Printer.Print dgdSource.Columns(intCol).Caption
     
          \' Update current position
          sngPositionX = sngPositionX + sngColumnWidth(intCol)
        End If
      Next intCol
     
      \' Use datagrid cell font
      If blnUseGridFont Then
        Printer.Font.Name = dgdSource.Font.Name
        Printer.Font.Size = dgdSource.Font.Size
        Printer.Font.Weight = dgdSource.Font.Weight
        Printer.Font.Italic = dgdSource.Font.Italic
        If Printer.Font.Name <> dgdSource.Font.Name Then Set Printer.Font = fntDefaultFont
      End If
     
      \' Reset position
      sngPositionX = 0
      sngPositionY = sngPositionY + sngHeaderHeight
     
      \' Draw row-separator line
      Printer.Line (0, sngPositionY)-(sngRealPrinterWidth, sngPositionY)
    End If
     
    \' Draw row-separator line
    If dgdSource.RowDividerStyle <> dbgNoDividers Or _
      Not blnUseGridFormatting Then _
      Printer.Line (0, sngPositionY)-(sngRealPrinterWidth, sngPositionY)
   
    \' Print cell contents for the current row
    For intCol = 0 To intTotalCols - 1
      If dgdSource.Columns(intCol).Visible = True And _
        dgdSource.Columns(intCol).Width > 0 Then
     
        \' Get current cell dimensions
        sngCellWidth = sngColumnWidth(intCol)
     
        \' Set text position and print text
        Select Case dgdSource.Columns(intCol).Alignment
          Case dbgLeft: Printer.CurrentX = sngPositionX + sngCellPadding
          Case dbgRight: Printer.CurrentX = sngPositionX + sngCellWidth - sngTextWidth(intCol) - sngCellPadding
          Case dbgCenter: Printer.CurrentX = sngPositionX + (sngCellWidth - sngTextWidth(intCol)) / 2
          Case Else: Printer.CurrentX = sngPositionX + sngCellPadding
        End Select
         
        Printer.CurrentY = sngPositionY + sngCellPadding
        Printer.Print strCellContents(intCol)
   
        \' Move to next column
        sngPositionX = sngPositionX + sngCellWidth
      End If
    Next intCol
   
    \' Move to next row
    sngPositionX = 0
    sngPositionY = sngPositionY + sngCellHeight
    rstData.MoveNext
  Loop
 
  \' Draw final row-separator line
  Printer.Line (0, sngPositionY)-(sngRealPrinterWidth, sngPositionY)
     
  \' Draw final column separators
  sngPositionX = 0
  Printer.Line (0, 0)-(0, sngPositionY)
  For intCol = 0 To intTotalCols - 2
    sngPositionX = sngPositionX + sngColumnWidth(intCol)
    Printer.Line (sngPositionX, sngHeaderTop)-(sngPositionX, sngPositionY)
  Next intCol
  Printer.Line (sngRealPrinterWidth, 0)-(sngRealPrinterWidth, sngPositionY)
 
  Printer.EndDoc
End Sub

Avatar billede cellaneous Nybegynder
02. oktober 2001 - 11:19 #5
Hvad skal variablen indeholde istedet for \"100001\"? En anden tekst? Et tal? Hvor putter du noget i variablen? Er variablen global?
Avatar billede zeon_rm Nybegynder
02. oktober 2001 - 13:28 #6
Den skal jo egentlig bare smide mit Datagrid ned til Printgrid

Som her
Call MyFunction(\"Hello World\")

Function MyFunction(text)
    MsgBox text
End Function

/Zeon_rm
Avatar billede picard Nybegynder
02. oktober 2001 - 13:57 #7
Problemet er måske at du smider en type ind i dit procedure kald frem for et objekt af typen.

hvis du har en grid af typen datagrid og den hedder dbgrid1, så skal dit kald til procedure være: PrintGrid dbgrid1

Kalder du den med printgrid datagrid smider du typen ind som parameter og ikke et objekt.

mvh.

Christian
Avatar billede zeon_rm Nybegynder
02. oktober 2001 - 14:09 #8
ja det ved jeg godt picard og den er også ind til videre omdøbt til:
   
    Call PrintGrid(Datagrid1)
eller
    Printgrid Datagrid1
hvis man bedre kan li det..:)

Stadigvæk den her Type Mismatch error

Men tak for svaret og lad dem endelig komme hvis i har den mindste ide om hvad fejlen kan være...:)

/Zeon_rm

Avatar billede picard Nybegynder
02. oktober 2001 - 14:55 #9
Hvis jeg forstår dig ret så når den aldrig ind i selve procedurekaldet ?!

Avatar billede picard Nybegynder
02. oktober 2001 - 15:00 #10
proceduren
Avatar billede zeon_rm Nybegynder
02. oktober 2001 - 15:21 #11
det er korrekt
Avatar billede picard Nybegynder
02. oktober 2001 - 15:51 #12
Jamen så er det da fordi din parameter ikke svarer til den type du har angivet i parameterhovedet !

Har du en form hvor din DataGrid er indeholdt ?
Hvad er name property på DataGrid Komponenten ?
Avatar billede picard Nybegynder
02. oktober 2001 - 15:54 #13
procedurehovedet

hmm måske jeg skulle læse korrektur INDEN jeg sender, hmmmm ???!
Avatar billede zeon_rm Nybegynder
02. oktober 2001 - 15:59 #14
..:)

Har du en form hvor din DataGrid er indeholdt?
Jeps

Hvad er name property på DataGrid Komponenten ?
Datagrid1 hedder den nu før hed den bare Datagrid

Dette bliver nok sidste kommentar fra mig i dag...Er tilbage i morgen tidlig

/Zeon_rm
Avatar billede cellaneous Nybegynder
02. oktober 2001 - 22:21 #15
Du har skrevet \"dgdSource As Datagrid\" og det får mig til at tænke på om du skal skrive \"dgdSource As\" noget andet - eksempelvis Object?
Avatar billede zeon_rm Nybegynder
03. oktober 2001 - 13:17 #16
>Cellaneous

Jeg sidder desværre ikke ved mit projekt i dag, men jeg har prøvet at ændre dgdSource til noget andet men det har ikke virket endnu. Jeg har dog ikke prøvet object.

Det som virkelig undre mig er at nøjagtig samme kode og opsætning virker i et andet projekt på samme maskine, så der burde jo egentlig ikke være noget galt med koden.

/Zeon_rm
Avatar billede picard Nybegynder
03. oktober 2001 - 17:19 #17
Hej der

Har du husket at adde komponenten til dit projekt ?
Altså oppe under \"components\" og så sætte en flueben udfor komponenten !

mvh.

Christian
Avatar billede zeon_rm Nybegynder
08. oktober 2001 - 08:31 #18
>Cellaneous

Beklager jeg ikke har svaret de sidste par dage jeg har været syg.

Hvis jeg sætter dgdsource som object får jeg en fejl her:
Set objDataSource = dgdSource.DataSource
Den bliver så nothing.

/Zeon_rm
Avatar billede zeon_rm Nybegynder
08. oktober 2001 - 08:34 #19
>Picard

Jeps det hele er sat som det skal være.

/Zeon_rm
Avatar billede zeon_rm Nybegynder
10. oktober 2001 - 12:06 #20
Det endte med at jeg blev lidt træt af det her problem. Så jeg prøvede at rykke alle mine forms, moduler osv. over i et nyt projekt og guess what det virker der..:)

Man tak for jeres indsats.

Picard og cellaneous får 50 points hver for at bruge deres kostbare tid på det her  :)

Hvis jeg engang finder årsagen til problemet skal jeg nok poste den her.

/Zeon_rm
Avatar billede picard Nybegynder
10. oktober 2001 - 17:06 #21
Jamen tak for det :)

mvh.

Christian
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester