Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6 automatisointi tälle koodille? (VB.NET)

Sivun loppuun

feltsu [01.10.2009 11:09:56]

#

Moikka!

Elikkä ongelma on oikeastaan hyvin yksinkertainen ja niin toivon ratkaisunkin olevan :) Tilanne siis seuraavanlainen:

Load btnChoice(8)
btnChoice(0).Visible = False
btnChoice(8).Visible = True
btnChoice(8).Caption = "Next Chapter"

Load btnChoice(9)
btnChoice(1).Visible = False
btnChoice(9).Visible = True
btnChoice(9).Caption = "Next Chapter 2"

Load btnChoice(10)
btnChoice(2).Visible = False
btnChoice(10).Visible = True
btnChoice(10).Caption = "Next Chapter 3"

Niinkuin voitte huomata, automatisointi olisi erittäin tärkeää, koska tähän peliin on tulossa yhteensä 399 nappia :D Ja noitten btnChoice(numero) pitäis vastata chapter(numero) arvoja :) Elikkä jos btnChoice on numero 5 niin chapterin pitäis olla numero 5 jne.

Toivottavasti joku ees suurinpiirtein tajus mitä tässä yritän kysellä

-Feltsu

feltsu [01.10.2009 12:28:04]

#

EDIT:

Joo koitanpa vielä vähän selittää, eli tarkoitus on tehdä tekstipeli missä pelaajalle näkyvä teksti on RichTextBoxissa (ja siis tietenkin .rtf-formaatissa) ja jokainen chapter on numeroitu 1-399 ja pitäis saada sellanen systeemi, että jokaisen btnChoicen numero veis samaan chapterin numeroon, joten varmaan joku taulukkosysteemi pitäis kehittää missä ois kaikki noi buttonit ja toinen taulukko missä ois kaikki noi chapterit, vai kuinka?

-Feltsu

EDIT2:

Jos vielä koitan selventää :D
Siis jos klikkaan btnChoice(9) niin se avais rtfBoxiin Chapter9.rtf tiedoston ja jos klikkaan btnChoice(15) niin se avais rtfBoxiin Chapter15.rtf tiedoston ja klikkaamalla btnChoice(9) se muuttais buttonit näkyviksi ja näkymättömiksi sitä mukaa mihin chapteriin kukin nappula vie.

PS. Olisin siis editoinut tota ensimmäistä postia, mutta aika editoimiseen oli varmaankin mennyt jo umpeen.
PPS. Alkaa olemaan jo sen verran epäselvästi selitetty että itekkään enää meinaa tajuta :D Toivottavasti jollain on ideoita asian toteuttamiseksi.

neau33 [01.10.2009 16:56:27]

#

MORO feltsu!

mitähän jos nappisysteemisi sijaan käyttäisitkin oheista esimerkkiä mallina...

Dim basePath As String
Dim chapterIndex As Integer
Dim chaptersCount As Integer
Dim chaptersFound As Boolean

Private Sub Form_Load()

   Dim files As String
   Dim filter As String

   basePath = App.Path & "\Chapters\"
   filter = "*.rtf"

   Dim file As String
   file = Dir(basePath & filter)

   If file <> "" Then

      Do Until file = ""
         files = files + file & "|"
         file = Dir()
      Loop

      files = Left(files, Len(files) - 1)
      Dim getCount() As String
      getCount = Split(files, "|")
      chaptersCount = UBound(getCount) + 1
      Erase getCount
      chapterIndex = 1
      Label1.Caption = "Chapter to load: " _
      & CStr(chapterIndex)
      chaptersFound = True

   End If

End Sub

Private Sub BtnLoad_Click()

   If Not chaptersFound Then
      MsgBox basePath & _
      " doesn't contain any chapter files"
      Exit Sub
   End If

   If Dir(basePath & "Chapter" _
   & CStr(chapterIndex) & ".rtf") = "" Then
      MsgBox "Loading failed..." & vbCrLf & _
      "File: " & basePath & "Chapter" _
      & CStr(chapterIndex) & ".rtf" _
      & " doesn't exists"
      Exit Sub
   End If

   RichTextBox1.LoadFile basePath & "Chapter" _
   & CStr(chapterIndex) & ".rtf"

   If chapterIndex < chaptersCount Then
      'BtnNext.Value = True
   End If

End Sub

Private Sub BtnPrev_Click()

   If chapterIndex > 1 Then
      chapterIndex = chapterIndex - 1
      Label1.Caption = "Chapter to load: " _
      & CStr(chapterIndex)
   End If

End Sub

Private Sub BtnNext_Click()

   If Not chaptersFound Then Exit Sub

   If chapterIndex < chaptersCount Then
      chapterIndex = chapterIndex + 1
      Label1.Caption = "Chapter to load: " _
      & CStr(chapterIndex)
   End If

