forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Visual Basic (http://forum.boolean.name/forumdisplay.php?f=62)
-   -   Проблемы с переводом (http://forum.boolean.name/showthread.php?t=12664)

Лit}{Ъ 13.06.2010 06:48

Проблемы с переводом
 
Напрод, я вот пытаюсь перевести прогу с 6 вб на 2010 (из VisualStudio). На данный момент исправленны почти все проблеммы, кроме следующей: Прога что то криво связывается по классам, т.е. (описываю свои действия) Бывшие *.bas модули одзываю *.vb грохаю нафиг "Attribute VB_Name=" в модулях, присоединяю к проекту и окружаю текст каждого модуля сторками Public Class ****(имя модуля) и End Class. Проблемма следующая, из классов корректно везде используются только Типы (бывшие в вб 6.0 Type ныне Structure) и константы. Переменные же, функции и процедуры (Всё Public - классы, и они сами) не читабтся в упор, даже при прописывании ИмяМодуля.Функция (Со Structure именно так и сработало). Подскажите плиз чё делать? :SOS:

pax 13.06.2010 10:49

Ответ: Проблемы с переводом
 
Для решения проблемы надо использовать Shared модификатор. Т.к. каласс - это объект, чтобы воспользоваться его функциями - надо либо создать его экземпляр, либо сделать все его методы/поля Shared (общедоступными).

Ключевое слово Shared

т.е. объявлять все эти функции и поля так:
Код:

Public Shared Function Func() As Integer
....
End Function

Public Shared FieldName as Integer


Лit}{Ъ 13.06.2010 12:46

Ответ: Проблемы с переводом
 
Огромное спасибо :super: ! Я ужепытался классы в Strukture пихать и описывать такую переменную в каждом классе (так функции с прцедурами работали:-) ). Уфф.. Проблемой меньше...

Лit}{Ъ 13.06.2010 12:51

Ответ: Проблемы с переводом
 
Вопрос любознательного человека - Что именно подразумевается под этими ставами?

Цитата:

Сообщение от pax (Сообщение 150146)
создать его экземпляр

Вы имели ввиду тупое копирование функции или что то иное?

pax 13.06.2010 16:58

Ответ: Проблемы с переводом
 
Я имел ввиду создание объекта:
Код:

Class Foo

  Public myField as Integer

End Class

'Другой класс использует первый как экземпляр

Class Boo

  Public myFoo as Foo = new Foo()

  Public Sub SetFooValue( Value as Integer)
      myFoo.myField = Value;
  End Sub

  Public Function GetFooValue() as Integer
      Return myFoo.myField;
  End Function

End Class

Сто лет на бэйсике не писал, так что могу ошибок наделать, но смотрится вроде правильно ))

