Вопрос по массивам

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

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

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.05.2007 (Сб) 10:45

Вообще-то вот здесь должна быть ошибка, поскольку массив не инициализирован:
Код: Выделить всё
CRTBarray(i1) = cont



Да я уже видел, понял и задал длину массива CRTBarray(120).

Во-вторых, непонятен смысл переобхявления элемента
Код: Выделить всё
el = New ChemElemCell.ChemElemCell



Взято из 6-ого сообщения этого топика (спасибо Nord777).
Перед точкой пространство имен ChemElemCell (это откомпилированая библиотека моего контрола), а после точки сам объект
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 13.05.2007 (Вс) 1:01

Пример.
На форме имеются разные контролы. Добавим в рантайме 4 кнопки и
изменим у этих кнопок свойства Text и Tag значениями из файла.
Вариантов много. Один из них:
Код: Выделить всё
Imports System.IO

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim B As Button
        For i As Integer = 1 To 4
            B = New Button
            B.Name = "Name" & i.ToString
            B.Location = New Point(10, 10 + B.Height * (i - 1))
            AddHandler B.Click, AddressOf BClick
            Me.Controls.Add(B)
        Next
        Test1()
    End Sub

    Private Sub BClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MsgBox(DirectCast(sender, Button).Tag)
    End Sub

    Private Sub Test1()

        Dim Props() As String = Nothing
        Dim SplitChars() As Char = New Char() {" "c, Chr(9)}
        Dim Lines() As String = File.ReadAllLines("table.txt")

        Dim B As Button = Nothing
        Dim tmp() As Control = Nothing

        For Each Line As String In Lines
            Props = Line.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries)
            If Props.Length <> 3 Then MsgBox("Ошибка в структуре файла") : Exit Sub
            tmp = Me.Controls.Find(Props(0), False)
            If tmp.Length <> 0 Then
                B = tmp(0)
                B.Text = Props(1)
                B.Tag = Props(2)
            End If
        Next

    End Sub

End Class

Содержимое файла table.txt:
Код: Выделить всё
Name1   Text1   tag1
Name2   Text2   tag2   
Name3   Text3   tag3
Name4   Text4   tag4
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 13.05.2007 (Вс) 13:32

Спасбо! Щас буду тестить
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 14.05.2007 (Пн) 7:33

В общем вот такой в итоге вышел код. Но когда он доходит до цикла For Each c In Control он говорит "Specefied cast is not valid" и читает токо первую строчку.

Код: Выделить всё

        Dim f As System.IO.StreamReader
        Dim c As ChemElemCell.ChemElemCell
        Dim Props() As String = Nothing
        Dim Lines(), text As String

        If System.IO.File.Exists("table.txt") Then
            f = System.IO.File.OpenText("table.txt")

            Try
                text = f.ReadToEnd
                Lines = text.Split(Chr(8))

                For Each Line As String In Lines

                    Props = Line.Split(" - ")

                    For i As Integer = 0 To 5
                        c = New ChemElemCell.ChemElemCell
                        c.Name = "cec" & Props(0)
                        c.Location = New Point(80 + c.Size.Width * i, tbpMend.Location.Y + 68)
                        Me.Controls.Add(c)
                        c.BringToFront()
                    Next

                Next

                For Each c In Controls
                    c.GradientColor1 = Color.OrangeRed
                    c.GradientColor2 = Color.Orange
                    c.ElementSymbol = Props(0)
                    c.ElementNum1 = Props(1)
                Next


            Catch ex As Exception
                MessageBox.Show("Произошла следующая ошибка: " & ex.Message, "UCIS", _
                                MessageBoxButtons.OK, MessageBoxIcon.Error, _
                                MessageBoxDefaultButton.Button1)
            End Try

        Else
            MessageBox.Show("К сожалению не найден файл Katalog.txt.", "Ошибка", _
                MessageBoxButtons.OK, MessageBoxIcon.Error, _
                MessageBoxDefaultButton.Button1)
        End If
        f.Close()


Вопросы:
1) как сделать чтоб читал строчки по порядку
2) как вылечить ошибку

Это срочно! Всем спасибо за помощь!
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 14.05.2007 (Пн) 7:56

Да, еще сюда же вопрос:

у меня на форме несколько вкладок, когда я их переключаю ячейки видны поверх них

c.Parent = tbpMend (имя вкладки) не канает

Как можно контрол программно присвоить другому элементу-контейнеру?
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 14.05.2007 (Пн) 8:42

Код: Выделить всё
    For Each c In Controls
       c.GradientColor1 = Color.OrangeRed
       c.GradientColor2 = Color.Orange
       c.ElementSymbol = Props(0)
       c.ElementNum1 = Props(1)
    Next
И какая нужда заставила тебя вынести это в отдельный цикл.
А вобще это просто ужас, такое впечатление что ты пишешь методом тыка, не понимая то, чего ты пишешь.
Сливай свой проект вместе с файлом - думать будем.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 14.05.2007 (Пн) 9:23

Код: Выделить всё
For Each c In Controls
    c.GradientColor1 = Color.OrangeRed
    c.GradientColor2 = Color.Orange
    c.ElementSymbol = Props(0)
    c.ElementNum1 = Props(1)
Next


Надо полагать, что у тебя не только элементы типа ChemElemCell.ChemElemCell на форме? Вот и получаешь ошибку неправильного приведения типов. Проверяй тип контрола или помещай нужные в отдельный массив.
Весь мир матрица, а мы в нем потоки байтов!

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 14.05.2007 (Пн) 11:15

Вот полный проект
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 14.05.2007 (Пн) 11:51

Вот полный проект

И где же он? Ты его в шапку-невидимку завернул?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 14.05.2007 (Пн) 17:16

Ниче не понял сори щас еще раз прикреплю (вообще-то прошлый раз тоже прикреплял) :?
Вложения
UCIS.rar
(1.1 МиБ) Скачиваний: 100
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 14.05.2007 (Пн) 20:46

Код: Выделить всё
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer = 0
        Dim c As ChemElemCell.ChemElemCell
        Dim Props() As String = Nothing
        Dim Lines() As String = Nothing
        Dim text As String = ""
        Dim X, Y As Integer
        Const CellsPerLine As Integer = 8
        Const TableX As Integer = 80
        Const TableY As Integer = 60

        Try
            Lines = System.IO.File.ReadAllLines("table.txt")

            For Each Line As String In Lines

                Props = Line.Split(New String() {" - "}, _
                StringSplitOptions.RemoveEmptyEntries)
                c = New ChemElemCell.ChemElemCell
                c.Name = "cec" & Props(0)

                X = TableX + c.Size.Width * (i Mod CellsPerLine)
                Y = TableY + (i \ CellsPerLine + 1) * c.Height
                c.Location = New Point(X, Y)

                c.GradientColor1 = Color.OrangeRed
                c.GradientColor2 = Color.Orange
                c.ElementSymbol = Props(0)
                c.ElementNum1 = Props(1)

                tbpMend.Controls.Add(c)

                If i = 63 Then Exit Sub
                i = i + 1
            Next

        Catch Ex As IO.FileNotFoundException
            MsgBox("К сожалению не найден файл Table.txt.", _
            MsgBoxStyle.Critical, "Ошибка")
        Catch ex As Exception
            MsgBox("Произошла следующая ошибка: " & ex.Message, _
            MsgBoxStyle.Critical, "Ошибка")
        Finally
            Me.Focus()
        End Try

    End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 14.05.2007 (Пн) 21:14

Теперь по поводу комбобокса.
В SozVech.vb пишешь:
Код: Выделить всё
    Public Sub New(ByVal mainForm As Form1)
        Me.New()
        glavn = mainForm
    End Sub

Там же в процедуре cmdOk1_Click стираешь строку:
Код: Выделить всё
glavn = New Form1

Далее Form1.vb
Код: Выделить всё
    Private Sub cmdDob_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDob.Click
        Dim sv As Form = New SozVech(Me)
        sv.ShowDialog()
    End Sub

и тоже самое в процедуре MenuItem41_Click
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 15.05.2007 (Вт) 12:19

Спасибо большое! В коде разобрался...
Но у меня студия упорно подчеркивает строчку StringSplitOptions и ReadAllLines. Может это фича из VS2005 (у меня 2003) или в чем дело?
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 15.05.2007 (Вт) 12:34

В конструкторе (SozVech.vb) он подчеркивает Me.New() говоря, что не установлен аргумент для параметра. Я попробовал подставить glavn в скобки - говорит конструктор не может вызывать сам себя. :(
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 15.05.2007 (Вт) 18:36

Я что-то не подумал что ты можешь обломаться. К хорошему быстро привыкаешь. ))
Regex прокатит.
вместо
Код: Выделить всё
Lines = System.IO.File.ReadAllLines("table.txt")
ставь
Код: Выделить всё
            Dim SR As New IO.StreamReader("Table.txt")
            Lines = Regex.Split(SR.ReadToEnd, vbCrLf)
а вместо
Код: Выделить всё
                Props = Line.Split(New String() {" - "}, _
                StringSplitOptions.RemoveEmptyEntries)
ставь
Код: Выделить всё
Props = Regex.Split(Line, " - ")

в SozVech.vb :
Код: Выделить всё
    Public Sub New(ByVal mainForm As Form1)
        MyBase.New()
        InitializeComponent()
        glavn = mainForm
    End Sub

Вроде все правильно
и не забудь
Код: Выделить всё
Imports System.Text.RegularExpressions

Если с перегрузкой конструктора не прокатит - тогда жди что тебе ответят у кого есть VS2003. Я уже не помню как там пергрузить.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 16.05.2007 (Ср) 21:10

Все сканало ошибки пока не видит. Спасибо! :) Тестить буду позже. Результаты скажу...
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 19.05.2007 (Сб) 11:52

ПО комбобоксам: процедура вызова SozVesh у меня находится в отдельном модуле:
Код: Выделить всё
    Public Sub sozves()
        Dim sv As form = New SozVech()
        sv.Show()
    End Sub

он потребовал аргумент, я поставил в скобки glavn и в резултате ничего так и не происходит.

По таблице: настроил так, чтобы первые два были сверху, а сейчас надо еще, чтобы как в норм таблице в длинных периодах добавлялись две клетки. Это сделать я тоже сделал, но у меня остаются пустые места в следующем ряду. Скажите как это можно сделать.

Вот код на данном этапе:
Код: Выделить всё

        Dim i As Integer = 0
        Dim c As ChemElemCell.ChemElemCell
        Dim Props() As String = Nothing
        Dim Lines() As String = Nothing
        Dim text As String = ""
        Dim X, Y As Integer
        Dim tempD1, tempD2, tempD3, tempD4 As Decimal
        Const CellsPerLine As Integer = 8
        Const TableX As Integer = 49

        Try
            Dim SR As New IO.StreamReader("Table.txt")
            Lines = Regex.Split(SR.ReadToEnd, vbCrLf)

            For Each Line As String In Lines

                Props = Regex.Split(Line, " - ")
                c = New ChemElemCell.ChemElemCell
                tempD1 = CDec(Props(1))
                tempD1 = Math.Round(tempD1, 3)
                tempD2 = CDec(Props(2))
                tempD2 = Math.Round(tempD2, 3)

                If i = 0 Then
                    X = TableX + c.Size.Width * 6
                    Y = (i \ CellsPerLine + 1) * c.Height
                    c.Location = New Point(X, Y)
                ElseIf i = 1 Then
                    X = TableX + c.Size.Width * 7
                    Y = (i \ CellsPerLine + 1) * c.Height
                    c.Location = New Point(X, Y)
                    c.GradientColor1 = Color.ForestGreen
                    c.GradientColor2 = Color.LawnGreen
                Else
                    X = TableX + c.Size.Width * ((i - 2) Mod CellsPerLine)
                    Y = ((i + 6) \ CellsPerLine + 1) * c.Height
                    c.Location = New Point(X, Y)
                End If


                If Props(7) = "гал" Then
                    X = TableX + c.Size.Width * ((i - 2) Mod CellsPerLine)
                    Y = ((i + 6) \ CellsPerLine + 1) * c.Height
                    c.Location = New Point(X, Y)
                    c.GradientColor1 = Color.Blue
                    c.GradientColor2 = Color.Azure
                    'закончилась установка цвета галогенов

                    'и т д по остальным группам
                    'я дописал в файл еще одну колонку с обозначениями групп веществ
                End If

                c.Name = "cec" & Props(0)

                c.ElementSymbol = Props(0)
                c.ElementNumber = Props(6)
                c.ElementName = Props(4)
                c.ElementLatinName = Props(5)
                c.ElementNum1 = tempD1
                c.ElementNum2 = tempD2

                tbpMend.Controls.Add(c)

                If i = 70 Then Exit Sub
                i = i + 1
            Next

Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 19.05.2007 (Сб) 12:57

У есть возможность и желание помочь тебе, но я не химик и не телепат, поэтому нужен измененный Table.txt
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 19.05.2007 (Сб) 13:27

AnarCky писал(а):он потребовал аргумент, я поставил в скобки glavn и в резултате ничего так и не происходит

Кто он? в какие скобки?

Nord777 писал(а):Далее Form1.vb
Код: Выделить всё
    Private Sub cmdDob_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDob.Click
        Dim sv As Form = New SozVech(Me)
        sv.ShowDialog()
    End Sub

и тоже самое в процедуре MenuItem41_Click

Я же написал как сделать. Зачем ты в этих обработчиках продолжаешь использовать Call Sozves() ??

хорошо, давй еще раз напишу.
Form1.vb:
Код: Выделить всё
    Private Sub MenuItem41_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem41.Click
        Dim sv As Form = New SozVech(Me)
        sv.ShowDialog()
    End Sub
    Private Sub cmdDob_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDob.Click
        Dim sv As Form = New SozVech(Me)
        sv.ShowDialog()
    End Sub


SozVech.vb:
Код: Выделить всё
    Public Sub New(ByVal mainForm As Form1)
        MyBase.New()
        InitializeComponent()
        glavn = mainForm
    End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 20.05.2007 (Вс) 8:12

Я же написал как сделать. Зачем ты в этих обработчиках продолжаешь использовать Call Sozves() ??

Извини ступил :oops: Забыл посмотреть это сообщение
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 20.05.2007 (Вс) 8:18

Все равно ничего не добавляет в комбо бокс. В файл все пишет, я дохожу до кнопки Готово жму, SozVesh исчезает и все в боксе пусто. :(
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.05.2007 (Вс) 10:18

А ты выпадающий список у комбобокса открывал?
У комбобокса есть чудесные свойства: SelectedIndex, SelectedText, SelectedItem, SelectedValue и ты не использовал их в своей проге
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 20.05.2007 (Вс) 10:26

Естесно открывал! Все пусто. А причем тут эти свойства? как их можно здесь использовать? И смысл...
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.05.2007 (Вс) 11:26

Я уж даже и не знаю как еще обьяснять....
:? Вобщем пиши мне в личку, скинь свой проект в нынешнем состоянии - разберемся. можешь в асю постучаться.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Пред.

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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 66

    TopList