Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > VB6 в C#


Автор: SKrivosein 14.7.2009, 13:49
Есть кусок кода VB6 который очень хотелось бы перевести в C# или на крайний случай VB.NET.
Смотрел сюда http://forum.vingrad.ru/forum/topic-90108/unread-1/hl/vb+%25D0%25B2+c%2523/index.html, но поскольку абсолютно нешарю в Бейсиках, не чего не понял.  
Хотя бы направление куда копать
Код

VERSION 5.00
Begin VB.Form frmMain 
   Caption         =   "VB6 Print Example"
   ClientHeight    =   2175
   ClientLeft      =   120
   ClientTop       =   420
   ClientWidth     =   4065
   LinkTopic       =   "Form1"
   ScaleHeight     =   2175
   ScaleWidth      =   4065
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton cmdPrint 
      Caption         =   "Print"
      Height          =   855
      Left            =   600
      TabIndex        =   0
      Top             =   720
      Width           =   2775
   End
End
Attribute VB_Name = "frmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit 

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Const PDF_PRINTERNAME = "PDF Writer - bioPDF" 
Const PRINTER_PROGID = "bioPDF.PDFPrinterSettings" 

Private Function PrinterIndex(ByVal printername As String) As Integer 
    Dim i As Integer 
     
    For i = 0 To Printers.Count - 1 
        If LCase(Printers(i).DeviceName) Like LCase(printername) Then 
            PrinterIndex = i 
            Exit Function 
        End If 
    Next 
    PrinterIndex = -1 
End Function 

Private Sub cmdPrint_Click() 
    Dim prtidx As Integer 
    Dim obj As Object 
     
    Rem -- Configure the PDF print job 
    Set obj = CreateObject(PRINTER_PROGID) 
    obj.SetValue "Output", "<desktop>\myfile.pdf" 
    obj.SetValue "ConfirmOverwrite", "no" 
    obj.SetValue "ShowSaveAS", "never" 
    obj.SetValue "ShowSettings", "never" 
    obj.SetValue "ShowPDF", "yes" 
    obj.SetValue "RememberLastFileName", "no" 
    obj.SetValue "RememberLastFolderName", "no" 
    obj.WriteSettings True 
     
    Rem -- Find the index of the printer 
    prtidx = PrinterIndex(PDF_PRINTERNAME) 
    If prtidx < 0 Then Err.Raise 1000, , "No printer was found by the name of '" & PDF_PRINTERNAME & "'." 
         
    Rem -- Set the current printer 
    Set Printer = Printers(prtidx) 
         
    Rem -- Print something 
    Printer.FontSize = 50 
    Printer.Print "Hello VB6..." 
    Printer.EndDoc 
     
    Rem -- Wait for runonce settings file to disappear 
    Dim runonce As String 
    runonce = obj.GetSettingsFileName(True) 
    While Dir(runonce, vbNormal) <> "" 
        Sleep 100 
    Wend 
End Sub

Автор: diadiavova 14.7.2009, 17:16
Код

