На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Печать в Delphi
    Как можно распечатать файлы .pdf, .doc, .xls, .gif, .csv, .jpg, .txt, .bmp?
      Цитата seriy @
      Как можно распечатать файлы .pdf, .doc, .xls, .gif, .csv, .jpg, .txt, .bmp?

      По-разному! Можно OLE или COM использовать для .pdf, .doc, .xls. Для .txt - TMemo. Для картинак - TImage.
        А можно какой-нибудь для OLE или COM?
          Цитата seriy @
          А можно какой-нибудь для OLE или COM?

          что можно то?
            Компоненты поищи на Torry, а распечатать можно, используя переменную Printer. Соответственно, RTFM. Если неохота его читать, то там есть канвас, через который можно отправить изображение на принтер.
              Большинство если не все из форматорв можно распечатать с помощью ShellExecute с командой Print
              Возможность можно проверить правой кнопкой мыши на файле, если есть пункт Печать, то напрямую, если нет то откроется программа, которой можно печатать.
                Мне нужна эта программа в качестве сервиса. При использовании ShellExecute каждый раз открывается окно программы в которой выполняется печать. К сожалению для моей программы это критично.В принципе с Word, Excel(работаю с ними через компоненты WordApplication и ExcelApplication ) и картинками(открываю в TImageList и оттуда печатаю) я вроде разобрался, а с pdf есть некоторые проблемы. Может кто-то знает способ как через OLE можно связаться с Adobe Reader?
                  Цитата seriy @
                  При использовании ShellExecute каждый раз открывается окно программы в которой выполняется печать

                  дык, запускается то она запускается, просто не показывай само окно, делай невидимым и всё... что разве не подходит? :blink:
                    А можно пример как это сделать, а то чего-то я в MSDN не нашел как окно сделать невидимым
                      seriy
                      лично я вот так работаю с вордом
                      ExpandedWrap disabled
                        uses ComObj;
                         
                        var
                          Word:variant;
                         
                        function CreateWord:boolean;
                        begin
                          CreateWord := true;
                           try
                            Word := CreateOleObject('Word.Application');
                           except
                            CreateWord := False;
                           end;
                         
                        function VisibleWord(Visible:boolean):boolean;
                        begin
                          VisibleWord := True;
                           try
                            Word.Visible := Visible;
                           except
                            VisibleWord := False;
                           end;
                        end;

                      ну а дальше делаю то что мне нужно для решения задачи...
                        Цитата seriy
                        Может кто-то знает способ как через OLE можно связаться с Adobe Reader?


                        С Adobe Reader'ом идет ActiveX-компонент TAcroPDF. Лежит он в C:\Program Files\Adobe\Acrobat 7.0\ActiveX\AcroPDF.dll. Его надо инсталлировать через Component->Import ActiveX Control.
                          Спасибо за все ответы. Помогло, но теперь возникла следующая проблема : при попытке печати документа используя WordApplication, в свойствах печати в списке принтеров по умолчанию выбран Microsoft Office Document Image Writer. Можно ли программно установить нужный мне принтер? Или это где-то в Windows нужно настроить?
                          И что это за Image Writer такой, че-то раньше я его не видел. Ксати при попытке печати pdf возникает та же самая проблема.
                            Цитата seriy @
                            Можно ли программно установить нужный мне принтер

                            ExpandedWrap disabled
                              WordApplication1.ActiveDocument.PrintOut(Background, Append_, Range, OutFileName, From,
                                                                       To_, Item, Copies, Pages, PageType, PrintToFile,
                                                                       Collate, ActivePrinterMacGX, ManualDuplexPrint,
                                                                       PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth,
                                                                       PrintZoomPaperHeight);

                            все параметры типа OleVariant

                            From - номер страницы с которой нужно начинать печать
                            To_ - номер последней печатаемой страницы, если стоит EmptyParam, то последняя
                            Copies - определяет количество копий
                            PrintToFile - указывает, должно ли печататься в файл (false и EmptyParam - не должно)
                            Collate - указывает, нужно ли разбирать по копиям (false и EmptyParam - не должно)

                            остальное могу только предположить, т.к. ещё не разбирался:

                            OutFileName - путь имя файла в который печатать
                            ActivePrinterMacGX - какой принтер использовать
                            ManualDuplexPrint - двухсторонняя печать

                            и т.д.
                              Цитата seriy @
                              Можно ли программно установить нужный мне принтер?

                              можно... :yes:
                              вот так
                              ExpandedWrap disabled
                                uses
                                  IniFiles, Printers;
                                {...}
                                procedure TMainForm.FormCreate(Sender: TObject);
                                begin
                                  cbPrinters.Items.Assign(Printer.Printers);
                                  cbPrinters.Text := Printer.Printers[Printer.PrinterIndex];
                                  lblPrinter.Caption := Printer.Printers[Printer.PrinterIndex];
                                end;
                                 
                                procedure TMainForm.cbPrintersChange(Sender: TObject);
                                var
                                  IniFile: TIniFile;
                                  TempStr1, TempStr2: string;
                                  S: array[0..64] of char;
                                begin
                                  with Printer do
                                  begin
                                    PrinterIndex := cbPrinters.ItemIndex;
                                    TempStr1 := Printers[PrinterIndex];
                                    System.Delete(TempStr1, Pos(' on ', TempStr1), Length(TempStr1));
                                    IniFile := TIniFile.Create('WIN.INI');
                                    try
                                      TempStr2 := IniFile.ReadString('Devices', TempStr1, '');
                                      IniFile.WriteString('windows', 'device', TempStr1 + ',' + TempStr2);
                                      StrCopy(S, 'windows');
                                      SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S));
                                    finally
                                      IniFile.Free;
                                    end;
                                  end;
                                  lblPrinter.Caption := Printer.Printers[Printer.PrinterIndex];
                                end;

                              cbPrinters - это ComboBox, lblPrinter - это Label
                                Спасибо, все работатет, только не могу понять что делает строка SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S))?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0634 ]   [ 16 queries used ]   [ Generated: 16.04.24, 05:03 GMT ]