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
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.
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 SubMoro 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
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)
'...Voisitko vielä selventää, mitä olet tekemässä? Mitä kaikkia nappuloita on näkyvissä tietyllä hetkellä, ja mitä tapahtuu, kun jostain nappulasta painaa?
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[/koodivbMORO 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 SubMORJENS 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 SubNiin 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
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ä.
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
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 SubMORJENS 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 Subja 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 SubMORJENS 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 ClassImports 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 ClassGrez!
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 :)
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
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ä?
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.
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ä :)
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.