Проблемы с переводом
Напрод, я вот пытаюсь перевести прогу с 6 вб на 2010 (из VisualStudio). На данный момент исправленны почти все проблеммы, кроме следующей: Прога что то криво связывается по классам, т.е. (описываю свои действия) Бывшие *.bas модули одзываю *.vb грохаю нафиг "Attribute VB_Name=" в модулях, присоединяю к проекту и окружаю текст каждого модуля сторками Public Class ****(имя модуля) и End Class. Проблемма следующая, из классов корректно везде используются только Типы (бывшие в вб 6.0 Type ныне Structure) и константы. Переменные же, функции и процедуры (Всё Public - классы, и они сами) не читабтся в упор, даже при прописывании ИмяМодуля.Функция (Со Structure именно так и сработало). Подскажите плиз чё делать? :SOS:
|
Ответ: Проблемы с переводом
Для решения проблемы надо использовать Shared модификатор. Т.к. каласс - это объект, чтобы воспользоваться его функциями - надо либо создать его экземпляр, либо сделать все его методы/поля Shared (общедоступными).
Ключевое слово Shared т.е. объявлять все эти функции и поля так: Код:
Public Shared Function Func() As Integer |
Ответ: Проблемы с переводом
Огромное спасибо :super: ! Я ужепытался классы в Strukture пихать и описывать такую переменную в каждом классе (так функции с прцедурами работали:-) ). Уфф.. Проблемой меньше...
|
Ответ: Проблемы с переводом
Вопрос любознательного человека - Что именно подразумевается под этими ставами?
Цитата:
|
Ответ: Проблемы с переводом
Я имел ввиду создание объекта:
Код:
Class Foo |
Кстати, я правильно понял, что 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 описать массив фиксированного размера? Если есть то как? |
Ответ: Проблемы с переводом
|
Ответ: Проблемы с переводом
Public - видимость членов класса внутри и вне класса для его экземпляров.
Private - видимо тока внутри класса. Shared - объявление членов для всех экземпляров, т.е. общих. Например допустим что у нас есть класс, описывающий данные отдельного человека: Код:
Public Class Person Код:
Dim Person1 As Person = New Person () Код:
Public Class Person А использование уже где-то из вне можно было бы выполнить следующим образом: Код:
Dim Person1 As Person = Person.GetPersonFromDB("Лit}{Ъ@blabla.ru") Надеюсь объяснить смог ))) |
Ответ: Проблемы с переводом
Цитата:
|
Ответ: Проблемы с переводом
Ещё одина прозьба. Если не сложно - пожалуйста напишите аналог следующего текста.
Open "C:\1.txt" for input as #1 input #1, a input #1, b Close #1 Зарание сенкаса! |
Ответ: Проблемы с переводом
неплохо бы указывать на какой вам язык перевести ;)
Чисто алгоритмически: Открыть файл "C:\1.txt" для чтения с идентификатором 1 (хотя это быдлокод ппц какой) прочитать из файла значение в переменную a (от типа переменной будет зависеть число прочитаных байт и интерпретация их) прочитать из файла значение в переменную b закрыть файл |
Ответ: Проблемы с переводом
Я не в том смысле! На русском я и так знаю. Как это звучит на 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. Почему быдлокод то? |
Ответ: Проблемы с переводом
Быдло код потому что в строке открытия файла прописан хендл открытого файла жестко, так делать нельзя может так случится что не будет он доступен.
Для получения валидного хендла файла есть функция h = FreeFile Которая занесёт в переменную h свободный id файла. |
Ответ: Проблемы с переводом
Ещё один вопрос - Чем OpenAcces.Read отличается от OpenMode.Input (в случае чтения файлов)?
|
Ответ: Проблемы с переводом
Блин ты на каком языке пишешь для начала? Узать костыль совместимости со старым VB это верх идиотизма при наличии прекрасного BinaryReader.
Отличие в том что разрешениена чтение почти всегда гарантировано получишь у системы в вот на Чтение/Запись могут и отказать. |
Ответ: Проблемы с переводом
Я вроде сказал. Перевожу программу с VB 6.0 на VB 2010.
Я что то не понял смысла второго прндложения, можно на чуть более руском? |
Ответ: Проблемы с переводом
что не понятно? для того чтобы сделать Read|Write, если такого файла нет, прога попытается его создать, что, если у юзера нету прав на создание этого файла, в этом месте, повлечёт за собой обвал программы, или вылет до ближайшего обработчика.
|
Ответ: Проблемы с переводом
Я вообшето спрашивал про второе предложение а не про вторую строчку! Сажу подругому - что значит:" Узать костыль совместимости со старым VB это верх идиотизма при наличии прекрасного BinaryReader."
Что за BinaryReader и костыль совместимости? |
Ответ: Проблемы с переводом
Костыль совместимости это Microsoft.VisualBasic.*
BinaryReader - это средство бинарного чтения из потоков данных, например из файловых потоков, в структуре Net Framework. Для операций ввода/вывода в Net обычно используются классы пространства имен System.IO |
Ответ: Проблемы с переводом
Кто нибудь знает как в 2010 называются константы с кодами клавиш? В 6.0 были vbKeyLeft, vbKeyUp, vbKeyW а здесь как? (Подскажите пудь до класса содержащего оные)
|
Ответ: Проблемы с переводом
Ну если использовать события Windows.Forms, то тебе нужно перечисление System.Windows.Forms.Keys
|
Ответ: Проблемы с переводом
Спс...
Подскажите пожалуйста как в ВБ 2010 ведётся отладка! Я исправил все ошибки компиляции выставляю Solution Configurations на Debug жму F5 - результат чёрный экран, курсор часиками, загрузка цп сначала поднимается до 100 потом падает до нуля и ничего не происходит! Открываю диспетчер - процес проекта (который уже запущенная форма) не отвечает (просто свернуть не получается) - завершаю - у окошка Vb на секунду появляется сообщение об ошибке с решениями и сразу проподает... Что я не так делаю?:''(( |
Ответ: Проблемы с переводом
Черный экран? В смысле консоль? Приложение Windows.Forms или консольное?
|
Ответ: Проблемы с переводом
Windows Forms. С Директ Х в фул скрине.
|
Ответ: Проблемы с переводом
Код главного цикла посмотреть можно? Как он реализован?
|
Ответ: Проблемы с переводом
А что считать главным циклом? У меня там всё через таймеры (приложение должно неприрывно реиндинговать и отображать картинку).
Вопрос вообще в том как настроить ВБ в режим отладки. 6.0 при таких случаях после завершения работы выделял строчку на которой стопорнулся и объяснял суть ошибки - как добится этого от 2010? |
Ответ: Проблемы с переводом
Таймерами никто не делает, главный цикл - это цикл отрисовки. Мне кажется в Managed.DirectX должен быть каркас приложения, вызывающий функции отрисовки во время простоя приложения, когда нет оконных сообщений.
|
Ответ: Проблемы с переводом
??? :4to: Жуть! Я думал циклы используются только в ДОС приложениях или конечных программмах. Все исходники что я видел были с таймерами. Вот я ими и пользуюсь раз в N милисекунд обновляю картинку на экране и радуюсь!
А почему не делают то? |
Ответ: Проблемы с переводом
Я раз в 30 милли секунд обращаюсь к
Код:
Private Shared Sub Reinder_Timer() |
Ответ: Проблемы с переводом
Потому что между значений с таймерами может случиться перерисовка формы, которая не предусмотрена.
Самый простой способ отрисовки в цикле, это в перегруженной функции OnPaint формы в конце написать Invalidate(), что приведет к новой перерисовке снова и снова. |
Ответ: Проблемы с переводом
Бррр - никогда так не делал! Тоесть условно говоря мы пихаем куданибудь в форме Do Loop между ними делаем всё что надо а перед Loop ставим Invalidate()?
А чем нам мешает "перерисовка формы" ? Ну например у меня в программе раз в 70 мили секунд опрашивается клавиатура, раз в 40 проверяется физика а раз в тридцать на форму выводится новая картинка и всем хорошо... |
Ответ: Проблемы с переводом
Нет, никаких циклов в Windows.Forms
у тебя должна быть функция перерисовки окна: PHP код:
Цитата:
|
Ответ: Проблемы с переводом
Я правельно понимаю что речь идёт о Form Events? Из них у меня есть только просто Paint... Хотя скорее всего реч идёт о чём то другом... А если так то получается мы каждый раз когда видим что форме вздумалось перерисоваться застовляем её нанести на себя нужную нам картинку?
|
Ответ: Проблемы с переводом
Да, но используя Invalidate() в конце функции перерисовки OnPaint мы заставляем ее перерисовываться постоянно, тратя на это свободные ресурсы системы для получения максимального количества кадров в секунду.
|
Ответ: Проблемы с переводом
Цитата:
Цитата:
А В это время работают к примеру таймеры Физики и Опроса клавиатуры, а OnPaint втискивается между ними максимально возможное колличество раз?! |
Ответ: Проблемы с переводом
Invalidate() говорит форме, что ее область не действительна и ее нужно перерисовать. И когда она сможет, она ее перерисует.
Вот нашел в интернете довольно старые уроки, но может пригодятся для понятия общих принципов http://progs.biz/directx/direct3d/vb/vb01.aspx |
Ответ: Проблемы с переводом
Огромное спасибо! Вы раскрыли мне глаза на истину! Обязательно перепишу рейдринг на досуге.
Только до сих пор остаётся действительным вопрос о том как заставит VB не закрывать окно об ошиьке после завершения приложения. Проблема сейчас явно не в перерисовке (таймеры с запасом) да и на 6.0 это прикрасно фурычит.В прблесках окна с ошибкой я понял что он зависает на загруске информации однако что по этому поводу сообщает VB непонятно... Так как окно проподает с глаз долой.. |
Ответ: Проблемы с переводом
Цитата:
Если использовать цикл как в первом туторе, то можно рендерить постоянно кадры, а основываясь на времени вызывать методы обновления физики и игровой логики. Пример такого принципа - цикл с твинигом в Blitz3d. Там функция Update вызывается столько раз, сколько нужно для обеспечения выполнения обновления игры например 30 раз в секунду. а все остальное вермя выполняется рендеринг геометрии с интерполяцией по промежуточным положениям. |
Ответ: Проблемы с переводом
Цитата:
|
Ответ: Проблемы с переводом
Про точки вкурсе! Только вот зараза - Оконный режим диркт Х это как раз то с чем я не умею работать.... Мудрый 6.0. выводил ошибку в MSG BoX который не закрывается покане нажмёш - а тут... Пипец...
Чёрт! С точками тоже не помогает! |
Ответ: Проблемы с переводом
Пробуй блоки ловли исключений, вот пример: http://www.homeandlearn.co.uk/NET/nets5p4.html
т.е.: PHP код:
|
Ответ: Проблемы с переводом
Помогло! 1 ошибкой меньше! Только без дебагинга с маркерами и просмотром значений будет туго. Чего компу может нехватать что он не может свернуть(развернуть) приложение?
|
Ответ: Проблемы с переводом
Для сворачивания надо чтобы окно могло выполнять оконные сообщения... попробуй нажимать сочетание клавиш Windows + D для сворачивания всех окон и потом переключения на студию.
Вообще попробуй организовать цикл так, как приведено в туторе по ссылке в посте 41. Там как раз бесконечный цикл и есть вызов Application.DoEvents(), который дает системе возможность обработки сообщений, в том числе и оконных. А я спать пошел. |
Ответ: Проблемы с переводом
До цикла даже не доходит! У меня походу компа на нужды студии не хватает... Сейчас я понял самую гениальную вещ изобретённую человеком MSG Box! Я при помощи него переменные отлеживаю. Ужассс...
Огромный сенкс за прмощ. |
Ответ: Проблемы с переводом
Ну как бы полноэкранный режим - это только маленькая часть возможностей, которые нужно реализовать правильно. Один раз понять в чем проблема, а далее будет все как по маслу. Тестировать конечно надо в оконном режиме и иметь возможность в любой момент перейти в полноэкранный.
|
Ответ: Проблемы с переводом
Я нарыл исходник с бесконечным циклом отриссовки и оконным режимом. Возникли следующие вопросы:
Что обозначает строка DoEvents перед loop в бесконечном цикле отрисовки?(без неё проект тупо виснет) Нормально ли что отрисовка в цикле сделана без функции OnPaint? Что делает метод DirectDrawSurfase7 Blt? Что за метод Flip, а точнее почему он необходим при FullScreen режиме (в конце для отрисовки), но не требуется в оконном? |
Ответ: Проблемы с переводом
1. DoEvents - выполняет цикл по оконным сообщениям, необходим для правильной работы окна. Если его убрать, то окно не сдвинешь с места и возможно не будет верной отрисовка. Так что он обязателен.
2. Нормально. 3. Понятия не имею, т.к. с DerectDraw не работал, возможно что-то связанное с синхронизацией буферов или блоков памяти. Вот нашел описание - ссылкаhttp://www.gamedev.ru/code/forum/?id=36432#m3. Похоже это копирование части или всего сурфэйса в другой сурфэйс. 4. Flip обычно меняет местами передний и задний буферы. Т.е. картинка рисуется на заднем буфере, а потом отображается пользователю полностью. На самом деле в оконном режиме он скорее всего тоже необходим для правильной отрисовки. |
Ответ: Проблемы с переводом
Подскажите плиз. Каким образом в структуре описать НЕ SHARED массив ФИКСИРОВАННОЙ ДЛИННЫ?
(что то духе) Public Structure a Public b(100) As Long End Structure (только работающее) |
Ответ: Проблемы с переводом
В структурах нельзя объявлять массивы сразу фиксированной длины.
|
Ответ: Проблемы с переводом
Хотел бы уточнить что DoEvents выделяет системе время на обработку событий, в том числе и на отрисовку невалидных областей экрана. В ресурсоемких и долгих по времени циклах рекомендуется ставить чтобы небыло фриза приложения плоть до непрорисовки элементов окна.
|
Ответ: Проблемы с переводом
????
А как тогда реатизовать в ВБ 2010 аналог следующего кода в вб 6.0 Public Type A B(100) as long End type |
Ответ: Проблемы с переводом
А почему бы класс не использовать вместо структуры?
|
Ответ: Проблемы с переводом
Я об этом подумывал. Тогда другой вопрос. Как решить nullReferenceExpresion was unhandled: Object reference not set to an instance of an object?(Это выдаётся в случае с классом)
|
Ответ: Проблемы с переводом
класс надо сначала инициализировать (выделить память под экземпляр при создании с ключевым словом New)
|
Ответ: Проблемы с переводом
А как обойти Arrays cannot be declared with new?
|
Ответ: Проблемы с переводом
Да что же тут такого сложного
PHP код:
|
Ответ: Проблемы с переводом
Простие, вы меня не поняли. Знаю, сам виноват - изяснялся туманно. Про выделение памяти для ПЕРЕМЕННЫХ все было понятно с первого раза. Я переспрашиват как выделять память на МАССИВЫ. Если
Public Class A Public B(100) As Long End Class Public Shared C(100) As new A То Arrays cannot be declared with 'New'. если Public Shared C(100) As A= new A то Explicit initialization is not permitted for arrays declared with explicit bounds. Это и сложно... |
Ответ: Проблемы с переводом
Нельзя инициализировать массив во время обявления, если у него объявлен размер.
Если надо в другом классе объявить инициализированный массив типа А, то в его статическом конструкторе нужно проинициализировать каждый элемент. PHP код:
|
Ответ: Проблемы с переводом
О ужас! Куда я попал! ....
Тоесть здравый анлалог (в смысле без гемора инициализации) следующего кода в 2010 невозможен? Public Type A b(100) as long end type Public a(100) as a |
Ответ: Проблемы с переводом
Если не инициализировать, то в каждом элементе второго массива будет Nothing, а не экземпляр класса A.
При использовании структур как выяснилось - запрещается объявлять массивы фиксированный длины. :pardon: я вообще на C# программирую ;) Может нужно что-то проще? зачем объявлять тип для массива? |
Ответ: Проблемы с переводом
У меня есть программа. Движок на вб 6.0, там больше 2000 строк. Я хочу перевести его на более современный язык. Это последняя проблема (из тех что обнаружены). В движке очень активно используются типы (например чтобы не заводить массивы XNpc YNpc и т.д. я использую тип NPC с характеристикаим Х и Y) это очень удобная функция(Как нам объясняли это и есть оьъекно ориентированное прогаммирование) очень жаль что её так изнахратили в 2010.
Хотя, я тут подумал - что если создать одну большую процедуру и прогемороиться описать в ней выделение памяти всем массивам?(риторический вопрос) Другое дело - в 2010 есть ну очень хорошая функция - динамические массивы. Как быть с ними - выделить память N -элементам, а дальше выделять по мере увеличения размера? |
Ответ: Проблемы с переводом
Цитата:
Цитата:
Вот то что ты хочешь (vb .net не знаю это с шарпа конвертировано): Код:
Imports System.Collections.Generic |
Ответ: Проблемы с переводом
Цитата:
Пользоваться конструкторами для классов - это один из способов лучше контролировать свою программу и выделение памяти. То что запретили создавать массивы в структурах с заранее заданными границами - это не проблема. Для программиста написать лишние три строчки кода инициализации массива - это как два байта переслать. Вот пример с отложенной инициализацией массивов внутри структуры. При первом обращении к массиву через свойство он будет создан. Переменная хранящая массив скрыта. PHP код:
|
Часовой пояс GMT +4, время: 16:29. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot