Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VB6 в C# 
:(
    Опции темы
SKrivosein
Дата 14.7.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Есть кусок кода VB6 который очень хотелось бы перевести в C# или на крайний случай VB.NET.
Смотрел сюда "ПРИМЕР", но поскольку абсолютно нешарю в Бейсиках, не чего не понял.  
Хотя бы направление куда копать
Код

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


Это сообщение отредактировал(а) SKrivosein - 14.7.2009, 20:19


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
diadiavova
Дата 14.7.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Код

[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;



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 14.7.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Спасибо diadiavova, надеюсь подключю и разбегаю этот код.
Чтобы пост имел смысл, это для вот этого: bio PDF
free PDF печать и ещё несколько форматов, к хорошем качестве.


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
diadiavova
Дата 14.7.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Вообще в студии имеется инструмент апгрейда кода vb6->vb.net, а в шарп можно переводить здесь. Хотя ручками доделывать всё-равно придётся.
Думаю может пригодится  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 14.7.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



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


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

Это сообщение отредактировал(а) SKrivosein - 14.7.2009, 20:06


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
diadiavova
Дата 14.7.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(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.   


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 14.7.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



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


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
diadiavova
Дата 14.7.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 14.7.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



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

В модуле GlobalModule


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
jonie
Дата 15.7.2009, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
SKrivosein
Дата 15.7.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



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

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 00:35


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
diadiavova
Дата 15.7.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1309 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.