/// <summary> /// Imprime etiquetas /// </summary> /// <param name="etiquetas">Etiquetas a serem impressas</param> /// <param name="layout">Layout de etiquetas</param> private void ImprimirEtiquetas(EtiquetaFormato [] etiquetas, LabelLayout layout) { ArrayList saquinhosImpressos = new ArrayList(); int deEtiqueta, atéEtiqueta; // Seleção de etiquetas a serem impressas int nEtiquetas; // Total de etiquetas a serem impressas int etiquetasPágina; // Etiquetas por página int iEtiqueta; // Iterador nEtiquetas = CalcularNúmeroEtiquetas(etiquetas); etiquetasPágina = layout.LabelsPerPage; printDlg.PrinterSettings.MaximumPage = (int) Math.Ceiling(nEtiquetas / (float) etiquetasPágina); printDlg.PrinterSettings.MinimumPage = 1; printDlg.PrinterSettings.DefaultPageSettings.PaperSize = layout.PaperSize; printDlg.PrinterSettings.FromPage = 1; printDlg.PrinterSettings.ToPage = printDlg.PrinterSettings.MaximumPage; if (printDlg.ShowDialog(this.ParentForm) != DialogResult.OK) { MessageBox.Show(this, "Impressão cancelada pelo usuário", "Impressão", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } aguardeImpressão = new Aguarde( "Preparando impressão...", 2 + printDlg.PrinterSettings.ToPage - printDlg.PrinterSettings.FromPage, "Imprimindo etiquetas", "Aguarde enquanto o sistema imprime as etiquetas solicitadas."); // Mostrar janela de espera aguardeImpressão.Abrir(); aguardeImpressão.Tag = 0; // Usado para numeração de página try { // Preparar impressão layout.Document = printDoc; deEtiqueta = (printDlg.PrinterSettings.FromPage - 1) * etiquetasPágina; atéEtiqueta = (printDlg.PrinterSettings.ToPage) * etiquetasPágina - 1; iEtiqueta = 0; // Inserir objetos de impressão layout.Objects = new ArrayList(); // Atualizando dados aguardeImpressão.Passo("Sincronizando dados com o banco de dados"); bandeja.AtualizaObjetosInstrínsecosDosSaquinhos(); // Formata a impressão aguardeImpressão.Passo("Formatando dados para impressão de etiquetas"); foreach (SaquinhoEtiqueta saquinho in bandeja) { /* Verificar se saquinho contém formato a ser * impresso. Não é a melhor implementação, * porém o número de formatos é bem pequeno, * levando a um pior desempenho caso utilizado * busca binária, já que deve ordenar os itens. */ for (int i = 0; i < etiquetas.Length; i++) if (saquinho.Etiqueta == etiquetas[i]) { #if DEBUG if (saquinho.Mercadoria == null) throw new NullReferenceException("Mercadoria de saquinho está nula!"); #endif if (iEtiqueta >= deEtiqueta && iEtiqueta <= atéEtiqueta) { layout.Objects.Add( new RepeatedObject( layout.Items[i], saquinho.Mercadoria, ( Convert.ToInt32(saquinho.Quantidade) > atéEtiqueta - iEtiqueta + 1 ? atéEtiqueta - iEtiqueta + 1 : Convert.ToInt32(saquinho.Quantidade)))); saquinho.Impresso = true; if (saquinhosImpressos.Contains(saquinho)) throw new Exception("Lista ja contem o item de etiqueta"); saquinhosImpressos.Add(saquinho); } else if (iEtiqueta <= atéEtiqueta && iEtiqueta + saquinho.Quantidade >= deEtiqueta) { layout.Objects.Add( new RepeatedObject( layout.Items[i], saquinho.Mercadoria, Convert.ToInt32(saquinho.Quantidade) - (deEtiqueta - iEtiqueta) > atéEtiqueta - iEtiqueta + 1 ? atéEtiqueta - iEtiqueta + 1 : Convert.ToInt32(saquinho.Quantidade) - (deEtiqueta - iEtiqueta))); saquinho.Impresso = true; if (saquinhosImpressos.Contains(saquinho)) throw new Exception("Lista ja contem o item de etiqueta"); saquinhosImpressos.Add(saquinho); } iEtiqueta += Convert.ToInt32(saquinho.Quantidade); } } bool loop; do { #if !DEBUG try #endif { printDoc.Print(); loop = false; } #if !DEBUG catch (Exception e) { loop = MessageBox.Show( this.ParentForm, "Não foi possível imprimir o documento. Verifique se a impressora está ligada e conectada corretamente ao computador.", "Impressão de etiquetas - " + e.Message, MessageBoxButtons.RetryCancel) == DialogResult.Retry; if (loop) { printDlg.AllowSomePages = false; printDlg.ShowDialog(this.ParentForm); } } #endif } while (loop); } finally { layout.Dispose(); aguardeImpressão.Close(); aguardeImpressão.Dispose(); aguardeImpressão = null; } bandeja.FoiImpresso(saquinhosImpressos); opçãoImprimir.Enabled = true; }