Как распечатать *.txt файл из VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Как распечатать *.txt файл из VB

Сообщение Rodos » 10.10.2005 (Пн) 22:18

Как распечатать *.txt файл из VB?

Prickly
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 82
Зарегистрирован: 07.10.2004 (Чт) 18:44
Откуда: From Russia

Сообщение Prickly » 10.10.2005 (Пн) 22:43

Printer.Print str1
Printer.EndDoc
Не было бы Гейтса, не было бы нас!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.10.2005 (Пн) 22:47

Код: Выделить всё
Shell "notepad /p файл.txt"
Изображение

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 11.10.2005 (Вт) 13:12

Код:
Shell "notepad /p файл.txt"

Не работает! Говорит, что файл не найден, хотя путь правильный.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 11.10.2005 (Вт) 15:11

При печати *.txt файла должно появиться окно с выбором принтера и т.д. (как при нажатии в Блокноте Ctrl+P). В интернете нашел несколько советов, но все равно ничего не получаеться.

Советы из Итернета:
Запускаешь notepad с помощью ShellExecute, затем находишь окно notepad'а с помощью FindWindow, берешь его менюшку GetMenu и GetSubMenu и посылаешь сообщение WM_COMMAND (SendMessage) окну с идентификатором пункта меню (GetMenuItemID). Вот и диалог печати.


В General Declaration объявить:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const SW_HIDE = 0


В коде поставить следующую ком[sensored]у:

ShellExecute Me.hwnd, "print", App.Path & "\Print.txt", "", App.Path, SW_HIDE



Есть одно условие: должна быть привязка файла по умолчанию к Блокноту.


Ну что скажите?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.10.2005 (Вт) 16:57

Тёмыч :)

Код: Выделить всё
Shell "notepad /p ""файл.txt"""

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 11.10.2005 (Вт) 17:12

Круто! Код заработал! А можно как-нибудь сделать, чтобы появлялось стандартное окно с выбором принтеров и т.д.?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.10.2005 (Вт) 17:17

Инструкции.

Идём на www.mentalis.org
Качаем оттуда API-Guide.
Смотрим в API-Guide функцию PrintDialog. Пример прилагается.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 11.10.2005 (Вт) 18:04

К приложенному API добавляю:

Код: Выделить всё
Private Sub Command7_Click()
Command5 = True 'ShowPrinter
Shell "notepad /p ""G:\123.txt"""
End Sub


Окно с принтерами появляется, а настройки не применяются.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 11.10.2005 (Вт) 20:24

А можно ли распечатать RTF вместо TXT. Просто его легче редактировать, да WordPad у всех есть.

Код: Выделить всё
Private Sub Command7_Click()
Shell "wordpad /p ""файл.rtf"""
End Sub


У меня не получилось.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 15.10.2005 (Сб) 0:32

Amed, как заставить PrintDialog применять настройки к распечатываемому документу?

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 16.10.2005 (Вс) 0:21

Ладно, про настройки не отвечаете. Тогда хотя бы скажите, можно распечатать RTF документ из VB?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.10.2005 (Вс) 0:38

2 Rodos

Медленно прочти весь топик сначала. Истина рядом.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 16.10.2005 (Вс) 1:11

Это ты про советы из Интернета?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.10.2005 (Вс) 1:38

Amed писал(а):Инструкции.

Идём на www.mentalis.org
Качаем оттуда API-Guide.
Смотрим в API-Guide функцию PrintDialog. Пример прилагается.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 16.10.2005 (Вс) 1:58

Уже пробовал, появляется нужная мне форма с принтерами, но то что я на ней нажал не применяется к моему файлу. Вернее я не знаю как ее прикрепить к моему файлу.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 16.10.2005 (Вс) 15:29

Вот еще нашел:

Код: Выделить всё
Private Sub cmdPrint_Click()
    StopPrinting = False
' Set CancelError is True
On Error GoTo errhandler
   
    CommonDialog1.PrinterDefault = True
    CommonDialog1.CancelError = True

    ' Устанавливаем флаги
    CommonDialog1.Flags = cdlPDReturnDC + cdlPDNoPageNums
    CommonDialog1.ShowPrinter

    Printer.Print '!!!Что здесь надо вписать, чтобы распечатался txt-файл 
    Printer.EndDoc
    Exit Sub
errhandler:
    Select Case Err
    Case 32755 '  В диалоге нажата кнопка "Отмена" (Cancel)
        MsgBox "you cancelled the dialog box"
    Case Else
        MsgBox "Unexpected error. Err " & Err & " : " & Error
    End Select
End Sub

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.10.2005 (Вс) 16:57

У 'Printer' есть свойства, а PrintDialog возвращает их значения.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.10.2005 (Пн) 11:54

Rodos писал(а):Ладно, про настройки не отвечаете. Тогда хотя бы скажите, можно распечатать RTF документ из VB?


У RichTextBox есть метод SelPrint, кстати...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Smith68
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 92
Зарегистрирован: 02.09.2005 (Пт) 19:08
Откуда: Тамбов, Моршанск

Сообщение Smith68 » 17.10.2005 (Пн) 20:40

Копируешь всё в блокнот и не паришься!!!

skord
Китаец
Китаец
 
Сообщения: 572
Зарегистрирован: 14.10.2004 (Чт) 15:36
Откуда: Иркутск

Сообщение skord » 18.10.2005 (Вт) 7:22

Smith68
Перечитай вопрос :wink:

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 18.10.2005 (Вт) 17:07

Rodos писал(а):А можно ли распечатать RTF вместо TXT. Просто его легче редактировать, да WordPad у всех есть.

Код: Выделить всё
Private Sub Command7_Click()
Shell "wordpad /p ""файл.rtf"""
End Sub


У меня не получилось.


Код: Выделить всё
Private Sub Command7_Click()
Shell "write /p ""файл.rtf"""
End Sub

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 18.10.2005 (Вт) 22:51

grindars, спасибо. Команда работает, да вот только печатает не на том принтере. Ну никак не могу решить проблему с выбором принтеров.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.10.2005 (Вт) 22:55

Используем коллекцию Printers для выбора нужного.

Код: Выделить всё
dim p as Printer
For Each p In Printers
    If p.DeviceName = "hp photosmart 7200 series" Then
        Set Printer = p
    End If
Next p

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 19.10.2005 (Ср) 16:28

Мне же надо, чтобы пользователь имел выбор, на каком принтере ему напечатать.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 25.10.2005 (Вт) 19:58

Код: Выделить всё
Private Sub Command1_Click()
Shell "write /p ""файл.rtf"""
End Sub


С этим кодом я бы уже мог бы сделать программу, но сталкнулся с ситуацией, что в принтере кончился тонер, а во втором (сетевом) его еще много. Ну и что должен делать пользователь, если у него такая же ситуация? Вот по этому мне и нужен выбор принтеров. Причем можно даже только, чтобы одни принтеры выбирались, без других параметров. Просто я думаю, что вызвать готовое стандартное окно было бы легче.

Может есть у кого-нибудь похожий исходник?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 26.10.2005 (Ср) 2:25

Таки зайди на http://msdn.microsoft.com
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 26.10.2005 (Ср) 16:09

На MSDN ничего похожего нет.

Вот нашел подсказки:
Запускаешь notepad с помощью ShellExecute, затем находишь окно notepad'а с помощью FindWindow, берешь его менюшку GetMenu и GetSubMenu и посылаешь сообщение WM_COMMAND (SendMessage) окну с идентификатором пункта меню (GetMenuItemID). Вот и диалог печати.
И еще:
Код: Выделить всё
{
if (show_question("Напечатай вопрос прямо здесь "))
{
file_open_write("file.txt");
file_write_string("Page");
file_writeln();
file_write_string("Напечатайте то что хотите ");
file_writeln();file_writeln();file_writeln();file_writeln();
file_writeln();file_writeln();file_writeln();file_writeln();
file_write_string("");
file_close();
execute_shell("C:\WINDOWS\NOTEPAD.EXE","/p file.txt");
}
}


Как должен выглядеть код в VB?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.10.2005 (Ср) 16:49

Rodos писал(а):И еще:
Код: Выделить всё
{
if (show_question("Напечатай вопрос прямо здесь "))
{
file_open_write("file.txt");
file_write_string("Page");
file_writeln();
file_write_string("Напечатайте то что хотите ");
file_writeln();file_writeln();file_writeln();file_writeln();
file_writeln();file_writeln();file_writeln();file_writeln();
file_write_string("");
file_close();
execute_shell("C:\WINDOWS\NOTEPAD.EXE","/p file.txt");
}
}


Как должен выглядеть код в VB?

http://bbs.vbstreets.ru/viewtopic.php?p=156182#156182
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 26.10.2005 (Ср) 16:57

Rodos писал(а):На MSDN ничего похожего нет.


BV писал(а):Медленно прочти весь топик сначала. Истина рядом.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 108

    TopList