powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / PrintDialog1->Collate
14 сообщений из 14, страница 1 из 1
PrintDialog1->Collate
    #33483624
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обрадовался я по поводу завершения программы, но она отказалась печатать разбирая по копиям.
Как позже выяснилось PrintDialog1->Collate равно false не зависимо от того была выбрана галочка разобрать по копиям или нет.
Как с этим боротся?
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33483625
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чуть не забыл: работаю в C++ Builder 6.0
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33483722
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не работает и проэкт Printing из папки Example. Тоже PrintDialog1->Collate всегда равно false. Это наверное глюк, только не пойму чей Билдера или Windows, кого переустанавливать?
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33483751
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс TPrintDialog - обертка VCL над функцией WinAPI - PrintDlg.
Попробуйте напрямую вызвать PrintDlg (правда там в качестве параметра дурацкая структура) и тогда будет понятно ошибка Microsoft или Borland (я думаю, что Borland).
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33484624
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посоветуйте, пожалуйста, хоть что-нибудь.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33484640
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SnowMan2Класс TPrintDialog - обертка VCL над функцией WinAPI - PrintDlg.
Попробуйте напрямую вызвать PrintDlg (правда там в качестве параметра дурацкая структура) и тогда будет понятно ошибка Microsoft или Borland (я думаю, что Borland).
Извините. Не заметил ваше сообщение. Сейчас попробую поискать про PrintDlg.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33485081
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переустановил Билдера. Не помогло. Хотя, может, ошибка содержится в самом пакете установки.
А функция PrintDlg действительно дурацкая. Как я не инициализировал структуру (перепробовал где-то семь разных вариантов с разных сайтов), но диалоговое окно установок печати так и не появилось после команды
PrintDlg(&pd) .
Вот один из вариантов:
PRINTDLG pd;
HWND hwnd;

// Инициализация PRINTDLG
ZeroMemory(&pd, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL; // не забудьте сохранить или
// освободить hDevMode
pd.hDevNames = NULL; // То же самое для hDevNames
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
pd.nCopies = 1;
pd.nFromPage = 0xFFFF;
pd.nToPage = 0xFFFF;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;

if (PrintDlg(&pd)==TRUE)
{
// Вызовы GDI, чтобы выполнить вывод данных.

// Удаление DC, когда все выполнено.
DeleteDC(pd.hDC);
}

Что тут не так?
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33485419
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Минимальный набор такой (посажен на Builder-овскую кнопку):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  PRINTDLG     pd;
  BOOL         fResult;

  memset(&pd,  0 , sizeof(PRINTDLG));

  pd.lStructSize = sizeof(PRINTDLG);
  pd.hwndOwner   = Handle;
  pd.Flags       = PD_COLLATE;

  fResult = PrintDlg(&pd);

  if(pd.hDevMode !=  0 )
    GlobalFree (pd.hDevMode);

  if(pd.hDevNames !=  0 )
    GlobalFree (pd.hDevNames);
}

Тонкость: не все принтеры поддерживают collate возможность.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33486011
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SnowMan2Минимальный набор такой (посажен на Builder-овскую кнопку):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  PRINTDLG     pd;
  BOOL         fResult;

  memset(&pd,  0 , sizeof(PRINTDLG));

  pd.lStructSize = sizeof(PRINTDLG);
  pd.hwndOwner   = Handle;
  pd.Flags       = PD_COLLATE;

  fResult = PrintDlg(&pd);

  if(pd.hDevMode !=  0 )
    GlobalFree (pd.hDevMode);

  if(pd.hDevNames !=  0 )
    GlobalFree (pd.hDevNames);
}

Тонкость: не все принтеры поддерживают collate возможность.

Вставил я этот код через буфер обмена в обработчик события нажатия на мою кнопку.
Запускаю, компилируется без ошибок.
Но при нажатии на кнопку ничего не происходит!!! Как я и писал ранее. Полтергейст какойто.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33486376
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лёлик2 Вставил я этот код через буфер обмена в обработчик события нажатия на мою кнопку.
Запускаю, компилируется без ошибок.
Но при нажатии на кнопку ничего не происходит!!! Как я и писал ранее. Полтергейст какойто.Текст провереный. Видимо Windows кривой.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33490090
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SnowMan2Текст провереный. Видимо Windows кривой.

