Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 09.02.2013, 02:14   #1
Paskal1
Форумчанин
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Адрес: Украина Кривой Рог
Сообщений: 69
Репутация: 10

skype: sisadmin_
Сообщение Нет кнопки применить в окне настройка печати

БРАТЦЫ ПОМОГИТЕ - задача нужно чтоб по нажатию кнопки открылось окно настройки печати самого принтера, нашел код представленный ниже, но в нем нет кнопки применить помогите разобраться я в Api ноль.
Код вызова окна настройки печати
Код:

Printer.PrinterIndex := sCombobox1.ItemIndex +2;    {Выбраный принтер}
 PrintName := PChar(sCombobox1.Text + ' Надстройка');
 Printer.GetPrinter(Device,Driver,Port,hDeviceMode);
 if not OpenPrinter(@Device, hPrinter, @Defaults) then
   RaiseLastWin32Error;
 try
   DocumentProperties(sCombobox1.ItemIndex {Выбраный принтер} ,hPrinter,PrintName,
   devmode^,devmode^,DM_IN_PROMPT);
   SetPrinter(Handle,2,pPrInfo2,0);
 finally
   ClosePrinter(hPrinter);
 end;

Большое спасибо.
Paskal1 вне форума   Ответить с цитированием
Старый 09.02.2013, 14:56   #2
Smogg
Профессионал
 
Регистрация: 14.06.2011
Сообщений: 1,157
Репутация: 354
По умолчанию

Если окно настроек - модальное окно, то смысла в кнопке "применить" нету.
Smogg вне форума   Ответить с цитированием
Старый 09.02.2013, 17:38   #3
Paskal1
Форумчанин
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Адрес: Украина Кривой Рог
Сообщений: 69
Репутация: 10

skype: sisadmin_
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Если окно настроек - модальное окно, то смысла в кнопке "применить" нету.
как понимать модальное, ну вызываю я это окно через api
но оно само по себе то есть прогу мою оно не блокирует,
Ах да там где превьюшка отображение листа в настройках, сам лист отсуцтвует а в оригинале есть.
Paskal1 вне форума   Ответить с цитированием
Старый 09.02.2013, 19:20   #4
Smogg
Профессионал
 
Регистрация: 14.06.2011
Сообщений: 1,157
Репутация: 354
По умолчанию

Цитата:
LONG DocumentProperties(
_In_ HWND hWnd,
_In_ HANDLE hPrinter,
_In_ LPTSTR pDeviceName,
_Out_ PDEVMODE pDevModeOutput,
_In_ PDEVMODE pDevModeInput,
_In_ DWORD fMode
);
Т.е., если используете действительно АПИшную функцию, то первым параметром должны передавать хендл на окно-parent. Окно настроек принтера таки да - модальное. Каковое ведет себя как модальное, лишь если назначить ему parent тем или иным способом)
Smogg вне форума   Ответить с цитированием
Старый 09.02.2013, 19:27   #5
Paskal1
Форумчанин
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Адрес: Украина Кривой Рог
Сообщений: 69
Репутация: 10

skype: sisadmin_
Вопрос

Цитата:
Сообщение от Smogg Посмотреть сообщение
Т.е., если используете действительно АПИшную функцию, то первым параметром должны передавать хендл на окно-parent. Окно настроек принтера таки да - модальное. Каковое ведет себя как модальное, лишь если назначить ему parent тем или иным способом)
Мало что из этого понял
ну как я понял то мне не хватает параметра (parent) здесь
и как мне этот parent задать и где его брать?
ну то что в скобки его вставить я понял только что вставить?
извените за много вопросов
Код:

DocumentProperties(sCombobox1.ItemIndex {Выбраный принтер} ,hPrinter,PrintName,
   devmode^,devmode^,DM_IN_PROMPT);
   SetPrinter(Handle,2,pPrInfo2,0);

Paskal1 вне форума   Ответить с цитированием
Старый 10.02.2013, 05:25   #6
Smogg
Профессионал
 
Регистрация: 14.06.2011
Сообщений: 1,157
Репутация: 354
По умолчанию

В Дельфи всегда есть самое верхнее, но всегда скрытое (а точнее - видимое, но с нулевыми размерами) окно Application. Это окно Application по умолчанию назначается parent'ом всем Form1, Form2 и т.д.
Вот именно его вам и нужно указать как parent:
Код:

DocumentProperties(Application.handle {окно-"родитель"} ,hPrinter,PrintName,
   devmode^,devmode^,DM_IN_PROMPT);


Последний раз редактировалось Smogg; 10.02.2013 в 05:30.
Smogg вне форума   Ответить с цитированием
Старый 10.02.2013, 07:30   #7
Paskal1
Форумчанин
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Адрес: Украина Кривой Рог
Сообщений: 69
Репутация: 10

skype: sisadmin_
Восклицание

Теперь это окно не дает доступа к родителю пока его не закроешь
но кнопки применить так и нет. И настройки не сохраняет

Привожу всю процедуру может где то ошибка.


Код:

procedure TForm3.sBitBtn2Click(Sender: TObject);
const
 Defaults: TPrinterDefaults = (pDatatype: nil; pDevMode: nil;
 DesiredAccess: STANDARD_RIGHTS_REQUIRED or PRINTER_ACCESS_USE);
