Добавление дополнительных наклеек при печати наклеек на профиль с дополнительной информацией
Данный скрипт довольно сложный в применении по сравнению с другими скриптами. Задача: необходимо на основе определенных условий добавить в цикл наклеек на профиль дополнительные наклейки с отображением дополнительной информации (например дополнительные наклейки на детали створки в которых установлена ручка для отображения подробной информации по фурнитуре на данной створке). Выполнение данной задачи обеспечивает наличие двух событий в модуле печати OnPrintOtchetCyclePrepare и OnPrintOtchetElemVisiblePrepare (третье событие OnPrintOtchetBeforeBuild в данном скрипте не используется). Событие OnPrintOtchetCyclePrepare выполняется после подготовки любого цикла. Благодаря данному событию мы можем заранее указать идентификатор печатной формы и идентификатор элемента цикла на который мы будем оказывать влияние (вот строка if not((PrintModule.CurPrintOtchetId=109)and(PrintModule.CurPrintObjectId=1)) then exit;). Смысл нашего влияния это в стандартный набор наклеек в цикле добавить несколько дополнительных и присвоить им в поле Tag некоторую метку, которая позволит нам дальше обрабатывать условия отображения надписей в стандартных и дополнительных наклейках на основе данной информации. Вторую часть задачи решает событие OnPrintOtchetElemVisiblePrepare которое выполняется в момент определения необходимости отображения того или иного элемента. Зная заранее что мы в цикле добавили несколько дополнительных наклеек с определенным полем Tag а также зная заранее идентификатор печатной формы и идентификаторы элементов на видимость которых нам нужно повлиять, мы можем в стандартных наклейках оставить стандартные надписи, а во вновь добавленных наклейках стандартные надписи скрыть и отобразить только дополнительные надписи (дополнительные надписи необходимо заранее с помощью редактора печатных форм добавить в печатную форму, скрипт будет просто влиять на их видимость).
procedure OnPrintOtchetBeforeBuild; begin //Showmessage('Event BB!!! '+inttostr(PrintModule.CurPrintOtchetId)+', '+inttostr(PrintModule.CurPrintObjectId)); end; procedure OnPrintOtchetCyclePrepare; var i:integer; rpr1,rpr2:TCycleRPRItem; reil:TId32L; rdiout:TRaskrDetalItem; begin //Showmessage('Event CP!!! '+inttostr(PrintModule.CurPrintOtchetId)+', '+inttostr(PrintModule.CurPrintObjectId)); if not((PrintModule.CurPrintOtchetId=109)and(PrintModule.CurPrintObjectId=1)) then exit; i:=0; while i<=PrintData.RPRDet.Items.Count-1 do begin rpr1:=PrintData.RPRDet.Items.GetByNum(i); if (rpr1.detnum>=0)and(rpr1.Tag=) then begin reil:=rpr1.rei.GetElm(rpr1.detnum); rdiout:=gd.RaskrProf.InDetales.GetById(reil.Id); if rdiout.Ruchka then begin rpr2:=TCycleRPRItem.Create; rpr2.Assign(rpr1); rpr2.Tag:='Ruch1'; PrintData.RPRDet.Items.InsertBeforeNum(rpr2,aimYes,i+1); rpr2:=TCycleRPRItem.Create; rpr2.Assign(rpr1); rpr2.Tag:='Ruch2'; PrintData.RPRDet.Items.InsertBeforeNum(rpr2,aimYes,i+1); rpr2:=TCycleRPRItem.Create; rpr2.Assign(rpr1); rpr2.Tag:='Ruch3'; PrintData.RPRDet.Items.InsertBeforeNum(rpr2,aimYes,i+1); end; end; inc(i); end; end; procedure OnPrintOtchetElemVisiblePrepare; var rpr1:TCycleRPRItem; poi:TPrintObjectItem; popi:TPrintObjectPositionItem; begin //Showmessage('Event EVP!!! '+inttostr(PrintModule.CurPrintOtchetId)+', '+inttostr(PrintModule.CurPrintObjectId)); if not((PrintModule.CurPrintOtchetId=109)and(PrintModule.CurPrintObjectId=7)) then exit; rpr1:=PrintData.RPRDet.Items.GetByNum(PrintData.RPRDet.ItemPos); if (rpr1.detnum>=0)and(rpr1.Tag='Ruch2') then begin poi:=PrintModule.CurPrintObject; if poi is TPrintObjectPositionItem then begin popi:=TPrintObjectPositionItem(poi); popi.Visible:=false; end; //PrintModule.CurPrintObject.Visible:=false; end; end;