А нельзя ли как нибудь эту кривизну исправить не переустанавливая Windows. Может dll которая отвечает за это подменить на нормальную.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33492306
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если Windows кривой, то как Билдер вызвал окно установок печати? Ведь он в своём PrintDialog тоже использует PrintDlg.
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33493044
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот исходный текст, если не лень в этом бреду разбираться:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
  TPrintDialog =  class (TCommonDialog)
   private 
    FFromPage: Integer;
    FToPage: Integer;
    FCollate: Boolean;
    FOptions: TPrintDialogOptions;
    FPrintToFile: Boolean;
    FPrintRange: TPrintRange;
    FMinPage: Integer;
    FMaxPage: Integer;
    FCopies: Integer;
     procedure  SetNumCopies(Value: Integer);
   public 
     function  Execute: Boolean; override;
   published 
     property  Collate: Boolean read FCollate write FCollate default False;
     property  Copies: Integer read FCopies write SetNumCopies default  0 ;
     property  FromPage: Integer read FFromPage write FFromPage default  0 ;
     property  MinPage: Integer read FMinPage write FMinPage default  0 ;
     property  MaxPage: Integer read FMaxPage write FMaxPage default  0 ;
     property  Options: TPrintDialogOptions read FOptions write FOptions default [];
     property  PrintToFile: Boolean read FPrintToFile write FPrintToFile default False;
     property  PrintRange: TPrintRange read FPrintRange write FPrintRange default prAllPages;
     property  ToPage: Integer read FToPage write FToPage default  0 ;
   end ;

 function  TPrintDialog.Execute: Boolean;
 const 
  PrintRanges:  array [TPrintRange]  of  Integer =
    (PD_ALLPAGES, PD_SELECTION, PD_PAGENUMS);
 var 
  PrintDlgRec: TPrintDlg;
  DevHandle: THandle;
 begin 
  FillChar(PrintDlgRec, SizeOf(PrintDlgRec),  0 );
   with  PrintDlgRec  do 
   begin 
    lStructSize := SizeOf(PrintDlgRec);
    hInstance := SysInit.HInstance;
    GetPrinter(DevHandle, hDevNames);
    hDevMode := CopyData(DevHandle);
    Flags := PrintRanges[FPrintRange]  or  (PD_ENABLEPRINTHOOK  or 
      PD_ENABLESETUPHOOK);
     if  FCollate  then  Inc(Flags, PD_COLLATE);
     if   not  (poPrintToFile  in  FOptions)  then  Inc(Flags, PD_HIDEPRINTTOFILE);
     if   not  (poPageNums  in  FOptions)  then  Inc(Flags, PD_NOPAGENUMS);
     if   not  (poSelection  in  FOptions)  then  Inc(Flags, PD_NOSELECTION);
     if  poDisablePrintToFile  in  FOptions  then  Inc(Flags, PD_DISABLEPRINTTOFILE);
     if  FPrintToFile  then  Inc(Flags, PD_PRINTTOFILE);
     if  poHelp  in  FOptions  then  Inc(Flags, PD_SHOWHELP);
     if   not  (poWarning  in  FOptions)  then  Inc(Flags, PD_NOWARNING);
    nFromPage := FFromPage;
    nToPage := FToPage;
    nMinPage := FMinPage;
    nMaxPage := FMaxPage;
    lpfnPrintHook := DialogHook;
    lpfnSetupHook := DialogHook;
    hWndOwner := Application.Handle;
    Result := TaskModalDialog(@PrintDlg, PrintDlgRec);
     if  Result  then 
     begin 
      SetPrinter(hDevMode, hDevNames);
      FCollate := Flags  and  PD_COLLATE <>  0 ;
      FPrintToFile := Flags  and  PD_PRINTTOFILE <>  0 ;
       if  Flags  and  PD_SELECTION <>  0   then  FPrintRange := prSelection  else 
         if  Flags  and  PD_PAGENUMS <>  0   then  FPrintRange := prPageNums  else 
          FPrintRange := prAllPages;
      FFromPage := nFromPage;
      FToPage := nToPage;
       if  nCopies =  1   then 
        Copies := Printer.Copies  else 
        Copies := nCopies;
     end 
     else   begin 
       if  hDevMode <>  0   then  GlobalFree(hDevMode);
       if  hDevNames <>  0   then  GlobalFree(hDevNames);
     end ;
   end ;
 end ;
...
Рейтинг: 0 / 0
PrintDialog1->Collate
    #33494804
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SnowMan2Вот исходный текст, если не лень в этом бреду разбираться:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
  TPrintDialog =  class (TCommonDialog)
   private 
    FFromPage: Integer;
    FToPage: Integer;
    FCollate: Boolean;
    FOptions: TPrintDialogOptions;
    FPrintToFile: Boolean;
    FPrintRange: TPrintRange;
    FMinPage: Integer;
    FMaxPage: Integer;
    FCopies: Integer;
     procedure  SetNumCopies(Value: Integer);
   public 
     function  Execute: Boolean; override;
   published 
     property  Collate: Boolean read FCollate write FCollate default False;
     property  Copies: Integer read FCopies write SetNumCopies default  0 ;
     property  FromPage: Integer read FFromPage write FFromPage default  0 ;
     property  MinPage: Integer read FMinPage write FMinPage default  0 ;
     property  MaxPage: Integer read FMaxPage write FMaxPage default  0 ;
     property  Options: TPrintDialogOptions read FOptions write FOptions default [];
     property  PrintToFile: Boolean read FPrintToFile write FPrintToFile default False;
     property  PrintRange: TPrintRange read FPrintRange write FPrintRange default prAllPages;
     property  ToPage: Integer read FToPage write FToPage default  0 ;
   end ;

 function  TPrintDialog.Execute: Boolean;
 const 
  PrintRanges:  array [TPrintRange]  of  Integer =
    (PD_ALLPAGES, PD_SELECTION, PD_PAGENUMS);
 var 
  PrintDlgRec: TPrintDlg;
  DevHandle: THandle;
 begin 
  FillChar(PrintDlgRec, SizeOf(PrintDlgRec),  0 );
   with  PrintDlgRec  do 
   begin 
    lStructSize := SizeOf(PrintDlgRec);
    hInstance := SysInit.HInstance;
    GetPrinter(DevHandle, hDevNames);
    hDevMode := CopyData(DevHandle);
    Flags := PrintRanges[FPrintRange]  or  (PD_ENABLEPRINTHOOK  or 
      PD_ENABLESETUPHOOK);
     if  FCollate  then  Inc(Flags, PD_COLLATE);
     if   not  (poPrintToFile  in  FOptions)  then  Inc(Flags, PD_HIDEPRINTTOFILE);
     if   not  (poPageNums  in  FOptions)  then  Inc(Flags, PD_NOPAGENUMS);
     if   not  (poSelection  in  FOptions)  then  Inc(Flags, PD_NOSELECTION);
     if  poDisablePrintToFile  in  FOptions  then  Inc(Flags, PD_DISABLEPRINTTOFILE);
     if  FPrintToFile  then  Inc(Flags, PD_PRINTTOFILE);
     if  poHelp  in  FOptions  then  Inc(Flags, PD_SHOWHELP);
     if   not  (poWarning  in  FOptions)  then  Inc(Flags, PD_NOWARNING);
    nFromPage := FFromPage;
    nToPage := FToPage;
    nMinPage := FMinPage;
    nMaxPage := FMaxPage;
    lpfnPrintHook := DialogHook;
    lpfnSetupHook := DialogHook;
    hWndOwner := Application.Handle;
    Result := TaskModalDialog(@PrintDlg, PrintDlgRec);
     if  Result  then 
     begin 
      SetPrinter(hDevMode, hDevNames);
      FCollate := Flags  and  PD_COLLATE <>  0 ;
      FPrintToFile := Flags  and  PD_PRINTTOFILE <>  0 ;
       if  Flags  and  PD_SELECTION <>  0   then  FPrintRange := prSelection  else 
         if  Flags  and  PD_PAGENUMS <>  0   then  FPrintRange := prPageNums  else 
          FPrintRange := prAllPages;
      FFromPage := nFromPage;
      FToPage := nToPage;
       if  nCopies =  1   then 
        Copies := Printer.Copies  else 
        Copies := nCopies;
     end 
     else   begin 
       if  hDevMode <>  0   then  GlobalFree(hDevMode);
       if  hDevNames <>  0   then  GlobalFree(hDevNames);
     end ;
   end ;
 end ;


Класно конечно, но только нутром я чувствую что это на Делфи, а я использую C++ Builder 6.0. Да и наверно давай уже закроем эту тему. По идеи если это в Windows'e дело то моя программа с нормальной операционной системой будет дружить. Я протестирую её на другом компе (это будет не скоро) и если что, то я ещё раз вынесу этот вопрос на обсуждение.
А вообще, СПАСИБО SowMan2 за желание помочь!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / PrintDialog1->Collate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]