var
 PrintName: PChar;
 hPrinter: THandle;
 Device: array[0..1024] of char;
 Driver: array[0..1024] of char;
 Port: array[0..1024] of char;
 hDeviceMode: THandle;
 devmode: PDevMode;
begin
 Printer.PrinterIndex := sCombobox1.ItemIndex +2;    {Выбраный принтер}
 PrintName := PChar(sCombobox1.Text);
 Printer.GetPrinter(Device,Driver,Port,hDeviceMode);
 if not OpenPrinter(@Device, hPrinter, @Defaults) then
   RaiseLastWin32Error;
 try
 DocumentProperties(Application.handle ,hPrinter,PrintName, devmode^,devmode^,DM_IN_PROMPT);
 finally
   ClosePrinter(hPrinter);
 end;
end;

исходник брал от сюда
http://delphimaster.net/view/2-1257285507
Описание api функции
http://msdn.microsoft.com/en-us/libr...loband%29.aspx

Последний раз редактировалось Paskal1; 10.02.2013 в 07:32.
Paskal1 вне форума   Ответить с цитированием
Старый 10.02.2013, 12:39   #8
Smogg
Профессионал
 
Регистрация: 14.06.2011
Сообщений: 1,157
Репутация: 354
По умолчанию

У вас есть два варианта:
1. Следовать общепринятому шаблону дизайна, когда после открытия окна настроек принтера дальнейшая работа с программой возможна лишь после окончания процедуры выбора настроек и использовать системный вариант окна настроек. В этом случае кнопка "Применить" ни к чему.
2. Делать свой PropertySheet, но уже без флага PSH_NOAPPLYNOW.

Или третий вариант, который я не очень понимаю можно ли реализовать: побаловаться с SetWindowLong для окна настроек и как-то вытащить PropertySheetPage.

А насчет настроек, попробуйте повторно вызывать DocumentProperties, но уже с флагом DM_IN_BUFFER, передавая ей полученную DEVMODE data structure после предыдущего вызова с флагом DM_IN_PROMPT. WinAPI он такой. Избыточный.
Только здесь я тоже не уверен. Принтера нету, проверять не на чем.

Последний раз редактировалось Smogg; 10.02.2013 в 16:23.
Smogg вне форума   Ответить с цитированием
Старый 11.02.2013, 02:44   #9
Paskal1
Форумчанин
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Адрес: Украина Кривой Рог
Сообщений: 69
Репутация: 10

skype: sisadmin_
По умолчанию

Вообщем то же но в другой упаковке проблема таже не сохраняет параметры.
Подскажите что не так какой параметр не верный.
Сил моих нет больше с api бороться
Код:

procedure TForm3.mySetPrint(Sender: TObject);
Var
pPrName : PChar;
Handle: THandle;
dwNeeded: THandle;
pPrInfo2:PPrinterInfo2;
MyOrientation:Integer;
begin
      pPrName:=PChar(sComboBox1.Text); // Берём имя принтера
      OpenPrinter(pPrName,Handle,nil); // Хэндл
      GetPrinter(Handle,2,nil,0,@dwNeeded); // в dwNeeded - размер, который нужно выделить для структуры
      pPrInfo2:=PPrinterInfo2(GlobalAlloc(GHND,dwNeeded)); //выделяем
      GetPrinter(Handle,2,pPrInfo2,dwNeeded,@dwNeeded);  // читаем в pPrInfo2
      pPrInfo2.pDevMode.dmFields:=DM_ORIENTATION;   // ставим чё нам нада
      pPrInfo2.pDevMode.dmOrientation:=MyOrientation; // ставим чё нам нада
      pPrInfo2.pSecurityDescriptor:=nil;              // ставим чё нам нада

        DocumentProperties(0,Handle,pPrName,pPrInfo2.pDevMode^,pPrInfo2.pDevMode^,{DM_IN_BUFFER or DM_OUT_BUFFER}DM_IN_PROMPT);   // вносим изменения в DevMode

       //RaiseLastWin32Error;
      SetPrinter(Handle,2,pPrInfo2,0);  // апдейтим
      GlobalFree(Cardinal(pPrInfo2)); // чистим
      ClosePrinter(Handle);

end;

Paskal1 вне форума   Ответить с цитированием
Старый 11.02.2013, 02:48   #10
Paskal1
Форумчанин
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Адрес: Украина Кривой Рог
Сообщений: 69
Репутация: 10

skype: sisadmin_
По умолчанию

Смущает меня вот эти параметры один входной а другой выходной но почему они одинаковые?

Код:

pPrInfo2.pDevMode^,pPrInfo2.pDevMode^

Paskal1 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не рисуются кнопки на главном окне Sylar9 Win Api 20 20.07.2012 15:09
Кнопки в pop-up окне sem_1989 JavaScript, Ajax 1 01.08.2011 17:50
Как сделать неактивной кнопку печати в окне предварительного просмотра PSZ Microsoft Office Excel 0 05.11.2010 16:29
Настройка печати Максим_Леонидович Компоненты Delphi 3 26.09.2008 20:45
кнопки в окне mahsus Общие вопросы .NET 0 29.02.2008 13:42


16:18.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru