Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Перевод проги из под DOS в Windows


Автор: Маринка 13.1.2006, 17:43
Здравствуйте, с праздниками всех.

У меня такая проблемка. Есть расчетная программа. на VB, которая сделана для работы в DOS'e ! Надо её как-то переделать так, чтобы она работала в виндузе. А также она почему-то не хочет работать с лазерным принтером. Первый раз сталкиваюсь с такой проблемой, поэтому даже не представляю как это делать. вроде бы и не сложно, а когда берусь, то выходит , что не всё так просто.

Помогите, пожалуйста.

Большое спасибо заранее.

Автор: Naghual 13.1.2006, 17:47
А есть исходники этой програмки?
Или хотябы алгоритм ее работы и расчетные функции?

Автор: Маринка 14.1.2006, 16:22
Исходник есть и я его прикрепляла к сообщению №1, почему-то его нет. Можно же сюда вставить файл? Пробую ещё раз.

Автор: Naghual 15.1.2006, 17:08
Програмка эта не на VB а на его далеком предшественнике.
Необходимо, во первых, переписать этот исходник под VB.
У тебя знания о VB позволят это сделать?

Автор: Voldemar2004 15.1.2006, 19:51
Пример умножения 2-ух матриц:
Код
Option Explicit
Private Sub Command1_Click()
Dim i As Integer, j As Integer

Cls
Print "Матрица 1:" & vbNewLine

Dim a() As Single

Dim ai As Integer, aj As Integer

ai = InputBox("", "Размерность: число строк 1-ой матрицы")
aj = InputBox("", "Размерность: число столбцов 1-ой матрицы")

MsgBox "Число строк = " & ai & " Число столбцов = " & aj

ReDim a(0 To ai - 1, 0 To aj - 1) As Single

For i = 0 To ai - 1

    For j = 0 To aj - 1
    
    a(i, j) = InputBox("", "Заполните матрицу")
    
        Print "  "; a(i, j);
    
    Next j
    Print

Next i

Print

' ----------------------------------------------------------------
' матрица 2:
Print "Матрица 2:" & vbNewLine
Dim b() As Single
Dim bi As Integer, bj As Integer

bi = InputBox("", "Размерность: число строк 2-ой матрицы")
bj = InputBox("", "Размерность: число столбцов 2-ой матрицы")

If aj = bi Then

         MsgBox "Число строк = " & bi & " Число столбцов = " & bj

Else: MsgBox "Число строк 1-ой матрицы" & vbNewLine & _
         "не равно числу столбцов 2-ой матрицы", vbCritical

Exit Sub

End If


ReDim b(0 To bi - 1, 0 To bj - 1) As Single

For i = 0 To bi - 1

    For j = 0 To bj - 1
    
    b(i, j) = InputBox("", "Заполните матрицу")
    
        Print "  "; b(i, j);
    
    Next j
    Print

Next i

Print

' результат умножения 2-ух матриц:
Dim s As Integer, k As Integer
Dim c() As Single

ReDim c(0 To ai - 1, 0 To aj - 1) As Single

Print "Умножение матриц:" & vbNewLine

For i = 0 To ai - 1
    For j = 0 To bj - 1

        For k = 0 To aj - 1
        
        c(i, j) = c(i, j) + a(i, k) * b(k, j)
        
        Next k
        
        Print "  "; c(i, j);
       
    Next j
    Print
Next i

End Sub
Маринка, вместо INPUT используй
Код
value=InputBox()
. В меню VB6 Tools -> Options на вкладке Editor поставь флаг "Require Variable Declaration" - так будет обязательное объявление переменных, а то они в твоем коде типа Variant, из-за чего скорость работы будет низкая и расход памяти очень большой.

Маринка, тебе надо только глядя на мой пример, заменить для своего случая операторы.
P.S. И не надо пользоваться Goto, а то не понятно, что куда ведет. Для его замены лучше использовать процедуры Sub, If... elseif... end if, Select Case ... End Case.

Автор: Akina 16.1.2006, 10:47
Цитата(Маринка @ 13.1.2006, 18:43 Найти цитируемый пост)

Есть расчетная программа. на VB, которая сделана для работы в DOS'e ! Надо её как-то переделать так, чтобы она работала в виндузе.

Основные твои проблемы: некуда print, неоткуда input.
Замены:
вместо print использовать вывод в caption надписи на форме
вместо input использовать inputbox (для ввода значений) или msgbox (для выбора варианта дальнеших действий).

Расчетная часть будет работать без корректировки.

Цитата(Маринка @ 13.1.2006, 18:43 Найти цитируемый пост)

она почему-то не хочет работать с лазерным принтером

что значит - не хочет? так прямо на экран и выкидывает сообщение "Не хочу работать с лазерным принтером!" ?

Автор: Маринка 18.1.2006, 10:53
Ага, понятно..а что там такое Locate ?? Как бороться с этим?

Автор: ~FoX~ 18.1.2006, 11:13
Locate - указывает место на экране где будет надпись выводиться - их можешь просто выкинуть.

Автор: Маринка 12.2.2007, 11:31
Откуда там берётся значение I ??
Что такое Data ..,.,.,.,.,   ? Как это перевести в нормальный VB, чтоб работало?

Автор: mihanik 12.2.2007, 15:32
Data и Read там используются для определения констант...
Оператор DATA позволяет хранить данные прямо в программме
Read считывает очередные данные из оператора DATA

Автор: JusTalionis 12.2.2007, 15:48
Data - Read в VB6 нет. Придется в ручную присваивать каждое необходимое значение каждому элементу массива при помощи знака равенства.

