Текстовый файл

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Текстовый файл

Сообщение oskolok_vatbI » 26.12.2008 (Пт) 17:08

Здравствуйте, вопрос у меня такой: Есть текстовый файл, в котором хранятся параметры бланков для одной программы. Он имеет такой вид:

[TopTitlePlanrectGraob0]
LeftPos=7.19999980926514
RightPos=7.19999980926514
DepthAlign=0
TopPos=1.75
BottomPos=3.45000004768372
TextActive=1
TextFont=Arial, 11, B, $800000
TextAngle=0
TextAlignKind=0
TextLine0=
TextLine1=''
TextLine2=''
TextLine3='CATEGORY'
LineActive=0
PictureActive=0
ImageActive=0

[TopTitlePlanrectGraob1]
LeftPos=0.400000005960464
RightPos=2.5
DepthAlign=0
TopPos=0.200000002980232
BottomPos=1.39999997615814
TextActive=0
LineActive=0
PictureActive=1
PictureFileName=
PictureView=3
PictureSourceAnd=0
ImageActive=0

… ну и так далее

Я, разбивая файл на строки через Split и сравнивая названия параметров, получаю их значения. Создаю Label-ы с LeftPos, TopPos, высчитываю их ширину и высоту через RightPos, BottomPos и добавляю их на форму. С этим всем я разобрался, но хотелось чтобы, изменив параметры у Label-а на форме, я мог записать их на нужные позиции в файле. Как решить такую задачу – я придумать не смог. Может у меня изначально неправильный подход ? Пожалуйста, посоветуйте, как мне решить эту проблему.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Текстовый файл

Сообщение Ramzes » 26.12.2008 (Пт) 17:14

INI тебе ни о чем не говорит?

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Текстовый файл

Сообщение oskolok_vatbI » 26.12.2008 (Пт) 17:28

К сожалению не о многом... Буду читать.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Текстовый файл

Сообщение Ramzes » 26.12.2008 (Пт) 17:40


Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Текстовый файл

Сообщение Joo » 27.12.2008 (Сб) 8:05

Юзай XML, или создай класс со всеми свойствами твоих лайбел, потом его (де)серялизуй
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Текстовый файл

Сообщение oskolok_vatbI » 27.12.2008 (Сб) 15:59

XML не пойдет, исходные файлы формируются в другой программе.
Для простоты создал себе такой вот файл:
Код: Выделить всё
[HEAD0]
top=10.9
left=20
width=30
height=40
text=test0

[HEAD1]
top=50
left=60
width=70
height=80
text=test1

[HEAD2]
top=90
left=100
width=110
height=120
text=test2

[HEAD3]
top=130
left=140
width=150
height=160
text=test3

[HEAD4]
top=170
left=180
width=190
height=200
text=test4


Беру из него значения, рисую label-ы и сохраняю так:
Код: Выделить всё
    Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias _
    "GetPrivateProfileIntA" (ByVal lpApplicationName As String, _
                             ByVal lpKeyName As String, _
                             ByVal nDefault As String, _
                             ByVal lpFileName As String) As Integer
    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _
    "GetPrivateProfileStringA" (ByVal lpAppName As String, _
                                ByVal lpKeyName As String, _
                                ByVal lpDefault As String, _
                                ByVal lpReturnedString As String, _
                                ByVal nSize As Integer, _
                                ByVal lpFileName As String) As Integer
    Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias _
    "WritePrivateProfileStringA" (ByVal Section As String, _
                                  ByVal Key As String, _
                                  ByVal putStr As String, _
                                  ByVal INIfile As String) As Integer

    Dim L() As Label
    Dim i As Long
    Private Function ReadINI(ByVal sSection As String, ByVal sKey As String, _
                             ByVal sIniFileName As String)
        Dim nLength As Integer
        Dim sTemp As String
        Dim lsTemp As Integer
        sTemp = Space(255)
        lsTemp = Len(sTemp)
        nLength = GetPrivateProfileString(sSection, sKey, "", sTemp, lsTemp, _
                                          sIniFileName)
        Return Microsoft.VisualBasic.Left(sTemp, nLength)
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i = 0 To 4
            Dim s1 As Integer = GetPrivateProfileInt("HEAD" + i.ToString, "top", 0, "C:\test.ini")
            Dim s2 As Integer = GetPrivateProfileInt("HEAD" + i.ToString, "left", 0, "C:\test.ini")
            Dim s3 As Integer = GetPrivateProfileInt("HEAD" + i.ToString, "width", 0, "C:\test.ini")
            Dim s4 As Integer = GetPrivateProfileInt("HEAD" + i.ToString, "height", 0, "C:\test.ini")
            Dim s5 As String = ReadINI("HEAD" + i.ToString, "text", "C:\test.ini")

            'Добавляю Label-ы
            Dim TmpLabel As Label
            TmpLabel = New Label
            TmpLabel.AutoSize = False
            TmpLabel.BorderStyle = BorderStyle.FixedSingle
            TmpLabel.Top = s1
            TmpLabel.Left = s2
            TmpLabel.Height = s3
            TmpLabel.Width = s4
            TmpLabel.Text = s5
            Me.Controls.Add(TmpLabel)
            ReDim Preserve L(i + 1)
            L(i) = TmpLabel
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'сохраняю в новый файл
        For i = 0 To 4
            WritePrivateProfileString("HEAD" + i.ToString, "top", L(i).Top, "C:\test1.ini")
            WritePrivateProfileString("HEAD" + i.ToString, "left", L(i).Left, "C:\test1.ini")
            WritePrivateProfileString("HEAD" + i.ToString, "width", L(i).Height, "C:\test1.ini")
            WritePrivateProfileString("HEAD" + i.ToString, "height", L(i).Width, "C:\test1.ini")
            WritePrivateProfileString("HEAD" + i.ToString, "text", L(i).Text, "C:\test1.ini")
            My.Computer.FileSystem.WriteAllText("C:\test1.ini", vbCrLf, True)
        Next
    End Sub

Тут-то я заранее знаю, что у меня всего 5 секций, а как вообще узнать сколько их всего ? Ну и так, может еще какие ошибки есть в написаном.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Текстовый файл

Сообщение Ramzes » 27.12.2008 (Сб) 19:04

oskolok_vatbI, ты мой пост вообще видел?

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Текстовый файл

Сообщение sergey-911 » 29.12.2008 (Пн) 13:24

oskolok_vatbI писал(а):Тут-то я заранее знаю, что у меня всего 5 секций, а как вообще узнать сколько их всего ? Ну и так, может еще какие ошибки есть в написаном.

Думаю, что количество ключей и их названия ты просто так не прочитаешь из ini-файла.
Придется воспользоваться промежуточным результатом. Попробуй считать весь ini-файл в текстофую переменную и поработать с морфологией. Посчитай сколько в переменной значков "[", затем извлеки в массив ключи (ключ расположен в символах "[" & "]"). Умнее ничего не придумал. Возможно такой подход будет подтормаживать, зато работать.
С уважением, Сергей.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Текстовый файл

Сообщение iGrok » 29.12.2008 (Пн) 15:01

Ramzes, они на свет лезут! =)

sergey-911, вообще-то в [] - имена секций а не ключей. А с ини вручную работать не надо. Всё уже давно написано..

Коллеги, я с вас фигею! Что, реально никто так и не удосужился нормально про работу с ИНИ-файлами почитать?

GetPrivateProfileSectionNames. Остальное поиском.
label:
cli
jmp label

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Текстовый файл

Сообщение sergey-911 » 29.12.2008 (Пн) 21:54

iGrok писал(а):Ramzes, они на свет лезут! =)

sergey-911, вообще-то в [] - имена секций а не ключей. А с ини вручную работать не надо. Всё уже давно написано..

Коллеги, я с вас фигею! Что, реально никто так и не удосужился нормально про работу с ИНИ-файлами почитать?

GetPrivateProfileSectionNames. Остальное поиском.


Согласен игрок. :oops:
У меня не было никогда задачи вывести значения секций.
GetPrivateProfileSectionNames - весьма позновательно.
С уважением, Сергей.

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Текстовый файл

Сообщение oskolok_vatbI » 30.12.2008 (Вт) 6:43

Давайте все-таки попробуем добить этот вопрос. На форуме, вот тут, лежит класс для работы с ini-файлами. Скачал, подцепил в проект, теперь пробую так:
Код: Выделить всё
    Private Sub ReadINIFile()
    Dim iniOpen As New IniFile("C:\test.ini")

        AllHeads = iniOpen.ReadSections 'получаю массив имен секций
        For i = 1 To UBound(AllHeads)
            If Microsoft.VisualBasic.Left(AllHeads(i), Len("TopTitlePlanrectGraob")) = "TopTitlePlanrectGraob" Then
                AllKeys = iniOpen.ReadSection(AllHeads(i)) 'получаю массив имен ключей
                For j = 0 To UBound(AllKeys)
                     Select Case AllKeys(j)  'по имени секции получаю ее значение
                        Case "TopPos"
                            TopPos = iniOpen.ReadString(AllHeads(i), AllKeys(j))
                        Case "LeftPos"
                            LeftPos = iniOpen.ReadString(AllHeads(i), AllKeys(j))
                        Case "RightPos"
                            RightPos = iniOpen.ReadString(AllHeads(i), AllKeys(j))
                        Case "BottomPos"
                            BottomPos = iniOpen.ReadString(AllHeads(i), AllKeys(j))
                        Case "TextLine0"
                            TextPos = iniOpen.ReadString(AllHeads(i), AllKeys(j))
                    End Select
                Next

                'добавляю Label-ы
                tmpLabel = New Label
                tmpLabel.AutoSize = False
                tmpLabel.Name = AllHeads(i)
                tmpLabel.Left = Val(LeftPos) * 50
                tmpLabel.Top = Val(TopPos) * 50
                tmpLabel.Width = Val(RightPos) * 50 - Val(LeftPos) * 50
                tmpLabel.Height = Val(BottomPos) * 50 - Val(TopPos) * 50
                tmpLabel.Text = TextPos
                tmpLabel.BorderStyle = BorderStyle.FixedSingle
                tmpLabel.BackColor = Color.White
                tmpLabel.TextAlign = ContentAlignment.MiddleCenter

                AddHandler tmpLabel.Click, AddressOf Label_ClickHandler
                Me.Controls.Add(tmpLabel)
                ReDim Preserve L(i)
                L(i) = tmpLabel
            End If
        Next
    End Sub

Так делать правильно ?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList  
cron