End Sub

feltsu [01.10.2009 17:07:33]

#

Moro vaa!

Joo kiitoksia paljon vastauksestasi, mutta en varmaan nyt ihan selittäny tarpeeks selkeesti (jos ymmärsin ton sun koodipätkäs oikein :D). Eli siis chapterit ei mee järjestyksessä vaan voi hypätä vaikka chapteristä 285 chapteriin 40 jne. Ja jos tossa on vaan prev ja next buttonit niin sit ei vissiin toimi? Tohon peliin kuuluu myös taisteluita joita tulee tietyillä "sivuilla". Mietiskelin tossa itekseni, et oisko tollasta mitä yritän hakea (jos sen nyt joku edes ymmärtää :D) toteuttaa databasella, esim accessilla tms :) Josta muuten tuliki mieleen, että voiko Access 2007:aa käyttää VB6:sen kanssa?

-Feltsu

neau33 [01.10.2009 18:18:23]

#

MORO taas feltsu!

no unohda prev/next-buttonit & caseta chapterIndex-arvot BtnLoad_Click -tapahtumassa tyyliin...

'...

   RichTextBox1.LoadFile basePath & "Chapter" _
   & CStr(chapterIndex) & ".rtf"

   Select Case chapterIndex
      Case 1: 'chapterIndex = JokuArvo
      '...
      Case 285:
        'If JonkunAsetuksenArvo = JokuArvo _
        'And JonkunToisenAsetuksenArvo = jokuArvo  Then 'Esim!
           chapterIndex = 40 'esim!
        'Elseif Not JonkunAsetuksenArvo = JonkuTiettyArvo Then
           'chapterIndex = 16200 'esim!
        'Else: chapterIndex = JokuMuuArvo 'Esim!
        'End If

      ' jne...
   End Select

   Label1.Caption = "Next chapter to load: " _
   & CStr(chapterIndex)

   '...

Antti Laaksonen [01.10.2009 20:38:16]

#

Voisitko vielä selventää, mitä olet tekemässä? Mitä kaikkia nappuloita on näkyvissä tietyllä hetkellä, ja mitä tapahtuu, kun jostain nappulasta painaa?

neau33 [01.10.2009 21:05:03]

#

MORO taas feltsu!

Kysymykseen: "...voiko Access 2007:aa käyttää VB6:sen kanssa?"

'Projektiin referenssi:
'Microsoft ActiveX Data Objects 2.x Library (x=minor version number)
'(msado2x.tlb)(x=minor version number)

Dim Conn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim ChaptersTable() As Variant