Цитата(Маринка @  12.2.2007,  11:31 Найти цитируемый пост)
Откуда там берётся значение I ??
I - это счетчик цикла. Его начальное и конечное значения задаются в строке For.

Маринк, а ты, вообще в Бейсике волокёшь? и в VB6 в частности?
Потому что построчно переделывать такой исходник довольно сложно.
Я б рекомендовал поступить так.
Если тебе известна суть работы программы, легче написать ее интерфейс заново - на VB6. А саму формулу вычисления взять из старого исходника (ну с небольшими исправлениями). Вот так.
Потому что идеология интерфейса VB6 (оформление проги, то есть) в VB совсем другая, чем было в DOS.


Автор: mihanik 13.2.2007, 08:40
Маринка, прислушайся к тому, что JusTalionis говорит.

Дело, между прочим!

Автор: JusTalionis 13.2.2007, 13:05
mihanik, я тут посмотрел; если у нее не стоит задача сделать законченную прогу, а только проблема с печатью на лазерке, она может сделать много проще: чуть поправить свой исходник и запускать его под QB.
Там, как я вижу, принтер открывается как файл, может быть поэтому лазерка и не печатает.
Ну-дык, можно легко перенаправить вывод в файл; получится текстовый файл, и его уже распечатать средствами Windows.

Автор: Маринка 13.2.2007, 15:54
-       I - это счетчик цикла. Его начальное и конечное значения задаются в строке For.


-    это понятно, что счетчик. Не понимаю, где используется это значение, т.е. как оно от пользователя зависит? Когда именно I=1 до 6, а когда I=7 до 11   .... где I узнает программа?
Мне плохо в том смысле, что самих расчетов у меня нет, в этой строительной теме я ничего не понимаю, мне надо-чтоб прога работала в винде и чтоб печатала нормально. С печатью я ещё не разбиралась. А с самой программой- вроде легкая, расчеты не меняются там, а вот с этими I - не понимаю пока. Сделала просто форму одну, где user вводит все данные, нажимает РАСЧЕТ и ..готово..типа. 

Там ещё поля Text - куда вводятся все данные надо мне как-то обозначить переменными что ли..(?) - RY, RX и т.д.  ну с этим я  тоже разберусь, наверное - это тоже из области нетрудного.

Добавлено @ 15:56 
просто попросидли меня помочь - а я что-то вожусь с ней, самой аж стыдно и неудобно, неприятно.

Автор: JusTalionis 13.2.2007, 16:29
Цитата(Маринка @  13.2.2007,  15:54 Найти цитируемый пост)
Сделала просто форму одну, где user вводит все данные, нажимает РАСЧЕТ и ..готово..типа. 
Ты молодец, Маринка!
Цитата(Маринка @  13.2.2007,  15:54 Найти цитируемый пост)
Когда именно I=1 до 6, а когда I=7 до 11   .... где I узнает программа?
Автоматически(без участия пользователя) и в прядке расположения фрагментов в программе: здесь - сначала от 1 до 6, затем от 7 до 11, потом от 12 до 17 и далее по тексту.
Весь блок кода с циклами For и DATA - READ - это начальный расклад значений в массивы, то есть инициализация.
В VB инициализации выполняющиеся автоматически при старте программы, надо помещать в процедуру Private Sub Form_Load().
Вызываешь, как обычно, пустую заготовку этой процедуры и пишешь в ней присвоения в ручную всем элементам массивов необходимых начальных значений. Например, начинается:
Код

A(1, 1) = 5
A(1, 2) = 0.5
A(1, 3) = 4.8
A(1, 4) = 11.2
A(1, 5) = 1.42
A(1, 6) = 5.4
A(2, 1) = 6.3
A(2, 2) = 0.5
A(2, 3) = 6.13
    .
    .
    .
A(25, 5) = 6.07
A(25, 6) = 22.7
И так последовательно все значения из строк DATA, друг за другом, так же, как цикл перебирал бы элементы массива. Вместо I, первым индексом массива здесь проставлены значения, которые I последовательно принимала бы в циклах, как нетрудно видеть.
Массив нужно объявить как глобальный: создай модуль, и внутри него объяви.


Автор: Маринка 14.2.2007, 13:42
понятно, хорошо,
интересно, а почему тогда в этом исходнике не написали в одну строчку все константы (Data ....) и зачем там сделано было блоками?

Автор: JusTalionis 14.2.2007, 14:25
Вот, сам задавался этим вопросом!
Может быть, чтобы было легче отыскать, если потребуется заменить? Это ведь исходные параметры, типа, там, прочности на растяжение, упругости и т. п., как я понял? Ну, понадобится, например заменить данные - для другой марки стали... Но тогда можно было просто визуально поделить блоки DATA, а считывать одним циклом.
Вообще, лично я в таких случаях всегда считывал двумя вложенными циклами, и всё OK получалось.

Пользуясь случаем!!!
Позволь тя в щечку, Мариночка smile в честь 14 февраля smile

Автор: Маринка 24.2.2007, 13:51
ой, спасибо.
Вас всех представителей сильного пола тоже с праздником!!! Вот и ваш праздник красного цвета стал в календаре.

А я сделала вроде программку. Буду разбираться с печатью.
Пока сделала так, чтобы отчет(все результаты и исходные данные) из Text сохранялся в файл *.txt. Ну и потом его можно и распечатать.
Сейчас думаю над кнопочкой на форме, чтоб сразу можно было распечатать.Что, да как это делать, пока не знаю. Есть ли разница работы с лазерными и струйными принтерами?

Автор: JusTalionis 24.2.2007, 16:50
 smile Пасиб, Мариночка!)))))))

А касательно нюансов печати - не знаю, не пробовал.
Кто знает - надеюсь, отпишет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)