[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    private static extern void Sleep(int dwMilliseconds);

    const  PDF_PRINTERNAME = "PDF Writer - bioPDF";
    const  PRINTER_PROGID = "bioPDF.PDFPrinterSettings";
    private short PrinterIndex(string printername)
    {
        short i = 0;

        for (i = 0; i <= Printers.Count - 1; i++) {
            //для оператора Like в шарпе нет эквивалента или он мне не известен
            //написал самое близкое

            if ((Printers(i).DeviceName.ToLower() == printername.ToLower())
                                               {
                PrinterIndex() = i;
                return;
            }
        }
        return -1;
    }

    private void cmdPrint_Click()
    {
        short prtidx = 0;
        object obj = null;

        // -- Configure the PDF print job 
        obj = Interaction.CreateObject(PRINTER_PROGID);
        obj.SetValue("Output", "<desktop>\\myfile.pdf");
        obj.SetValue("ConfirmOverwrite", "no");
        obj.SetValue("ShowSaveAS", "never");
        obj.SetValue("ShowSettings", "never");
        obj.SetValue("ShowPDF", "yes");
        obj.SetValue("RememberLastFileName", "no");
        obj.SetValue("RememberLastFolderName", "no");
        obj.WriteSettings(true);

        // -- Find the index of the printer 
        prtidx = PrinterIndex(PDF_PRINTERNAME);
        if (prtidx < 0) Err.Raise(1000, , "No printer was found by the name of '" + PDF_PRINTERNAME + "'."); 

        // -- Set the current printer 
        Printer = Printers(prtidx);

        // -- Print something 
        Printer.FontSize = 50;
        Printer.Print("Hello VB6...");
        Printer.EndDoc();

        // -- Wait for runonce settings file to disappear 
        string runonce = null;
        runonce = obj.GetSettingsFileName(true);
        while (!string.IsNullOrEmpty(FileSystem.Dir(runonce, Constants.vbNormal))) {
            Sleep(100);
        }
    }

Точноть перевода не гарантирую, если что не понятно или не сработает - пиши.

Добавлено через 2 минуты и 38 секунд
Комент на 11-12 строках - мой. В 17, возможно надо написать 
Код

return 0;

Автор: SKrivosein 14.7.2009, 19:32
Спасибо diadiavova, надеюсь подключю и разбегаю этот код.
Чтобы пост имел смысл, это для вот этого: http://www.biopdf.com/index.php
free PDF печать и ещё несколько форматов, к хорошем качестве.

Автор: diadiavova 14.7.2009, 19:45
Вообще в студии имеется инструмент апгрейда кода vb6->vb.net, а в шарп можно переводить http://codeconverter.sharpdevelop.net/SnippetConverter.aspx. Хотя ручками доделывать всё-равно придётся.
Думаю может пригодится  smile 

Автор: SKrivosein 14.7.2009, 20:02
Сейчас попробую поиграть с студией, код пока нерабочий, например мне непонятно откуда взялось
Код
  
for (i = 0; i <= Printers.Count - 1; i++) {             //Printers ???
....


А я ещё баран, когда ставил студию, не поставил VB.NET, , типа зачем она мне."Век живи, век учись" smile , буду исправлять.

Автор: diadiavova 14.7.2009, 20:07
Цитата(SKrivosein @  14.7.2009,  21:02 Найти цитируемый пост)
ейчас попробую поиграть с студией, код пока нерабочий, например мне непонятно откуда взялось

Ну в васике так циклы оформляются. 
Декларация
Код

    For i = 0 To Printers.Count - 1 


означает, что переменная цикла изменяется от нуля до Printers.Count - 1  с инкриментом 1

Добавлено через 1 минуту и 6 секунд
Можно было написать
Код

for (i = 0; i < Printers.Count ; i++)


Добавлено через 6 минут и 54 секунды
В таких ситуациях всегда до ума доводить приходится. Возможно там использованы какие-то специфические для VB6 методы, например я понятия не имею, что такое Err.Raise, однако если подключить библиотеку Microsoft.VisualBasic, то там можно найти такую функцию
  Microsoft.VisualBasic.Information.Err(), которая возвращает тип Microsoft.VisualBasic.ErrObject, а у него есть метод Raise.   

Автор: SKrivosein 14.7.2009, 20:24
Я там придал в первый пост код который был в зипе по ссылке.
Как раз цикл это понятно, откуда взялась "Printers" как переменная. Сейчас поставлю вейсики в студию, и попробую там....
Все равно за идеи спасибо, просто хочу получить рабочие методы .NET  для этого принтера, потом их здесь и оставлю.

Автор: diadiavova 14.7.2009, 21:29
Библиотека Microsoft.VisualBasic. Просто добавь референс на неё, там всё найдёшь.

Автор: diadiavova 14.7.2009, 22:26
Сечас перечитал твой пост и понял, что тебе неясно. Дело в том, что в васике раньше были глобальные переменные, свойства и функции. Эта возможность поддерживается по сию пору посредством модулей и импорта классов(а не только пространств имён). В шарпе для вызова этих функций придётся писать имена полностью(или импортировать пространства и писать имена членов после имён класса. В шарпе васиковский модуль - это просто класс со статическими членами. 
Свойство Printers нашёл в библиотеке Microsoft.VisualBasic.PowerPacks.Vs

В модуле GlobalModule

Автор: jonie 15.7.2009, 08:13
может и не стоит переделывать, вбшные модули это COM классы построенные в рамках STA... вызвать и забыть как страшный сон этот VB имхо, т.е. действовать по принципу:
user posted image

Автор: SKrivosein 15.7.2009, 10:45
jonie да если бы это было на С/С++ я бы разобрался. А так есть два выхода: долгий - учить хотя бы с части VB,
Короткий воспользоватся правой веткой твоей диаграммы.  smile 

Автор: diadiavova 15.7.2009, 16:49
Библиотеки Microsoft.VisualBasic* никакого отношения к COM не имеют. Просто в них присутствуют нет-реализации методов, котороые были доступны в старом васике.

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