re: vb vupros

8 отговора 265 прегледа
#1

re: vb vupros

Purvo mnogo blagodarq na Щиpлиц za koda koito mi dade. Az malko go promenih ama ne raboteshe promenen:(

-------------koda na Щиpлиц---------

Option Explicit

Private Sub Form_Load()
If Dir("Program.ini") <> "" Then
Dim strData As String
Open "Program.ini" For Input As #1
Line Input #1, strData: cmd1.BackColor = Val(strData)
Close #1
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Open "Program.ini" For Output As #1
Print #1, cmd1.BackColor
Close #1
End Sub

Private Sub cmd1_Click()
On Error GoTo EndSub
With dlgCommon
.CancelError = True
.DialogTitle = "Select Color"
.Color = cmd1.BackColor
.ShowColor
End With
cmd1.BackColor = dlgCommon.Color
EndSub:
End Sub


----------------Promeneniq kod-----------

toq kod az go promenih taka


Option Explicit

Private Sub Form_Load()
If Dir("Program.ini") <> "" Then
Dim strData As String
Open "Program.ini" For Input As #1
Line Input #1, strData: frm1.BackColor = Val(strData)
'obache ako sloja tuka oshte edna frm i nishto ne stava
Line Input #1, strData: frm2.BackColor = Val(strData)
'tova vtoroto ne raboti samo purvoto
Close #1
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Open "Program.ini" For Output As #1
Print #1, frm1.backcolor
Close #1
End Sub


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

I kato ne stava tova da sloja frm2 az reshih da napravq oshte edin ini fail i v nego da sloja frm2.BackColor, tova e super lamersko znam, no neznam kak po drug nachin da go napravq tui che ako nqkoi moje da mi pomogne nqma da mu se razsurdq:)

I drugo neshto koeto e che osven BackColor na obekti mi trqbva sushto da se zapomnq i visible na snimki(pictures) az probvah ei taka:

Private Sub Form_Load()
If Dir("Program.ini") <> "" Then
Dim strData As String
Open "Program.ini" For Input As #1
Line Input #1, strData: pic1.Visible = Val(strData)

Close #1
End If
End Sub

-samo che nishto ne stana ... tova e drugiqt mi osnoven problem i shte se radvam ako mi pomognete da go resha.

Blagodarq vi predvaritelno


Отговор
в отговор на beznadejden #2

Re: re: vb vupros

Що не ряботиш със регистъра човече.

Отговор
в отговор на beznadejden #3

Re: re: vb vupros

Имам нещо по добро само кажи къде да ти го пусна за да го дръпнеш.

Отговор
в отговор на MM #4

Re: re: vb vupros

Всъщност пробвай това.
VERSION 1.0 CLASS

Option Explicit
' Това го вкарай във класов модул - можеш също да го копилираш ката DLL
'ако искаш. А дайму име GetIni

Private Declare Function WritePrivateProfileString _
Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationname As String, ByVal lpKeyName As Any, _
ByVal lsString As Any, ByVal lplFilename As String) As Long
Private Declare Function GetPrivateProfileInt Lib _
"kernel32" Alias "GetPriviteProfileIntA" (ByVal lpApplicationname As String, _
ByVal lpKeyName As String, ByVal nDefault As Long, _
ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationname As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long

Private m_strFile As String ' for file name
Private m_AppName As String '
Public Property Get FileName() As String
FileName = m_strFile
End Property

Public Property Let FileName(ByVal strFile As String)
m_strFile = Trim(strFile)
End Property

Private Sub Class_Initialize()
m_strFile = ""
m_AppName = ""
End Sub

Public Property Get ApplicationKey() As String
ApplicationKey = m_AppName
End Property

Public Property Let ApplicationKey(ByVal strAppKey As String)
m_AppName = Trim(strAppKey)
End Property
Private Function fConvert(str As String) As String
Dim i As Integer
Dim strOP As String
Dim intAsc As Integer

str = Trim(str)

strOP = ""

For i = 1 To Len(str)
intAsc = Asc(Mid(str, i, 1))
If intAsc > 31 And intAsc < 127 Then _
strOP = strOP & Chr(intAsc)
Next
fConvert = strOP
End Function

Public Function GetValue(ByVal keyName As String, ByVal strDefault As String) As String
Dim strVal As String * 100
Dim ret As Long
ret = GetPrivateProfileString(m_AppName, keyName, strDefault, strVal, Len(strVal), m_strFile)
If ret <> 0 Then
GetValue = fConvert(strVal)
Else
GetValue = "Грешка"
End If
End Function
Public Function SetValue(ByVal keyName As String, ByVal strValue As String) As Boolean
Dim ret As Long

ret = WritePrivateProfileString(m_AppName, keyName, strValue, m_strFile)
If ret = 0 Then
SetValue = False
Exit Function
End If
SetValue = True

End Function
'============================================
Пример Form1

Option Explicit
Dim IniFile As New GetINI.Cini ' Referances GetIniValues.dll - Ако е копилиран _ като DLL

Dim N As Single
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Записва промените в файла
IniFile.FileName = App.Path & "\Color.ini" 'Пътя до файла - Ако няма фаил га създава
IniFile.ApplicationKey = "BackColors" ' Задава се име то на данните , за поголяма яснота
IniFile.SetValue "BackColor", Me.BackColor 'Запис на данни
Set IniFile = Nothing
End Sub
Private Sub Form_Load()
' Прочитане
On Error GoTo Ex ' В случай че се стартира за първи път
IniFile.FileName = App.Path & "\Color.ini" 'Пътя до файла
IniFile.ApplicationKey = "BackColors" ' Задава се име то на данните , за поголяма яснота
N = IniFile.GetValue("BackColor", "p") ' Данни
Me.BackColor = N ' Възтановяване на данните
Set IniFile = Nothing
Ex:
End Sub
Private Sub cmdColor_Click()
On Error GoTo EndSub
With dlgCommon
.CancelError = True
.DialogTitle = "Select Color"
.Color = Me.BackColor
.ShowColor
End With
Me.BackColor = dlgCommon.Color
EndSub:
End Sub






Отговор
в отговор на beznadejden #5

Re: re: vb vupros

ami s regedit ne bachkam shtoto pochti nishto ne razbiram ot vb:) sega se ucha.
Mnogo mersi za koda koito mi dadohte, no neshto ne moga da razbera za kakvo tochno stava vupros, mislq che shte e tobre da slojite i nqkoi drug komentar

Отговор
в отговор на beznadejden #6

Re: re: vb vupros

Мда, точно затова и ти подадох възможно най-опростения вариант. Но с твоите корекции допускаш логически грешки. Опитваш да четеш от файла нещо, което преди това не си записал.

Предложенията на другите - да ползваш регистъра са добри, но както вече споменах, регистъра не ми е удобен. Друго... файла WIN.INI е съставен от много настройки, и ако решиш да го отваряш като файл за четене - ще имаш проблеми. Ноооо, този въпрос не стои така с INI фйалове, които са само за една програма, и има само нейни настройки. Ето какво сглобих аз, което не само че е кратко за писане, но и е удобно просто за копиране в друга програма, и да бъдат променени само индивидуалните настройки...

(както споменах, когато публикувате сорс-код във клуба, заграждайте го в тагове ето така: [ pre ] пишеш кода [ /pre ]. Само че аз слагам вътре между [ ] и по един интервал сега, за да можете да ги видите, иначе ще изглежда ето така "
пишеш кода
")

---------------------------------
Private Sub SaveIni()

Open App.Path & "\subtitles converter.ini" For Output As #1
Print #1, "[GENERAL]"
Print #1, "FPS="; strFPS
Print #1, "LAST PATH="; strPathName
Print #1, "LANGUAGE="; strLanguage
Print #1, "SAVE POSITION="; Trim$(Str$(mnuPreferencesSave.Checked))
Print #1, "CYCLING REPLACE="; mnuReplaceCycling.Checked
Print #1, ""
Print #1, "[WINDOW POSITION]"
Print #1, "LEFT="; Trim$(Str$(frmMain.Left))
Print #1, "TOP="; Trim$(Str$(frmMain.Top))
Print #1, "WIDTH="; Trim$(Str(frmMain.Width))
Print #1, "HEIGHT="; Trim$(Str$(frmMain.Height))
Print #1, "STATE="; Trim$(Str$(frmMain.WindowState))
Close #1
End Sub

Public Sub LoadIni()
Dim strSetting As String
Dim strValue As String
Open App.Path & "\subtitles converter.ini" For Input As #1
Do Until EOF(1)
Line Input #1, strSetting
If InStr(strSetting, "=") <> 0 Then
strValue = Right$(strSetting, Len(strSetting) - InStr(strSetting, "="))
strSetting = Left$(strSetting, Len(strSetting) - Len(strValue))
Select Case strSetting
Case "FPS=": dblFPS = Val(strValue)
Case "LAST PATH=": strPathName = strValue
Case "LANGUAGE=": strLanguage = strValue
Case "LEFT=": intFormLeft = Val(strValue)
Case "TOP=": intFormTop = Val(strValue)
Case "WIDTH=": intFormWidth = Val(strValue)
Case "HEIGHT=": intFormHeight = Val(strValue)
Case "STATE=": frmMain.WindowState = Val(strValue)
Case "SAVE POSITION=": If strValue = "True" Then mnuPreferencesSave.Checked = True Else mnuPreferencesSave.Checked = False
Case "CYCLING REPLACE=": If strValue = "True" Then mnuReplaceCycling.Checked = True Else mnuReplaceCycling.Checked = False
End Select
End If
Loop
Close #1
End Sub

'В събитието Form_Load() пишеш и една маааалка проверка, дали съществува този файл:
Private Sub Form_Load()
'Check INI, and create if not exist
If Dir(App.Path & "\subtitles converter.ini") = "" Then
dblFPS = 25
strPathName = App.Path
strLanguage = "BGCC"
SaveIni
Else
LoadIni
End If
End Sub

------------------------------
Ето как изглежда INI файла:
[GENERAL]
FPS=23.976
LAST PATH=C:\Work\My movies
LANGUAGE=BGCC
SAVE POSITION=True
CYCLING REPLACE=True

[WINDOW POSITION]
LEFT=75
TOP=105
WIDTH=8970
HEIGHT=8115
STATE=0

Редовете в този файл, които са заградени със такива скоби [ ] са само за хубост. Те се записват от "SaveIni", но при четене се пропускат. За останалите редове първо се прави проверка за знака "=", и ако го има - се прави четене на настройките.

И така, ще ти се налага за разичните програми да правиш само корекции в името на файла, и редовете, които започват със "Print #1, ...", "Case ...".

Интелигентния начин да правиш INI е малко по-дълъг, и прилича на работата с регистъра. Т.е. Описваш "Section", това е групата, в която ще бъде записана, или търсена за четене настройка, после описваш наименованието на ключа, и след това извършваш писане или четене на тази настройка. В крайна сметка различното в резултата ще е, че така ще можеш да имаш два ключа с едно и също наименование, но в различни секции. В примера, който ти описах това не може да се прави. Не може да имаш два реда "TOP=10", "TOP=50". В този случай като приключи четенето на INI-то, за настройката TOP ще имаш стойност 50 (последно срещнатата).

Хайде опитай, и пиши пак.
ICQ-то ми е 34254941, ще ти е по-бързо и удобно ако се обадиш.

Щирлиц

----------------------------------
помислих, хареса ми, помислих пак...

Редактирано от Щиpлиц на

Отговор
в отговор на Щиpлиц #7

Re: re: vb vupros

Neznam, moje bi sum prekaleno glupav za da se zahvashtam s programirane! Toq celiq kod deto mi davate ama nishto ne moga da razbera:( Pulna skrub.
Imam sledniqt vupros kum vas:
Kakvo trqbva da se promeni na tozi kod ,za da zapomnq imeto na daden label?


Private Sub Form_Load()
If Dir("Program.ini") <> "" Then
Dim strData As String
Open "Program.ini" For Input As #1
Line Input #1, strData: lbl_name.caption = Val(strData)
Close #1
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Open "Program.ini" For Output As #1
Print #1, lbl_name.caption
Close #1
End Sub

Blagodarq vi predvaritelno! ;)


Отговор
в отговор на beznadejden #8

Re: re: vb vupros

;о)))))) приятел, кефиш ме...

този ред:
Print #1, lbl_name.caption

записва съдържанието на този Label като стринг.

В следващия момент:
lbl_name.caption = Val(strData)

ти се опитваш да върнеш обратно стринга във вид на число... ;о)))) та това дори не се води като логическа грешка, то си е синтактична грешка.

Сега малко теория:

intА = 5
strText = Trim(Str(intA))
-> това ще доведе до конвертиране на числото във вид на стринг,
подходящ за запис в текстово поле, във INI файл, във каквото и друго
стрингово си наумиш.

strText = "5"
intA = Val(strText)
-> това пък ще доведе до конвертиране на стринга към число.

Когато четеш стойността на свойството Caption на този Label, ти трябва да
си наясно че това е стринг. Записваш го в INI-то без корекции, но след това
като прочетеш INI-то, получаваш пак стринг. Ако е трябвало да бъде число, чак тогава ще го конвертираш, а в този случай просто го оставяш в оригинал.
Т.е.:
Line Input #1, strData: lbl_name.caption = strData

Хайде засега чао, и както ти казах - обади се по ICQ, за да не пълним клуба
с въпроси, касаещи самото начало на програмирането.

ICQ: 34254941

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на beznadejden #9

Re: re: vb vupros

Пробвали кода който ти дадох .

Отговор