печать в Билдере

Foxs 03.06.2004 - 13:22 | Печать на бланках строгой отчетности в определенных местах и их настрай. Подскажите плз или пример....
Foxs 1 - 04.06.2004 - 15:53 | Что не кто не делал а ?
dixand 2 - 07.06.2004 - 11:11 | Ну можнов Qreporte сделать форму, потом туда кидать значения и печатать, вобщем копай QReport компоненты
Foxs 3 - 07.06.2004 - 15:32 | Согласен я так и хотел сделать, но а если прийдется настроить поля печати ниже, выше и т. д. хочу автоматизировать этот процес.
dvserg 4 - 08.06.2004 - 13:14 | выводишь в шаблон ворда, а сам шаблон адаптируешь к БСО как тебе нужно
dvserg 5 - 08.06.2004 - 13:16 | то-же ч/з эксель можно реализовать через имена областей. При изменении формы БСО достатчно будет подкорректировать шаблон экселя и не трогать саму программу
Тоже нужно 6 - 08.06.2004 - 13:19 | А как выводить в шаблон ворда?
я охреневаю 7 - 08.06.2004 - 20:02 | какие будут ещё варианты? просто интересно, до каких ещё извращений можно дойти...
я тоже 8 - 08.06.2004 - 20:03 | есть вариант через калькулятор напечатать..... можно через 1С.....
FWP 9 - 09.06.2004 - 09:00 | to ##7,8. И что вы считате извратом? Что можете предложить сами? А ерничать у нас все могут!
dvserg 10 - 09.06.2004 - 10:36 | To 7,8 > после работы с экселем я отчетами типа фастрепорт пользуюсь крайне редко. Преимущества шаблонов очевидны - НЕ нужно переделывать приложение для правки отчета/ НЕ нужно мудрить с внешними DLL для этих-же целей. Вот пример извращения - занимает всего ничего. Пример открытия и закрытия документа Microsoft Excel void __fastcall UseXL() { Variant XLApp; AnsiString filename = "my_file.xls"; if (!FileExists(filename )) return; try { // Пример вызова объекта из компонента CppWebBrowser1 // XLApp = CppWebBrowser1->OleObject.GetActiveObject("Excel.Application"); // Поиск открытого приложения Excel XLApp = Variant::GetActiveObject("Excel.Application"); } catch(...) { try { // открываем Excel XLApp = Variant::CreateObject("Excel.Application"); } catch(...) { Application->MessageBox("Невозможно открыть Microsoft _Excel!","Ошибка",MB_OK+MB_ICONERROR); return; } } if (XLApp.IsEmpty()) return; // Если объект открыть не удалось - завершение функции try { // Открыть файл Excel // XLApp.OlePropertyGet("WorkBooks").OleProcedure("Open", filename.c_str() , 0, false, 1); XLSheet = XLApp.OlePropertyGet("ActiveSheet"); } catch(...) { Application->MessageBox("Ошибка открытия книги Microsoft _Excel!","Ошибка",MB_OK+MB_ICONERROR); throw; } if (XLSheet.IsEmpty()) return; // Если объект открыть не удалось - завершение функции // Собственно работа с открытым документом Excel // Закрываем документ _ // XLApp.OlePropertyGet("WorkBooks", 1).OleProcedure("Close"); _ // XLApp.OleProcedure("Quit"); // Или отображаем его XLApp.OlePropertySet("Visible", true); } Функция преобразования типов данных при экспорте void __fastcall ExpToExcel(Variant xlApp, int offset, const char *Exc, Variant data) /**************************************************************************** xlApp - Объект XL (xlApp, Range, ...); offset - смещение; Exc - регион(имя региона) ("A1:A100", "myNameForRegion") *****************************************************************************/ { try { if (!AnsiString(Exc).IsEmpty() && !data.IsEmpty()) switch (data.Type()) { case varSmallint: case varInteger: xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", (int)data); break; case varSingle: xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", (Single)data); break; case varDouble: xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", (double)data); break; case varCurrency: xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", (Currency)data); break; case varDate: if (TDateTime(data).Val != 0) xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", TDateTime(data)); break; case varByte: xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", (byte)data); break; case varString: xlApp.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", offset). OlePropertySet("Value", AnsiString(data).c_str()); default: break; } } catch(...) { /* обработка ошибки */ // throw; } } Пример вывода отчета в Excel с использованием именованных областей(Range) // Имена областей в файле шаблона Excel #define XL_DOCDATE "DocDate" // Имена ячеек в шапке таблицы #define XL_TABLEINDEX "TableIndex" #define XL_TABLEBSODATE "TableDate" #define XL_TABLEBSOTYPE "TableType" #define XL_TABLEBSOSERIAL "TableSerial" #define XL_TABLEBSONUMBER "TableNumber" #define XL_TABLEAGENT "TableAgent" #define XL_TABLESTATUS "TableStatus" void __fastcall BuildListReport(Variant XLApp, TDataSet *cdsReport) { if (XLApp.IsEmpty()) Abort(); // шапка таблицы ExpToExcel(XLApp, 0, XL_DOCDATE, TDateTime().CurrentDate()); // Таблица cdsReport->First(); // источник данных типа TDataSet while (!cdsReport->Eof) { // здесь cdsReport->RecNo задает смещение от шапки таблицы ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLEINDEX, cdsReport->RecNo); ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLEBSODATE, cdsReport->FieldByName(FLD_DATEINSERT)->Value); ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLEBSOSERIAL, cdsReport->FieldByName(FLD_SERIAL)->Value); ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLEBSOTYPE, cdsReport->FieldByName(FLD_TYPE)->Value); ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLEBSONUMBER, cdsReport->FieldByName(FLD_NUMBER)->Value); ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLEAGENT, cdsReport->FieldByName(FLD_CAPTION)->Value); ExpToExcel(XLApp, cdsReport->RecNo, XL_TABLESTATUS, cdsReport->FieldByName(FLD_OPERATION)->Value); cdsReport->Next(); } }
Тоже нужно 11 - 09.06.2004 - 11:20 | dvserg, а можно написать в ворде или екселе макрос с входным параметром типа массива, который сам будет размещать элементы этого массива по ячейкам, а макрос вызвать из билдера, передав ему этот массив?
archimag 12 - 09.06.2004 - 12:04 | Я что-то не пойму, почему обычные методы печати не походят?
dvserg 13 - 09.06.2004 - 15:52 | To 11> Наверное можно, но я не пробовал
Тоже нужно 14 - 09.06.2004 - 16:34 | А где можно почитать по предлагаемым интерфейсам ворда и екселя (типа для OlePropertySet())?
dvserg 15 - 09.06.2004 - 20:19 | Я смотрел макросы VB в XL Ставишь макрос на запись и делаешь чего-ниить. Так-же примеры в инете
Alexander Smith 16 - 13.06.2004 - 15:40 | Билдером не юзаю, но дельфи от билдера не отличается, потому Uses Printers; там как проиничить принтеры и т.д. - разберешься сам. далее, берешь "бланк строгой отчетности", мереешь линейкой координаты(в милиметрах), потом Printer.PageWidth - размер в принтерных координатах по Ох. Далее - Printer.PageWidth/210 - столько точек в 1м милиметре бумаги (при любом принтере, при печати на А4, и poPortrait). Собственно после этого унможаешь куда тебе печатать на полученную константу (Double) - получешь координаты в принтере. Вот и все.

>>