Private Sub UserForm_Activate()

   Dim dbBasePath As String
   Dim dbFileName As String
   Dim dbFullPath As String
   Dim connStr As String
   Dim pwd As String

   dbBasePath = App.Path & "\Databses"
   dbFileName = "MyDatabase.mdb"  'tai MyDatabase.accdb

   dbFullPath = Replace(dbBasePath _
   & "\" & dbFileName, "\\", "\")

   pwd = "" ' or not

   connStr = "Microsoft.ACE.OLEDB.12.0;Data Source=" & _
   dbFullPath & ";Jet OLEDB:Database Password=" & pwd & ";"

   Set Conn = New ADODB.Connection
   Set Rs = New ADODB.Recordset

   Conn.Provider = connStr
   Conn.Open
   Set Rs = New ADODB.Recordset

   Rs.Open "MyTable", Conn, _
   adOpenDynamic, adLockOptimistic, adCmdTable

   Rs.MoveFirst

   ReDim ChaptersTable(1 To Rs.Fields.Count - 1, 1 To 1)

   Dim i As Integer

   Do While Not Rs.EOF

      i = i + 1
      ReDim Preserve ChaptersTable( _
      1 To Rs.Fields.Count - 1, 1 To i)
      For j = 1 To Rs.Fields.Count - 1
         ChaptersTable(j, i) = Rs.Fields(j)
      Next j
      Rs.MoveNext

   Loop

   Rs.Close: Set Rs = Nothing
   Conn.Close: Set Conn = Nothing

   'Test:
   'For i = 1 To UBound(ChaptersTable, 2)
      'For j = 1 To UBound(ChaptersTable, 1)
         'MsgBox ChaptersTable(j, i)
      'Next j
   'Next i

End Sub

Private Sub Form_QueryUnload( _
Cancel As Integer, UnloadMode As Integer)
   Erase ChaptersTable
End Sub[/koodivb

neau33 [01.10.2009 22:39:58]

#

MORO taas feltsu!

tässä vielä eräs tapa luoda VB6:lla Access 2007 Tietokanta/Taulu/Sarake/Tietue...

'Referenssit:
'Microsoft ActiveX Data Objects 2.8 Library (msado15.dll)
'Microsoft ADO Ext. 2.8 for DLL as Security (msADOX.dll)
Dim Conn As ADODB.Connection
Dim Rs As ADODB.Recordset

Private Sub Form_Load()

   Dim dbBasePath As String
   Dim dbFileName As String
   Dim dbFullPath As String
   Dim connStr As String
   Dim pwd As String

   'dbBasePath = App.Path & "\Databses"

   If Dir(dbBasePath,vbDirectory) = "" Then
      MkDir(dbBasePath)
   End If

   dbFileName = "TestBase.accdb" ' tai "TestBase.mdb" '
   dbFullPath = Replace(dbBasePath & "\" & dbFileName, "\\", "\")
   pwd = "" ' tai sitten ei

   connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
   dbFullPath & ";Jet OLEDB:Database Password=" & pwd & ";"

   If Dir(dbFullPath) = "" Then

      Dim cat As adox.Catalog
      Set cat = New adox.Catalog

      cat.Create connStr

      Dim cmd As ADODB.Command
      Set Conn = New ADODB.Connection
      Conn.ConnectionString = connStr
      Conn.Open

      Set cmd = New ADODB.Command

      cmd.ActiveConnection = Conn
      cmd.CommandText = "Create Table TestTable (" & _
      "[TestField] Text(50))"
      cmd.Execute: Set cmd = Nothing

      Set Rs = New ADODB.Recordset

      Rs.Open "TestTable", Conn, _
      adOpenDynamic, adLockOptimistic, adCmdTable
      Rs.AddNew "TestField", "Testataan"
      Rs.MoveLast

      MsgBox (Rs.Fields("TestField").Value)

      Rs.Close: Set Rs = Nothing
      Conn.Close: Set Conn = Nothing

   End If

End Sub

neau33 [02.10.2009 02:45:41]

#

MORJENS TAAS feltsu!

testaapa vielä josko saisit oheisesta esimerkistä jotain ideoita...

Dim cmdBtnLeft As Integer, cmdBtnTop As Integer
Private Const cmdBtnWidth = 75, cmdBtnHeight = 23
Private btnIndex As Integer, ctlTagCaption As String
Private WithEvents cmdChapters As CommandButton

Sub Private Sub Form_Initialize()

   cmdBtnLeft = Me.Width - (cmdBtnWidth * 1.15)
   cmdBtnTop = 10: btnIndex = 1

End If

Private Sub Form_Load()

   Create_Ctl

End Sub

Sub Create_Ctl()

   remove_Ctl

   Set cmdChapters = _
   Me.Controls.Add("VB.CommandButton", cmdButton")

   With cmdChapters
      .Visible = True
      .Caption = "Next Chapter " & CStr(btnIndex)
      .left = cmdBtnLeft
      .Top = cmdBtnTop
      .Width = cmdBtnWidth
      .Height = cmdBtnHeight
      ctlTagCaption = .Caption
   End With

End Sub


Private Sub Remove_Ctl()

   Dim ctl As Control

   For Each ctl In Me.Controls

     On Error Resume Next

     If InStr(ctl.Caption, ctlTagCaption) > 0 Then
        Me.Controls.Remove(ctl.Name)
     End If

     If Err <> 0 Then
        Err.Clear
        On Error Goto 0
     End If

   Next

End Sub

Private Sub cmdChapters_Click()

   Select Case btnIndex
      Case 1
         MsgBox "jee" 'esim...
         btnIndex = 10
      Case 10
         MsgBox "yeah"
         btnIndex = 1
      ' jne...
   End Select

   Create_Ctl

End Sub

Private Sub Form_QueryUnload( _
Cancel As Integer, UnloadMode As Integer)

   Remove_Ctl

End Sub

feltsu [02.10.2009 08:31:20]

#

Niin tilanne ois semmonen että peli alkaa chapterista1, sitte siinä on yhdestä neljään nappulaa (esim) ensimmäisessä napissa lukis vaikka "Go north" sitte sen pitäis siitä mennä esim chapteriin 250 ja siellä chapterissa 250 ois esim kaks nappia jossa toisessa lukee "Search for treasure" ja toisessa napissa lukee "Open the south door" ja jos pelaaja klikkaa vaikka "Search for treasure" nappia niin sitte se hyppää chapteriin 149 jossa taas eri vaihtoehdot ja eri nappulat eri teksteillä ja niin edespäin selvenskö tää nyt sit yhtään? Toivon niin :D ja Nea, kiitoksia paljon vastauksista, oon nyt koulussa niin en kerkee kokeilemaan noita koodipätkiä mitä kiltisti laitoit, mutta kunhan kotiin pääsee vaiheessa niin ihmettelen ihan ajatuksen kanssa :)

-Feltsu

Grez [02.10.2009 08:48:20]

#

Jep, laita siihen vaan kahdeksan (tms) nappia ja sitten teet niin, että se mitä mistäkin napista tapahtuu riippuu siitä, missä chapterissa se käyttäjä on.

Ei tuollaisessa 400 napissa oo miltään kannalta ajatellen mitään järkeä.

feltsu [02.10.2009 10:48:40]

#

Grez, niin sillähän mä just tänne tulinkin kysymään että miten saan sen jotenkin järkevästi luotua ettei tarvii niitä 400:aa nappia siihen koodata :D

Grez [02.10.2009 12:10:41]

#

Tuossa on toimiva seikkailupeli. Seikkailu ei ole kovin kummoinen, mutta sitähän voi laajentaa.

Eli siis itse tekisin sen jotakuinkin näin:

Option Explicit
Private cn As New ADODB.Connection
Private Chapter As Long

Private Sub Button_Click(Index As Integer)
    'Haetaan actionin toiminta tietokannasta
    Dim rs As New ADODB.Recordset
    rs.Open "SELECT [ActionMessage], [ActionTargetChapter] FROM ChapterActions WHERE [Chapter]=" _
        & Chapter & " AND [ActionId]=" & Index, cn, adOpenStatic, adLockReadOnly
    ChapterGUI rs!ActionTargetChapter, rs!ActionMessage
    rs.Close
End Sub

Private Sub Form_Load()
    'Avataan tietokanta
    cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & App.Path & _
        "\Seikkailu.mdb;DefaultDir=;UID=;PWD=;"

    'Aloitetaan
    ChapterGUI 1, "Let the games begin"
End Sub
Private Sub ChapterGUI(NewChapter As Long, Message As String)
    Dim Action As Long, ActionFound As Boolean

    MessageLabel.Caption = Message
    Chapter = NewChapter

    Dim rs As New ADODB.Recordset

    'Haetaan Chapterin tiedot kannasta
    rs.Open "SELECT [Name], [Description] FROM Chapters WHERE Id=" & NewChapter, _
        cn, adOpenStatic, adLockReadOnly
    ChapterName.Caption = rs!Name
    ChapterDescription.Caption = rs!Description
    rs.Close


    'Haetaan Chapterin actionit kannasta
    rs.Open "SELECT [ActionId], [ActionText] FROM ChapterActions WHERE Chapter=" & NewChapter _
        & " ORDER BY [ActionId]", cn, adOpenStatic, adLockReadOnly
    For Action = 0 To 7
        If rs.EOF Then
            ActionFound = False
        Else
            ActionFound = rs!ActionId = Action
        End If
        Button(Action).Visible = ActionFound
        If ActionFound Then
            If Action > 3 Then Button(Action).Caption = rs!ActionText
            rs.MoveNext
        End If
    Next
    rs.Close
End Sub

neau33 [03.10.2009 19:56:13]

#

MORJENS TAAS feltsu!

tutkipas vielä oheisia esimerkkejä josko saisit joitakin ideoita...

elikäs rakentele ensin Accesilla ("käsin") oheisen mallin mukainen viritelmä...

MsAccess tietokanna rakennemalli: (testi)
ChapterBase.mdb

Taulu:
ChaptersTable

Kentät:

CahpterID
 Tietotuuppi: Luku
 - Muoto: Pitkä kokonaisluku
 - Arvo tarvitaan: Kyllä
 - Ineksoitu: Kyllä (ei kasoisarvoja)
 Tietuekentän malli: 1 (2, 3 jne..)

RtfData
 Tietotyyppi: Ole-objekti
 - Arvo tarvitaan: Ei
 Tietuekentän malli: Ei mitään
 (jätä kentät tyhjiksi!!!)

CtlProperties
 Tietotyyppi: Memo
 - Arvo tarvitaan: Kyllä
 - Tyhjät merkkijonot sallisttuja: Kyllä
 - Indeksoitu: Ei
 - Unicode-pakkaus: Kyllä
 - IME tila: Ei komponenttia
 - IME lausetila: ei muunnosta

 Tietuekentän mallit:
  Ensimmäinen tietue:
  1_True_To North|2_True_To East|3_True_To Shout|4_True_To West

  Toinen tietue:
  1_True_Open the south door|2_True_Search for treasure|3_False_Empty|4_False_Empty

  Kolmas tietue:
  1_True_Chose 1|2_True_Choise 2|3_False_Empty|4_False_Empty

  jne...

ClickCodes
 Tietotyyppi: Memo
 - Arvo tarvitaan: Kyllä
 - Tyhjät merkkijonot sallisttuja: Kyllä
 - Indeksoitu: Ei
 - Unicode-pakkaus: Kyllä
 - IME tila: Ei komponenttia
 - IME lausetila: ei muunnosta

 Tietuekentän mallit:
  Ensimmäinen tietue:
  1_Sub Main()*   GetData 2*End Sub|2_Sub Main()*   GetData 3*End Sub|3_Sub Main()*  GetData 4*End Sub|4_Sub Main()*

  Toinen tietue:
  1_Sub Main()*    GetData 6*End Sub|2_Sub Main()*  GetData 7*End Sub|3_Empty|4_Empty

  Kolmas tietue:
  1_Sub Main()*    GetData 8*End Sub|2_Sub Main()*  GetData 9*End Sub|3_Empty|4_Empty

  jne...

Pukkaa sitten Rtf-tiedostot tietokantaan oheisella VB-viritelmällä...

'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'*                                                           *
'*  Projekti:                                                *
'*  RtfToDb                                                  *
'*                                                           *
'*  Referenssit:                                             *
'*  Microsoft ActiveX Data Objects 2.8 Library (msado15.dll) *
'*                                                           *
'*  Form1 kontrollit:                                        *
'*  1 CommandButton (Command1)                               *
'*                                                           *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Private Conn As ADODB.Connection
Private Rs As ADODB.Recordset

Private Sub Command1_Click()

   Dim dbBasePath As String
   Dim dbFileName As String
   Dim dbFullPath As String
   Dim rtfBasePath As String

   dbBasePath = App.Path & "\Databases"
   rtfBasePath = App.Path & "\RTFfiles"

   dbFileName = "ChapterBase.mdb"
   dbFullPath = dbBasePath & "\" & dbFileName

   If Dir(dbFullPath) = "" Then
      MsgBox "Tiedostoa: " & dbFullPath & " ei löydy"
      Exit Sub
   ElseIf Dir(rtfBasePath, vbDirectory) = "" Then
      MsgBox "Kansiota: " & rtfBasePath & " ei löydy"
      Exit Sub
   End If

   Dim connStr As String
   connStr = "Microsoft.ACE.OLEDB.12.0;Data Source=" & _
   dbFullPath & ";Jet OLEDB:Database Password=" & pwd & ";"

   Dim TableName As String
   TableName = "ChaptersTable"
   Set Conn = New ADODB.Connection
   Set Rs = New ADODB.Recordset

   Conn.Provider = connStr
   Conn.Open
   Set Rs = New ADODB.Recordset

   Rs.Open Source:=TableName, ActiveConnection:=Conn, _
   CursorType:=adOpenDynamic, LockType:=adLockOptimistic

   Rs.MoveFirst

   Dim i As Integer

   Do While Not Rs.EOF

      i = i + 1
      Dim strFile As String

      fullPath = dbBasePath & "\" & "Chapter" & CStr(i) & ".rtf"
      Open fullPath For Binary Access Read As #1

      strFile = Space(LOF(1))

      Get #1, , strFile: Close #1
      Dim rtfData() As Byte
      rtfData = StrConv(strFile, vbFromUnicode)
      Rs.Fields("RtfData").Value = rtfData
      Rs.Update
      Rs.MoveNext

      strFile = ""

   Loop

   Rs.Close: Set Rs = Nothing
   Conn.Close: Set Conn = Nothing

End Sub

ja testaa oheisella VB-viritelmällä...

'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'*                                                           *
'*  Projekti:                                                *
'*  TestiProjekti                                            *
'*                                                           *
'*  Referenssit:                                             *
'*  Microsoft ActiveX Data Objects 2.8 Library (msado15.dll) *
'*  Microsoft Script Control 1.1 ([linkki "http://www.pcrepaircentral.com/ocx/msscript.zip"]msscript.ocx[/linkki])              *
'*                                                           *
'*                                                           *
'* Form1 (testi):                                            *
'* 4 komentonappia (Command1, Command2, Command3; Command4) *
'* 1 RichTextBoxi  (RichTextBox1)                              *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Private sc As MSScriptControl.ScriptControl
Private dbAction As Boolean

Private Sub Form_Load()

   GetData 1

End Sub

Private Sub Command1_Click()

   If Command1.Tag <> "" Then
      RunScript (Command1.Tag)
   End If

End Sub

Private Sub Command2_Click()

   If Command2.Tag <> "" Then
      RunScript (Command2.Tag)
   End If

End Sub

Private Sub Command3_Click()

   If Command3.Tag <> "" Then
      RunScript (Command3.Tag)
   End If

End Sub

Private Sub Command4_Click()

   If Command4.Tag <> "" Then
      RunScript (Command4.Tag)
   End If

End Sub

Public Sub GetData(index As Integer)

   Dim Conn As ADODB.Connection
   Dim Rs As ADODB.Recordset
   Dim connStr As String
   Dim dbBasePath As String
   Dim dbFileName As String
   Dim dbFullPath As String
   Dim strSQL As String
   Dim pwd As String

   dbBasePath = App.Path & "\Databases"
   dbFileName = "ChapterBase.mdb"
   dbFullPath = dbBasePath & "\" & dbFileName

   If Dir(dbFullPath) = "" Then

      MsgBox "Tiedostoa " & dbFullPath & " ei löydy"
      Exit Sub

   End If

   strSQL = _
   "SELECT * FROM ChaptersTable WHERE ChapterNro=" & CStr(index)
   pwd = ""
   connStr = "Microsoft.ACE.OLEDB.12.0;Data Source=" & _
   dbFullPath & ";Jet OLEDB:Database Password=" & pwd & ";"

   Dim TableName As String
   TableName = "ChaptersTable"

   Set Conn = New ADODB.Connection
   Set Rs = New ADODB.Recordset

   Conn.Provider = connStr
   Conn.open

   Rs.open strSQL, ActiveConnection:=Conn, _
   CursorType:=adOpenDynamic, _
   LockType:=adLockOptimistic

   Me.RichTextBox1.RTF =
   StrConv(Rs.fields("RtfData").value, vbUnicode)

   Dim ctlProperties() As String
   ctlProperties = _
   Split(Rs.fields("CtlProperties").value, "|")

   Dim i As Integer

   For i = 0 To UBound(ctlProperties)

      Dim Details() As String
      Details = Split(ctlProperties(i), "_")

      Select Case Details(1)
         Case "True"
            Me.Controls("Command" & CStr( _
            Details(0))).Visible = True
               Select Case Details(2)
                  Case Is <> "Empty"
                     Me.Controls("Command" & CStr( _
                     Details(0))).Caption = Details(2)
                  Case Else
                     Me.Controls("Command" & CStr( _
                     Details(0))).Caption = ""
               End Select

         Case Else
            Me.Controls("Command" & _
            CStr(Details(0))).Visible = False
      End Select

   Next i

   Dim ctlClickCodes() As String
   ctlClickCodes = Split(Rs.fields( _
   "ClickCodes").value, "|")

   For i = 0 To UBound(ctlClickCodes)

      Details = Split(ctlClickCodes(i), "_")

      Select Case Details(1)
         Case Is <> "Empty"
            Me.Controls("Command" & CStr( _
            Details(0))).Tag = _
            Replace(Details(1), "*", vbCrLf)
         Case Else
            Me.Controls("Command" & CStr( _
            Details(0))).Tag = ""
      End Select

      Erase Details

   Next

   Erase ctlClickCodes

   Rs.Close: Set Rs = Nothing
   Conn.Close: Set Conn = Nothing

   dbAction = False

End Sub

Sub RunScript(strCode As String)

   'MsgBox strCode 'testi

   If dbAction Then
      Exit Sub
   End If

   Set sc = New MSScriptControl.ScriptControl
   With sc
      .Language = "VBScript"
      .AddObject "Form1", Me, True
      .AllowUI = True
      .AddCode strCode
      .Run "Main"
      .Reset
   End With

   Set sc = Nothing

End Sub

neau33 [03.10.2009 22:07:10]

#

MORJENS TAAS feltsu!!

tässä vielä Rtf-tietokantaan & testiohjelma VB.NET versioina...

Imports ADODB
Imports System
Imports System.IO
Imports System.Text
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices

<ComVisible(True)> _
Public Partial Class MainForm

   Private Conn As ADODB.Connection
   Private Rs As ADODB.Recordset

   Public Sub New()
      Me.InitializeComponent()
   End Sub

   Sub Button1Click(sender As Object, e As EventArgs)

      Dim dbBasePath As String = Application.StartupPath & "\Databases"
      Dim rtfBasePath As String = Application.StartupPath & "\RTFfiles"
      Dim dbFileName As String = "ChapterBase.mdb"
      Dim dbFullPath As String = dbBasePath & "\" & dbFileName
        Dim pwd As String = String.Empty

      If Dir(dbFullPath) = "" Then
         MsgBox("Tiedostoa: " & dbFullPath & " ei löydy")
         Exit Sub
      ElseIf Dir(rtfBasePath, vbDirectory) = "" Then
         MsgBox("Kansiota: " & rtfBasePath & " ei löydy")
         Exit Sub
      End If

      Dim connStr As String
      connStr = "Microsoft.ACE.OLEDB.12.0;Data Source=" & _
      dbFullPath & ";Jet OLEDB:Database Password=" & pwd & ";"

      Dim TableName As String = "ChaptersTable"

      Conn = New ADODB.Connection
      Rs = New ADODB.Recordset

      Conn.Provider = connStr
      Conn.Open
      Rs = New ADODB.Recordset

      Rs.Open(TableName, Conn, _
      CursorTypeEnum.adOpenDynamic, _
      LockTypeEnum.adLockOptimistic)
      Rs.MoveFirst

      Dim i As Integer

      Do While Not Rs.EOF

         i += 1

         Dim rtfFullPath As String = _
         rtfBasePath & "\" & "Chapter" & CStr(i) & ".rtf"

         Dim strFile As String = _
         New String(" ", FileLen(rtfFullPath))

         FileOpen(1, rtfFullPath, OpenMode.Binary, OpenAccess.Read)
         FileGet(1, strFile): FileClose(1)

         Dim rtfData() As Byte
         Dim bytes() AS Byte = Nothing
         rtfData = New ASCIIEncoding().GetBytes(strFile)

         Rs.Fields("RtfData").Value = rtfData
         Rs.Update
         Rs.MoveNext

         strFile = Nothing

      Loop

      Rs.Close: Rs = Nothing
      Conn.Close: Conn = Nothing

   End Sub

End Class
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Text
Imports MSScriptControl
Imports System.Runtime.InteropServices

<ComVisible(True)> _
Public Partial Class MainForm

   Private connStr As String = String.Empty
   Private conn As OleDb.OleDbConnection
   Private ds As DataSet
   Private dbAction As Boolean = False

   Public Sub New()
      Me.InitializeComponent()
   End Sub

   Sub MainFormLoad(sender As Object, e As EventArgs)

      Me.richTextBox1.ReadOnly = True
      GetData(1)

   End Sub

   Public Sub GetData(index As Integer)

      dbAction = True

      Dim dbBasePath As String = _
      Application.StartupPath & "\Databases"

      Dim dbFileName As String = "ChapterBase.mdb"

      Dim dbFullPath As String = _
      dbBasePath + "\" + dbFileName

      connStr = _
      "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" _
      & dbFullPath

      conn = New OleDbConnection(connStr)

      Dim strSQL As String = _
      "SELECT * From [ChaptersTable] Where ChapterID=" _
      + Cstr(index)

      conn.Open

      Dim da As OleDbDataAdapter = _
      New OleDbDataAdapter(strSQL, conn)

      ds = New DataSet
      da.Fill(ds,"ChaptersTable")

      conn.Close

      Dim TempRtfPath As String = _
      dbBasePath + "\" + "TempFile.rtf"

      If Dir(TempRtfPath) <> "" Then
         Kill(TempRtfPath)
      End If

      Dim bytes() As Byte

      Bytes = ds.Tables("ChaptersTable") _
      .Rows(0)("RtfData")

      Me.richTextBox1.Rtf = _
      New UnicodeEncoding().GetString(Bytes)
      bytes = Nothing

      Dim CtlProperties() As String = _
      ds.Tables("ChaptersTable").Rows(0) _
      ("CtlProperties").Split("|")

      For i As  Integer = 0 To  _
      ctlProperties.GetUpperBound(0)

         Dim Details() As String = _
         ctlProperties(i).Split("_")

         Select Case Details(1)
            Case "True"
               Me.Controls("button" & CStr( _
                  Details(0))).Visible = True
               Select Case Details(2)
                  Case Is <> "Empty"
                     Me.Controls("button" & CStr( _
                     Details(0))).Text = Details(2)
                  Case Else
                     Me.Controls("button" & CStr( _
                     Details(0))).Text = String.Empty
               End Select

            Case Else
               Me.Controls("button" & _
               Cstr(Details(0))).Visible = False
         End Select
         Details = Nothing
      Next

      ctlProperties = Nothing

      Dim ctlClickCodes() As String = _
      ds.Tables("ChaptersTable").Rows(0) _
      ("ClickCodes").Split("|")

      For i As  Integer = 0 To  _
      ctlClickCodes.GetUpperBound(0)

         Dim Details() As String = _
         ctlClickCodes(i).Split("_")

         Select Case Details(1)
            Case Is <> "Empty"
               Me.Controls("button" & CStr( _
               Details(0))).Tag = _
               Details(1).Replace("*", _
               Environment.NewLine)
            Case Else
               Me.Controls("button" & CStr( _
               Details(0))).Tag = String.Empty
         End Select

         Details = Nothing

      Next

      ctlClickCodes = Nothing
      dbAction = False

   End Sub

   Sub Button1Click(sender As Object, e As EventArgs)

      If sender.Tag <> String.Empty Then
         RunScript(sender.Tag)
      End if

   End Sub

   Sub Button2Click(sender As Object, e As EventArgs)

      If sender.Tag  <> String.Empty Then
         RunScript(sender.Tag)
      End if

   End Sub

   Sub Button3Click(sender As Object, e As EventArgs)

      If sender.Tag <> String.Empty Then
         RunScript(sender.Tag)
      End if

   End Sub

   Sub Button4Click(sender As Object, e As EventArgs)

      If sender.Tag <> String.Empty Then
         RunScript(sender.Tag)
      End if

   End Sub

   Sub RunScript(strCode As String)

      If dbAction Then
         Exit Sub
      End If

      Dim sc As New MSScriptControl.ScriptControlClass()

      With sc
        .Language = "VBScript"
        .AddObject("MainForm", Me, True)
        .AllowUI = True
        .AddCode(strCode)
        .Run("Main")
        .Reset
      End With

      sc = Nothing

   End Sub

End Class

feltsu [05.10.2009 10:52:13]

#

Grez!

Toi sun tekemä seikkailu toimi ihan loistavasti ja nyt ajattelin kysästä et mites siihen sais semmosen pikkusen modifikaation että sen sijaan et ne chapterin tekstit (Description) löytyy siitä tietokannasta, niin se hakiskin ne tekstit erillisestä .rtf tiedostosta ja heittäis sen tekstipätkän sitte RichTextBoxiin? Elikkä muuten se tietokanta on aika tarkalleen sellanen ku olin ajatellutkin (kts. oikein toimiva!) mut tosiaan toi pikkujuttu.. En oo ite mikää Access expertti (käyttäny joskus koulussa 8 vuotta sitte joku 5 kertaa että jee). Ja siis ku tarkotus ois sillai että ne chapterit on numeroitu tyylillä Chapter1.rtf, Chapter2.rtf, Chapter189.rtf, jne jne jne.

Kiitoksia paljon toimivasta seikkailusta! Ja se tarina siinä oli loistava, repeilin täällä yksikseni ku kokeilin :D

-Feltsu (Sendasin ton myös sähköpostilla sulle :)

Grez [05.10.2009 11:28:21]

#

Eihän tuossa tarvitse tehdä muuta kuin laittaa sinne descriptiontextin tilalle rtf-boksi ja laittaa että se ei lataakaan descriptionia kannasta vaan tiedostosta. Samalla voi poistaa koko descpription sarakkeen chapters-taulusta.

Eli tuohon ChapterGUIn keskivaiheille tulisi

'Haetaan Chapterin tiedot kannasta ja tiedostosta
rs.Open "SELECT [Name] FROM Chapters WHERE [Id]=" & NewChapter, _
    cn, adOpenStatic, adLockReadOnly
ChapterName.Caption = rs!Name
rs.Close
rtfChapter.LoadFile App.Path & "\Chapters\Chap" & NewChapter & ".rtf"

Sitten vaan rtf-tiedostot Chapters hakemistoon nimellä Chap1.rtf jne

Laitoin nyt vielä päivitetyn esimerkinkin:
http://grez.info/putka/feltsu/Seikkailu2.zip

feltsu [05.10.2009 12:10:12]

#

Kiitoksia! Nyt toimii sillä tavalla ku olin sitä miettinytkin, nyt vaan semmosta viel kysyisin et tarviiko toho ohjelman mukaan sitte nakko joku ylimääränen dll-filu (tai vastaava) ku se käyttää tota Accessia? Vai pitääkö lataajalla/pelaajalla olla Access et voi pelaa tota peliä?

Grez [05.10.2009 12:12:41]

#

Käytännössä riittää kun on msdactyp.exe paketti (VB6 asennsuwizardi muistaakseni laittaa tämän automaagisesti levityspakettiin mukaan jos teet tuosta projektista asennuspaketin). Tarvitseehan siinä joka tapauksessa muutenkin VB6:n runtime -kirjastot.

feltsu [05.10.2009 12:15:08]

#

Jeps, oon jo nakkonu noi VB6:n runtimet siihen syssyyn, mut osaakko yhtää sanoo et onko kuinka vaikeeta tehä tommonen asennuspaketti? En oo ite kerenny siihen yhtään tutustua, mut jos osaat sanoo et "seo helvetin hankala käyttää" tai "ei se kovin hankala oo" niin voisin sen mukaa sitte harkita et jaksanko alkaa ees leikkimään sillä :)

Grez [05.10.2009 12:29:20]

#

Monet asennusohjelmatyökalut osaa tehdä valmiin paketin ihan kun vaan kerrot sille että tuollaista vbp-projektia varten sellainen pitäisi tehdä. Muistaakseni VB6:n mukana tulee Package&Deployment Wizard, joka pystyy tekemään jonkinnäköisen asennusohjelman.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta