Delphi -> TPrinter

RTFM 04.06.2004 - 02:42 | Ктонибудь работал? В книге написано, что надо выводить графику так: Printer.beginDoc; Printer.Canvas.......короче рисование на канвасе Priner.endDoc; А у меня эта штука просто пустой лист в принтере прокручивает и всею Что не так. Может кто знает?
Delphist 1 - 04.06.2004 - 03:09 | Вот это "...короче рисование на канвасе" давай сюда. Из других программ печать идет, чернила есть?
FWP 2 - 04.06.2004 - 07:58 | Хотел отправить реально работающий кусок текста. Но фильтр почему-то не пропускает.
RTFM 3 - 04.06.2004 - 11:34 | Вообще, там рисование на канвасе было больше, но не работало даже на примере Printer.Canvas.Brush.Color:=clBlack; Printer.Canvas.Pen.Color:=clBlack; Printer.Canvas.FillRect(Rect(100,100,300,300)); В других программах работало. Краска есть, да и не в краске дело, т.к. головка принтера даже не двтигалась (просто прокручивался лист. Т.е. получается, как будто я просто написал BeginDoc; EndDoc; Вот почему я и не стал "вывод на канвасе" описывать
SBoyko 4 - 04.06.2004 - 11:43 | RTFM твой ник есть ответ на твой вопрос. BeginDoc - отправляет задачу на принтер Уловил? Ты сначала отправляешь задачу на печать, а потом рисуешь на канве. ;)
SBoyko 5 - 04.06.2004 - 11:46 | Или я сам не то уловил?
RTFM 6 - 04.06.2004 - 11:49 | Лезу в хелп.... ждите....
RTFM 7 - 04.06.2004 - 11:55 | Я сначала подумал: "не мог же я так тупануть", потом залез в хелп и оказалось, что не мог. Вот справка по BeginDoc-у: Call BeginDoc to initiate a print job. If the print job is sent successfully, the application calls EndDoc to end the print job. The print job won't actually start printing until EndDoc is called. Короче, распечатка не начнется пока не вызовшь EndDoc ИМХО BeginDoc -Это что-то типа очистить канвас, инициализировать принтер и т.п. EndDoc - Отправить задание на принтер и начать печать Или я ошибаюсь?
SBoyko 8 - 04.06.2004 - 11:57 | Хм.. действительно двоякое толкование функции. А ведь к функции аннотация в первой строке: "Sends a print job to the printer." - коротко и ясно. А ремарк совсем про другое.
RTFM 9 - 04.06.2004 - 12:01 | Да, что-то мутновато... Что делать. Какие еще есть версии?
FWP 10 - 04.06.2004 - 14:12 | Какие на хрен версии, если твоего кода мы так и не увидели, а свой я не смог передать, т.к его фильтр не пропустил. Не пойму, чего криминального м.б. в паскалевском коде?
FWP 11 - 04.06.2004 - 14:13 | Вообще у меня есть предположение, что ты неправильно задаешь координаты. И рисунок непомещается на листе.
RTFM 12 - 04.06.2004 - 16:21 | Вот мой код: Printer.BeginDoc; Image1.Canvas.StretchDraw(Rect(0,0,Printer.PageWidth, Printer.PageHeight),TGraphic(Printer.Canvas)); Printer.EndDoc В имидже здоровый рисунок находится.
Тупой ламер 13 - 04.06.2004 - 16:26 | ;-) а с какого перепугу оно таким кодом должно что-то на принтер печатать?
SBoyko 14 - 04.06.2004 - 16:33 | Может что-то вроде этого заработает (принтера нету не проверю): .... Printer.Canvas.Assign(Image1.Canvas); ....
Delphist 15 - 04.06.2004 - 16:52 | Во-во, с этого надо было начинать. Ты же печатаешь на канве картинки, а не на канве принтера. Поменяй местами - все будет тип-топ.
RTFM 16 - 04.06.2004 - 23:12 | Тупой ламер: А почему нет? SBoyko: Спасибо, проверю Delphist:А ту уверен? Не знаю, как на счет функции StretcDraw, но когда работаешь с функцией Draw, то имено так оно и указывается т.е. ЧтоРисовать.Draw(координаты,куда рисовать) Палюбас тут так же должно быть. Дело кажется не в этом. Кстати, объясните по человечески, что делает Assign? Ато везде встречается, а что она делает - не знаю..
Delphist 17 - 04.06.2004 - 23:41 | Извини, но ты хоть занимался RTFM'ом перед тем, как задать этот вопрос? :) Draws the graphic specified by the Graphic parameter in the rectangle specified by the Rect parameter. Delphi syntax: procedure StretchDraw(const Rect: TRect; Graphic: TGraphic); Description Call StretchDraw to draw a graphic on the canvas so that the image fits in the specified rectangle. StretchDraw calls the Draw method of the graphic. The graphic object determines how to fit into the rectangle. This may involve changing magnification and/or aspect ratio. To render the graphic in its natural size, use the Draw method, instead. If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. Note: If the graphic is an icon, it is not stretched.
Delphist 18 - 04.06.2004 - 23:53 | По поводу Assign. Любой экземпляр класса в Delphi - это ссылка на занимаемую им память. Поэтому если мы напишем X := Y; где X и Y - это два разных экземпляра одного и того же класса, то получим, что теперь обе переменных указывают на один и тот же экземпляр класса (стали синонимами), а старый экземпляр X просто будет болтаться в памяти как мусор, с невозможностью адресовать его. X.Assign(Y); делает ПОЧТИ то же самое. Но теперь все свойства экземпляра Y целиком КОПИРУЮТСЯ в одноименные свойства экземпляра X. То есть, уже не надо писать X.Field_1 := Y.Field_1; X.Field_2 := Y.Field_2; ... X.Field_N := Y.Field_N; Все заменилось одной строкой с методом Assign. Многие классы переопределяют метод Assign, чтобы учесть свою собственную организацию данных (наличие подчиненных объектов, динамические списки и т.п.), но смысл от этого не меняется.
RTFM 19 - 05.06.2004 - 00:00 | Спасибо за ассигн :) Удобно, буду юзать. А что если типы разные. Так ведь можно такой байды нагородить, что потом век не отладишь :))
Delphist 20 - 05.06.2004 - 03:22 | А если типы разные, то компилятор не пропустит. Если один тип - наследник другого, то вызов может быть Потомок.Assign(Родитель) Ибо все поля родителя есть у потомка. Обратное неверно.
Sabrian 21 - 05.06.2004 - 03:27 | Байду можно написать и не юзая assign. Байду можно написать вообще ничего не юзая, кроме кривых рук. Касательно печати: надо рисовть имадж на канвас принтера, а не наоборот. Printer.Canvas.StStretchDraw(Rect(0,0,Image1.Picture.bitmap.Width,Picture.bitmap.Width.Height),Image1.Picture.bitmap);
Sabrian 22 - 05.06.2004 - 03:28 | StStretchDraw - святой драв какой-то :)
RTFM 23 - 05.06.2004 - 11:49 | Спасибо. Заработало. :)) Только теперь один вопрос: как определить размер листа То есть, скока точек печатать? Насколько растягивать изображение и т.р. Printer.Height нет такого Printer.Canvas.Height тоже нет :) А как размер тогда узнать?
RTFM 24 - 05.06.2004 - 12:28 | Всем спасибо. Вопрос снят Для потомков, если кому надо, дело делается так: Printer.BeginDoc; Printer.Canvas.StretchDraw(Rect(0,0,Printer.PageWidth, Printer.PageHeight),Image1.Picture.bitmap); Printer.EndDoc; Спасибо огромное, ато я эту прогу же месяц здать заказчику не могу. :)
SBoyko 25 - 05.06.2004 - 20:45 | Терпеливый у тебя заказчик. И главное умеет подобрать кадры ;)
RTFM 26 - 24.06.2004 - 23:16 | Ну, не надо наезжать :) Я в конце концов только учусь. А заказчик и правда хороший попался :)

>>