Лit}{Ъ 13.06.2010 21:00

Кстати, я правильно понял, что Public - это значит доступен из всех классов в данном *.vb файле, а Shared доступен из всех *.vb файлов? И Как будет работать Private Shared (если верить мануалу, так можно).

ППЦ. Ошибка "Cannot refer to an instanse member of a class from within a shared mamber initializer without an explicit instanse of the class" - вылазит когда я пытаюсь воспользоватся внутриклассовой функцией (Private) , Что не так? (Внеклассовые работают ОК)

Подскажите есть ли возможность в Structure описать массив фиксированного размера? Если есть то как?

Hurrit 13.06.2010 22:45

Ответ: Проблемы с переводом
 
слушай чувак, не надо так много постов подряд писать, можно же предыдущие изменять

pax 14.06.2010 00:06

Ответ: Проблемы с переводом
 
Public - видимость членов класса внутри и вне класса для его экземпляров.
Private - видимо тока внутри класса.
Shared - объявление членов для всех экземпляров, т.е. общих.

Например допустим что у нас есть класс, описывающий данные отдельного человека:
Код:

Public Class Person
  Public Name As String
  Public Email As String
End Class

Можно создать два экземпляра для двух разных людей и не Shared поля будут предоставлять различные данные для каждого из них:

Код:

Dim Person1 As Person = New Person ()
Person1.Name = "Лit}{Ъ"
Person1.Email = "Лit}{Ъ@blabla.ru"

Dim Person2 As Person = New Person ()
Person2.Name = "PAX"
Person2.Email = "[email protected]"

Допустим теперь, что класс Person имеет общедоступный метод, к которому можно обращаться без создания экземпляров этого класса. Например представим, что у нас есть база данных с уже сохраненными этими двумя людьми, описанными выше. И есть метод, который из базы данных может по электронному адресу человека создать экземпляр записи базы данных со всеми заполненными полями. Выглядело бы это следующим образом:

Код:

Public Class Person
  Public Name As String
  Public Email As String
  Public Shared Function GetPersonFromDB(email As String) As Person
    Dim Person1 As Person = New Person ()
    ' далее поиск по базе данных
    '...
    ' назначение полей
    Person1.Name = dataRow["Name"].ToString()
    Person1.Email = dataRow["Email"].ToString()
    Return Person1
  End Function
End Class


А использование уже где-то из вне можно было бы выполнить следующим образом:
Код:

Dim Person1 As Person = Person.GetPersonFromDB("Лit}{Ъ@blabla.ru")
Dim Person2 As Person = Person.GetPersonFromDB("[email protected]")

Т.е. работать уже с функцией самого класса, а не с его экземпляром.

Надеюсь объяснить смог )))

Лit}{Ъ 14.06.2010 06:49

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от Hurrit (Сообщение 150181)
слушай чувак, не надо так много постов подряд писать, можно же предыдущие изменять

Сори... Учту

Лit}{Ъ 01.07.2010 16:30

Ответ: Проблемы с переводом
 
Ещё одина прозьба. Если не сложно - пожалуйста напишите аналог следующего текста.
Open "C:\1.txt" for input as #1
input #1, a
input #1, b
Close #1
Зарание сенкаса!

SBJoker 01.07.2010 16:40

Ответ: Проблемы с переводом
 
неплохо бы указывать на какой вам язык перевести ;)
Чисто алгоритмически:
Открыть файл "C:\1.txt" для чтения с идентификатором 1 (хотя это быдлокод ппц какой)
прочитать из файла значение в переменную a (от типа переменной будет зависеть число прочитаных байт и интерпретация их)
прочитать из файла значение в переменную b
закрыть файл

Лit}{Ъ 01.07.2010 18:33

Ответ: Проблемы с переводом
 
Я не в том смысле! На русском я и так знаю. Как это звучит на VB 2010?

Спустя некоторое время...

Всё, решение найдено, на случай если кто пойдёт по моим стопам - код следующий.
Microsoft.VisualBasic.FileOpen(1, "C:\1.txt", OpenAccess.Read)
Microsoft.VisualBasic.Input(1, a)
Microsoft.VisualBasic.Input(1, b)
Microsoft.VisualBasic.FileClose(1)

Кста, можно сделать так чтобы он не ругался на строку
"With Microsoft.VisualBasic"? Геморно каждый раз писать...

И ещё - вопрос к Joker. Почему быдлокод то?

SBJoker 02.07.2010 00:27

Ответ: Проблемы с переводом
 
Быдло код потому что в строке открытия файла прописан хендл открытого файла жестко, так делать нельзя может так случится что не будет он доступен.
Для получения валидного хендла файла есть функция h = FreeFile
Которая занесёт в переменную h свободный id файла.

Лit}{Ъ 02.07.2010 08:24

Ответ: Проблемы с переводом
 
Ещё один вопрос - Чем OpenAcces.Read отличается от OpenMode.Input (в случае чтения файлов)?

SBJoker 02.07.2010 10:39

Ответ: Проблемы с переводом
 
Блин ты на каком языке пишешь для начала? Узать костыль совместимости со старым VB это верх идиотизма при наличии прекрасного BinaryReader.

Отличие в том что разрешениена чтение почти всегда гарантировано получишь у системы в вот на Чтение/Запись могут и отказать.


Часовой пояс GMT +4, время: 16:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot