Ir para conteúdo
Fórum Script Brasil

Eder

Membros
  • Total de itens

    1.002
  • Registro em

  • Última visita

Tudo que Eder postou

  1. R. Carinha....você havia mencionado mais de uma consulta...então me veio a cabeça de colocar 3 queryes no form no meu exemplo eu fiz assim: 1-QrGroup1> onde esta os dados do VEICULO - queryrep1=query1 select * from AJUSTE, VEI, ROTA, MOTORIS where (ajuste.codvei = vei.codvei) and (ajuste.codrota = rota.codrot) and (ajuste.codmot = motoris.codmot) and (ajuste.codigo = "38") 1-QRSubDetail1> onde estão os dados do ABASTECIMENTO - FooterBand=rbGroupFooter(abaixo) 1-rbGroupFooter>que é a banda onde servirá pra contar registros em tela e somatorio da banda acima - dataset=query 2 select * from AJUSTE, ABA, POSTO where (ajuste.codigo = aba.codlan) and (aba.codpos = posto.codpos) and (ajuste.codigo = "38") 1-QRSubDetail2> onde estao os dados das DESPESAS - FooterBand=rbGroupFooter(abaixo) 1-rbGroupFooter>que é a banda onde servirá pra contar registros em tela e somatorio da banda acima - dataset=query 3 select * from AJUSTE, VALORES, HISTO where (ajuste.codigo = valores.codlan) and (valores.codhisto = histo.codhis) and (ajuste.codigo = "38") Note que sempre filtro o (ajuste.codigo = "38") em todas as queries pois é tabela AJUSTE é a mãe e a tabela aba(abastecimentos) e valores(despesas de viagem) são filhas. O relatório agora roda legal NÃO DUPLICA MAIS....porem nas rbGroupFooter que são as totalizadoras que fazem os somatorios dos itens....não soma....o resultado sai zero...nas duas rbGroupFooter(antes já não somava). até um QRSysData2=qrsDetailCount que serve pra contar os registros processados da o total de 1 uso assim pra somar QRExpr1: sum(query3.valor) Tens alguma ideia ....pra fazer este relatório somar....?? muito Grato
  2. Solução: segue unit completa pra quem vir a precisar: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, Buttons; type TForm1 = class(TForm) MaskEdit1: TMaskEdit; MaskEdit2: TMaskEdit; MaskEdit3: TMaskEdit; MaskEdit4: TMaskEdit; MaskEdit5: TMaskEdit; MaskEdit6: TMaskEdit; BitBtn1: TBitBtn; LabeL4: TLabel; Label1: TLabel; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function IncDay(const AValue: TDateTime; const ANumberOfDays: Integer = 1): TDateTime; begin Result := AValue + ANumberOfDays; end; function IncMinute(const AValue: TDateTime; const ANumberOfMinutes: Integer = 1): TDateTime; begin Result := ((AValue * 1440) + ANumberOfMinutes) / 1440; end; procedure TForm1.BitBtn1Click(Sender: TObject); var Inicio: TDateTime; Final: TDateTime; Dias: Double; // i: Integer; TimHora, recebe: TDateTime; StrFim: String; IntTotMin: Integer; StrHoraAtual: String; StrIniNoturno: String; StrFimNoturno: String; begin // não checa se as strings são datas ou horários válidos... // se não for, gera exceção if MaskEdit4.Text = '24:00' then begin MaskEdit4.Text:= '00:00'; MaskEdit3.Text:= datetostr(incday(strtodate(MaskEdit3.Text))); end; Inicio := StrToDate(MaskEdit1.Text) + StrToTime(MaskEdit2.Text); Final := StrToDate(MaskEdit3.Text) + StrToTime(MaskEdit4.Text); Dias := Final - Inicio; label4.caption:= formatdatetime('HH:MM:SS', Frac(Dias)); //label4.caption:= IntToStr(Trunc(Dias) * 24 + strtoint(copy(Label4.caption,1,2))) + copy(label4.caption,3,3); // TimHora:= Inicio; IntTotMin:= 0; StrFim:= ''; StrIniNoturno:= copy(maskedit5.text,1,2) + copy(maskedit5.text,4,2); StrFimNoturno:= copy(maskedit6.text,1,2) + copy(maskedit6.text,4,2); i:= 0; while strfim = '' do begin inc(i); if incminute(TimHora,i) > Final then begin strfim:= 'f'; end else begin incminute(TimHora,i); StrHoraAtual:= copy(datetimetostr(incminute(TimHora,i)),12,2) + copy(datetimetostr(incminute(TimHora,i)),15,2); if (StrHoraAtual > StrIniNoturno) or (StrHoraAtual <= StrFimNoturno) then begin inc(IntTotMin); end; end; end; strfim:= inttostr(IntTotMin div 60) + ':' + inttostr(IntTotMin mod 60); recebe := StrToTime(StrFim); // Label1.caption:= formatdatetime('HH:MM',(recebe)); end; procedure TForm1.FormCreate(Sender: TObject); begin shortdateformat:= 'dd/mm/yyyy'; end; Aquela função acima...é devido eu trabalhar com delphi 4 e o mesmo não possui a DateUtils, então a função substitui ela....agora pra quem tem a DateUtils não precisa da função ele funciona perfeito. Micheus Valeu a AJUDA...muito grato mesmo Abraço..t+ :D
  3. Ola..pessoal...tenho que montar um relatorio no meu ver muito dificil....no quick. tenho que mostrar assim: [b]AJUSTE DE VIAGEM [/b] PLACA_VEICULO =========== ---------------------------------------------------------------------- ABASTECIMENTOS ---------------------------------------------------------------------- data litros ---------------------------------------------------------------------- 30/06/07 20 01/07/07 30 ------------------ TOTAL........50 --------------------------------------------------------------------- DESPESAS DE VIAGEM ---------------------------------------------------------------------- data valor ---------------------------------------------------------------------- 30/06/07 15,00 01/07/07 30,00 ---------------------- TOTAL.........45,00 ---------------------------------------------------------------------- É bem completo...nunca fiz tão complexo...assim.. tou tentato montar e já consegui listar os dados..certinho...ta completinho.....porem os abastecimentos e as despesas de viagem estão duplicando....exatamento ao nr de registros ele duplica.. é um relatorio que manipula um monte de tabelas, motoristas, veiculos, historico etc... Não sei porque duplica........alguém poderia me dar uma luz. minha query ta assim: select * from AJUSTE, VEI, ROTA, MOTORIS, ABA, POSTO, VALORES, HISTO where (ajuste.codvei = vei.codvei) and (ajuste.codrota = rota.codrot) and (ajuste.codmot = motoris.codmot) and (ajuste.codigo = "38") and (ajuste.codigo = aba.codlan) and (aba.codpos = posto.codpos) and (ajuste.codigo = valores.codlan) and (valores.codhisto = histo.codhis) order by ajuste.codvei muito Grato
  4. R.: Carinha...tentei hoje a tarde, mas não consegui, não sei se é porque mexo pouco com programação, pois quando é uma rotina um pouco grande para desenvolver a lógica... tenho muito dificuldade. Não é falta de vontade...tentar eu até tento...mas não deu.. valeu...muito Grato. :(
  5. Carinha.....testei de todas as formas....mas encontrei um probleminha...acredito que era isto que você se referia no final do post. quando for hora inicio maior que 22:00 deveria ser assim né? haaaa.......eu acho que eu não tinha te explicado que estes calculos não são ponto de funcionarios especifico....são pra viagem de caminhoneiros....ou seja o cara sai num dia numa determinada hora e a viagem as vezes demora dias......ai o programa se perdi.....pois se ele sair no dia 30/06 as 08:00 e chegar dia 0107 as 08:00, as horas totais...deveria dar 24....e da zero..alias ele se perde totalmente....acho que é porque você fez pra analizar sempre dois dias, um antes e outro depois. Mas beleza........primeiro vou aprender assim...pra depois inovar. Valeu...muito Agradecido.
  6. Carinha....testei o seu codigo: procedure TForm1.Button2Click(Sender: TObject); Var DtEntrada, HrEntrada, DtSaida, HrSaida, QtHorasTrabalhadas, QtHoraADN, QtHoraAdicional, QtEntrada : TDateTime; begin dtEntrada := StrToDate('30/06/2007'); hrEntrada := StrToTime('21:00'); dtSaida := StrToDate('01/07/2007'); hrSaida := StrToTime('10:00'); // total de horas trabalhadas qtHorasTrabalhadas := (dtSaida + hrSaida) - (dtEntrada + hrEntrada); // calculando total de horas noturnas (ADN) qtHoraADN := 0; if hrEntrada >= 22 then begin if qtHorasTrabalhadas > (24 -hrEntrada) then // significa que hora de saída é no outro dia begin qtHoraADN := (24 -hrEntrada); // até o final do dia - 24:00 if hrSaida >= 5 then // se o cara saiu depois das 5, recebe até ai qtHoraADN := qtHoraAdicional +5 else qtHoraADN := qtHoraADN +hrSaida; // o cara saiu antes das 5 end; end else // o cara poderá ter entrado após as 00:00 if hrEntrada < 5 then begin if hrSaida >= 5 then // se o cara saiu depois das 5, recebe até ai qtHoraADN := 5 -qtEntrada else qtHoraADN := hrSaida -hrEntrada; // o cara saiu antes das 5 end; Label9.Caption:=timetostr(qtHorasTrabalhadas); //resultado horas trabalhadas Label10.Caption:=timetostr(qtHoraADN); //resultado horas noturnas label11.caption:=timetostr(QtHorasTrabalhadas - QtHoraAdn); //resultado horas Diurnas end; No final do codigo coloquei os labels pra receber os resultados As Horas Trabalhadas(label9) ta calculando certinho. As Horas Noturnas(label10) não ta calculando certo As Horas restantes que são as dirnas(label11) que seria o (QrHorasTrabalhadas-QtHorasAdn)também não esta porque a noturna não calcula certo, mas se a noturna calcular certo ela vai calcular também. tentei com este exemplo de datas: se usar assim: Tentei mudar o seu codigo ....mas ai me perdi....porque é um monte de if´s e me enrrolei todo. Grato. :(
  7. R.: Carinha..fiz o que me disse....e ai ele funciona em partesaté encrementei tipo a Hora Diurna que seria a total - Noturna.(que não tinha no codigo) Parece que é quando a hora não é cheia...tipo 30 minutos, 40 minutos etc...ele se perde foi o Bug que achei...pelo menos..só este. *também não consegui formatar a hora noturna no label.....ela esta como numero inteiro segue abaixo o codigo completo: Poderias dar uma olhadinha?? Valeu..Grato..... :)
  8. Micheus Carinha..dei uma olhada neste tópico tópico e achei esta dica: tentei compilar este codigo...mas deu erro nesta linha: parace que falta algo: parece uma variavel né?? :huh:
  9. Dois amigos me ajudaram a montar o codigo ficando assim: deste total que aparece no EditHETotal eu precisaria saber qtos são DIURNAS E qtas são NOTURNAS....sendo que a NOTURNA compreende do horario de 22:00 as 05:00 do outro dia...o restante considera-se DIURNAS... Micheus..Tens alguma ideia??(este negocio de data e hora é pedreira...nunca me entendi com este negocio). Grato :(
  10. Churc...bza? Carinha poderias colocar um exemplinho pratico aqui?? parece que este negocio de calcular horas e meio embolado....tem o lance de chegar até a meia noite...vira a gora...em fim...se puderes colocar um exemplinho...agradeço valeu :D
  11. Ola...Pessoal Estou num dilema.....preciso montar um aplicativo que conta horas, mas nem imagino como faz... :blush: Exemplo: alguém poderia me ajudar?? Grato
  12. Valeu....amigão...muito Grato
  13. Ola...pessoal. Eu tenho um programa numa filial da empresa....e vive dando queda de energia, e corronpendo os arquivos. Eu houvi falar que daria pra colocar um reindexador de tabelas paradox na inicialização do programa. Mas nem imagino como faz isto? alguém poderia me dar uma dica? uso o componente TTable e Datasource....não costume usar o componete Database Grato :(
  14. Carinha...ótima explicação. :D R. testei e funcionou.....haaa..tinha um errinho aqui ('cdpasta') faltou as aspas simples..acho que é esse o nome né!!! também testei a parte do DisplayLabel...também funcionou: Valeu ....muito Grato pela ajuda mais uma vez...t+ :D
  15. Ok...Micheus...Entendi... Carinha!!....e pra formatar será que da no codigo ou cai na mesma situação?? ou seja......não quero formatar no design-time. tentei assim: ATÉ FUNCIONA, mas se estiver adicionado via design-time, senão ele nem deixa compilar. podes dar uma dica? muito Grato
  16. amigão fiz como me disse deu erro:[Error] Unit1.pas(35): Incompatible types: 'TField' and 'String' também deu o mesmo erro :(
  17. R. Ola.?? bza??? Sim Este tipo que você me passou eu sei....mas queria adicionar os campos no braço via codigo e depois formatar.. pra formatar eu já consegui....mas eu queria antes de formatar adicionar via codigo. fiz assim mas não ta dando: Deve ter uma maneira de adicionar via codigo né? B)
  18. Ola.. Tem como eu formatar campos na query(paradox) sem adicionar os campos diretamento na query?? Tipo campo numerico. Grato :D
  19. R. Resolvido...era uma configuração no QUICK... valeu...muito grato..t+ :D
  20. Ola..pessoal.. Tou com um relatorio dando um probleminha......ele esta praticamente pronto exceto pelo seguinte: Ele duplica os dados ou seja, se ele tem 5 registros ao invés de ele somar os 5 e me passar o total...ele mostra 5 vezes o mesmo valor. exemplo: Incorreto: Correto: eu uso apenas uma tabela não tem outro...é uma consulta simples: codigo abaixo que estou usando: Muito Grato
  21. Ola..pessoal tem como mandar uma mensagem pra todos os usuarios que tem o email como por exemplo: @dominio.com.br Isto facilitaria pois a gente não precisaria lembrar o email de tempo mundo na empresa. Isto é possivel no outlook express?? Grato
  22. Eder

    Checklistbox Erro.

    R. Beleza sem problemas. :D Mas carinha..coloquei assim mas mesmo assim aparece este erro: LISTA DE INDICES FORA DA FAIXA 4este nr muda conforma a marcação no checklistbox Valeu :D
  23. Eder

    Checklistbox Erro.

    Resposta: O que seria este [idx] e como colocar no meu exemplo?? porque se eu coloco tipo assim: [1] ele da aquele erro: Lista de indices fora da faixa nr 1 acho que é aqui que não tou sabendo interpretar!!! :(
  24. Eder

    Checklistbox Erro.

    R. Ok...Verifiquei e você tem razão... R. Micheus.....ai é que ta.....pois eu sei que tenho que escolher atraves do checklist os campos visiveis as quais quero imprimir...e atraves desta seleção eu sei que também tenho que tornar visiveis os campos do dataset também.......pois é atraves do dataset que ele vai me dizer quais campos vou imprimir e ai usar o PrtGrid.....resumindo o dbgrid e o dataset devem interagir juntos....atraves da escolha do checklist. Ok...entendi mais não sei bolar o codigo....por favor me ajuda. Valor supor que tenho 5 campos na tabela e coloquei estes 5 campo no checklist pro usuario escolher qual quer visualizar e consequentemente imprimir... O que fazer agora?? muito Grato....pela paciências. t+
  25. Eder

    Checklistbox Erro.

    R.: Sim entendi errado mesmo..perdão. Faça o que eu fiz. Voce tem o fonte do tal, então, abra ele e olhe lá na parte em que ele irá imprimir os registros e você verá que ele usa algo como FDBGrid.DataSet.Field[indice].IsVisible para saber se o campo está visível - no Dataset ligado ao DBGrid!!! R.: Abri o fonte...mas na parte que imprimi não achei nada de estranho: veja abaixo: procedure TPrtGrid.PrintDialog; begin with TPrintDialog.Create(Self) do begin try Options := [poPageNums, poPrintToFile, poWarning]; MinPage := 1; MaxPage := MaxPages; FromPage := 1; ToPage := MaxPages; if Execute then begin if PrintRange = prPageNums then begin FFromPage := FromPage; FEndPage := EndPage; end; FOrientation:=GetOrientation; if PrintToFile then SaveToFile else begin FPrintToFile := false; Print; end; end; finally Free; end; end; end; Segue abaixo o *.pas do fonte do PrtGrid é eu não consegui fazer funcionar....de repente você olhando o fonte do PrtGrid...você me da uma luz... Valeu...muito Grato. t+ fonte: unit Prtgrid; { Original de Paul Rice } interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, DBGrids, DB, Printers, ExtCtrls, Grids; const MaxPages = 1000; MaxCols = 100; type TPageNumberPos = (pnNone, pnTopLeft, pnTopCenter, pnTopRight, pnBotLeft, pnBotCenter, pnBotRight); TPrtGrid = class(TComponent) private FFullPage: Boolean; OutFileName : TFileName; FDBGrid: TDBGrid; FTitleFont: TFont; FColHeaderFont: TFont; FColScale: integer; FLinesFont: TFont; FTitleAlign: TAlignment; FOrientation: TPrinterOrientation; FPageNLabel: String; FDateLabel: String; FPageNPos: TPageNumberPos; FDatePos: TPageNumberPos; FPrintFileName: String; FPrintFileDir: String; FTitle: String; FPrintMgrTitle: String; FirstRecordY: longint; DetailLineCharWidth: longint; DetailLineCharHeight: longint; RecCounter: longint; FPrintToFile: boolean; PrinterPageNo: longint; FFromPage: longint; FEndPage: longint; NPositions: integer; FTopMargin: integer; FBottomMargin: integer; FLeftMargin: integer; FRightMargin: integer; Positions: array[1..MaxCols]of longint; FColLines: boolean; FRowLines: boolean; FBorder: boolean; FHorizGap: integer; FVertGap: integer; procedure WriteAllToFile; procedure SetTitleFont(Value: TFont); procedure SetColHeaderFont(Value: TFont); procedure SetLinesFont(Value: TFont); procedure SetDBGrid(Value: TDBGrid); function GetDBGrid: TDBGrid; procedure SetPrintMgrTitle(const TmpStr: String); function GetPrintMgrTitle: String; function ColHeaderWidth(const ColHeaderStr: String): longint; function ColHeaderHeight: longint; procedure CalcPrinterPositions; function SetAlign(align:TAlignment; Left, Right: longint): longint; function SetPagePosX(PagePos: TPageNumberPos; Left, Right: longint): longint; function SetPagePosY(PagePos: TPageNumberPos; Top, Bottom: longint): longint; function PrepareAlign(Field: TField; Col: integer): longint; procedure WriteTitleToPrinter; procedure WriteColHdrsToPrinter(PosY: longint); procedure WriteRecordToPrinter; procedure PageJump; function RealWidth: longint; function AllPageFilled: boolean; procedure SetPixelsPerInch; function GetOrientation : TPrinterOrientation; procedure InitializePrinter; protected procedure SetName(const Value: TComponentName); override; public constructor Create(AOwner:TComponent); override; destructor Destroy; override; procedure Print; procedure PrintDialog; procedure SaveToFile; published property LeftMargin: integer read FLeftMargin write FLeftMargin; property TopMargin: integer read FTopMargin write FTopMargin; property RightMargin: integer read FRightMargin write FRightMargin; property BottomMargin: integer read FBottomMargin write FBottomMargin; property ColHeaderFont: TFont read FColHeaderFont write SetColHeaderFont; property ColScale: integer read FColScale write FColScale; //*tj* added property TitleFont: TFont read FTitleFont write SetTitleFont; property LinesFont: TFont read FLinesFont write SetLinesFont; property DBGrid: TDBGrid read GetDBGrid write SetDBGrid; property PrintMgrTitle: String read GetPrintMgrTitle write SetPrintMgrTitle; property Title: String read FTitle write FTitle; property TitleAlignment: TAlignment read FTitleAlign write FTitleAlign; property Orientation: TPrinterOrientation read FOrientation write FOrientation; property PrintToFile: boolean read FPrintToFile write FPrintToFile; property FullPage: boolean read FFullPage write FFullPage;{RS 29.11.1996} property PrintFileName: String read FPrintFileName write FPrintFileName; property PrintFileDir: String read FPrintFileDir write FPrintFileDir; property FromPage: longint read FFromPage write FFromPage; property EndPage: longint read FEndPage write FEndPage; property Border: boolean read FBorder write FBorder; property ColLines: boolean read FColLines write FColLines; property RowLines: boolean read FRowLines write FRowLines; property HorizontalGap: integer read FHorizGap write FHorizGap; property VerticalGapPct: integer read FVertGap write FVertGap; property PageNumberPos: TPageNumberPos read FPageNPos write FPageNPos; property PageNumberLabel: String read FPageNLabel write FPageNLabel; property DatePos: TPageNumberPos read FDatePos write FDatePos; property DateLabel: String read FDateLabel write FDateLabel; end; procedure Register; implementation var TextMetrics: TTextMetric; function Max(a, b: longint): longint; begin if a > b then Result := a else Result := b; end; function HeightScale(Value: longint; Pct: integer): longint; begin if Pct > 100 then Pct := 100 else if Pct < 0 then Pct := 0; if Pct = 0 then Result := Value else Result := Value + MulDiv(Value, Pct, 100); end; function CenterY(PosY, TextHt, Pct: longint): longint; begin Result := PosY + (HeightScale(TextHt, Pct) - TextHt) div 2; end; constructor TPrtGrid.Create(AOwner:TComponent); begin inherited Create(AOwner); FColHeaderFont := TFont.Create; FTitleFont := TFont.Create; FLinesFont := TFont.Create; FDBGrid := nil; FTitle := ''; FPrintMgrTitle := ''; RecCounter := 0; FHorizGap := 8; FVertGap := 40; FTopMargin := 60; FBottomMargin := 110; FLeftMargin := 30; FRightMargin := 30; FPrintToFile := False; FPrintFileName := 'GRID.LST'; FPrintFileDir := 'C:\'; FFullPage := false; FFromPage := 1; FEndPage := MaxPages; FBorder := False; FColLines := True; FRowLines := False; FTitleAlign := taCenter; FPageNPos := pnBotCenter; FPageNLabel := 'Page: '; FDatePos := pnTopRight; FDateLabel := ''; FOrientation := poLandscape; FTitleFont.Name := 'Arial'; FTitleFont.Style := [fsBold]; FTitleFont.Size := 12; FColHeaderFont.Name := 'Arial'; FColHeaderFont.Style := [fsBold]; FColHeaderFont.Size := 10; FColScale := 100; FLinesFont.Name := 'Arial'; FLinesFont.Style := []; FLinesFont.Size := 9; end; destructor TPrtGrid.Destroy; begin FColHeaderFont.Free; FTitleFont.Free; FLinesFont.Free; inherited Destroy; end; procedure TPrtGrid.SetColHeaderFont(Value: TFont); begin FColHeaderFont.Assign(Value); end; procedure TPrtGrid.SetTitleFont(Value: TFont); begin FTitleFont.Assign(Value); end; procedure TPrtGrid.SetLinesFont(Value: TFont); begin FLinesFont.Assign(Value); end; procedure TPrtGrid.SetDBGrid(Value: TDBGrid); begin FDBGrid := Value; end; function TPrtGrid.GetDBGrid: TDBGrid; begin Result := FDBGrid; end; procedure TPrtGrid.SetPrintMgrTitle(const TmpStr: String); begin FPrintMgrTitle := TmpStr; end; function TPrtGrid.GetPrintMgrTitle: String; begin Result := FPrintMgrTitle; end; procedure TPrtGrid.SetName(const Value: TComponentName); var ChangeText: Boolean; begin ChangeText := (Name = FPrintMgrTitle) and ((Owner = nil) or not (Owner is TPrtGrid) or not (csLoading in TPrtGrid(Owner).ComponentState)); inherited SetName(Value); if ChangeText then FPrintMgrTitle := Value; end; procedure TPrtGrid.WriteAllToFile; var OutFile: TextFile; BookMark1: TBookMark; FieldNo: longint; TmpStr: String; begin if OutFileName = '' then if FPrintFileName = '' then OutFileName := 'C:\GRID.LST' else OutFileName := FPrintFileDir+FPrintFileName; {$I-} AssignFile(OutFile, OutFileName); Rewrite(OutFile); {$I+} if IOResult <> 0 then begin ShowMessage('Erro para abrir o arquivo :' + OutFileName); Exit; end; with FDBGrid.DataSource.DataSet do begin Writeln(OutFile, FTitle+' - Importa para o Excel (Delimitado por Tab)'); TmpStr := ''; for FieldNo := 0 to FieldCount - 1 do if Fields[FieldNo].Visible then TmpStr := TmpStr + Fields[FieldNo].DisplayLabel + #9; WriteLn(OutFile, TmpStr); Screen.Cursor := crHourGlass; Bookmark1 := GetBookMark; try DisableControls; RecCounter := 0; First; while not EOF do begin TmpStr := ''; for FieldNo := 0 to FieldCount - 1 do if Fields[FieldNo].Visible then TmpStr := TmpStr + Fields[FieldNo].DisplayText + #9; WriteLn(OutFile, TmpStr); Inc(RecCounter); Next; end; finally Screen.Cursor := crDefault; EnableControls; CloseFile(OutFile); GotoBookMark(BookMark1); FreeBookMark(BookMark1); end; end; end; function TPrtGrid.ColHeaderWidth(const ColHeaderStr: String): longint; var tmpFont: TFont; begin with Printer.Canvas do begin tmpFont := TFont.Create; tmpFont.Assign(Font); Font.Assign(FColHeaderFont); SetPixelsPerInch; Result := TextWidth(ColHeaderStr); Font.Assign(tmpFont); tmpFont.Free; SetPixelsPerInch; end; end; function TPrtGrid.ColHeaderHeight: longint; var tmpFont: TFont; begin with Printer.Canvas do begin tmpFont := TFont.Create; tmpFont.Assign(Font); Font.Assign(FColHeaderFont); SetPixelsPerInch; Result := HeightScale(TextHeight('M'), FVertGap); Font.Assign(tmpFont); SetPixelsPerInch; tmpFont.Free; end; end; procedure TPrtGrid.CalcPrinterPositions; var ColWidth, FieldNo: longint; begin if FBorder then Positions[1] := 1 else Positions[1] := 0; NPositions := 0; with FDBGrid.DataSource.DataSet do for FieldNo := 0 to FieldCount - 1 do if Fields[FieldNo].Visible then begin inc(NPositions); ColWidth := Max(ColHeaderWidth(Fields[FieldNo].DisplayLabel), (DetailLineCharWidth * Fields[FieldNo].DisplayWidth)); Positions[NPositions + 1] := Positions[NPositions] + ColWidth + 2*FHorizGap; end; end; function TPrtGrid.SetAlign(align: TAlignment; Left, Right:longint):longint; var PosX: longint; begin PosX := 0; with Printer.Canvas do begin case Align of taLeftJustify: begin SetTextAlign(Handle, TA_LEFT); PosX := Left + FHorizGap; end; taRightJustify: begin SetTextAlign(Handle, TA_RIGHT); PosX := Right - FHorizGap; end; taCenter: begin SetTextAlign(Handle, TA_CENTER); PosX := Left + Round((Right - Left) / 2); end; end; end; Result := PosX; end; function TPrtGrid.SetPagePosX(PagePos: TPageNumberPos; Left, Right: longint): longint; var PosX: longint; begin PosX := 0; with Printer.Canvas do begin case PagePos of pnTopLeft, pnBotLeft: begin SetTextAlign(Handle, TA_LEFT); PosX := Left + FHorizGap; end; pnTopRight, pnBotRight: begin SetTextAlign(Handle, TA_RIGHT); PosX := Right - FHorizGap; end; pnTopCenter, pnBotCenter: begin SetTextAlign(Handle, TA_CENTER); PosX := Left + Round((Right - Left)/2); end; end; end; Result := PosX; end; function TPrtGrid.SetPagePosY(PagePos: TPageNumberPos; Top, Bottom: longint): longint; var PosY: longint; begin case PagePos of pnBotLeft, pnBotCenter, pnBotRight: begin PosY := Bottom; end; else PosY := Top; end; Result := PosY; end; function TPrtGrid.PrepareAlign(Field:TField; Col:integer): longint; begin Result := SetAlign(Field.Alignment, Positions[col], Positions[col + 1]); end; procedure TPrtGrid.WriteTitleToPrinter; var PosX, PosY, FieldNo, tmpColHeaderHeight: longint; TmpFont: TFont; tmpFontCreated: boolean; begin if (PrinterPageNo >= FFromPage) and (PrinterPageNo <= FEndPage) then with Printer.Canvas do begin tmpColHeaderHeight := ColHeaderHeight; tmpFont := TFont.Create; if (FTitle <> '') or (FDatePos <> pnNone) or (FPageNPos <> pnNone) then begin tmpFont.Assign(Font); Font.Assign(FTitleFont); SetPixelsPerInch; tmpFontCreated := True; end else tmpFontCreated := False; if FDatePos <> pnNone then begin if FDateLabel = '' then FDateLabel := FormatDateTime('mmm d, yyyy',SysUtils.Date); PosX := SetPagePosX(FDatePos, FLeftMargin, FLeftMargin + RealWidth); PosY := SetPagePosY(FDatePos, FTopMargin, Printer.PageHeight - FBottomMargin); TextOut(PosX, PosY, FDateLabel); end; if FTitle <> '' then begin PosX := SetAlign(FTitleAlign, FLeftMargin, FLeftMargin + RealWidth); TextOut(PosX, FTopMargin, FTitle); end; if FPageNPos <> pnNone then begin PosX := SetPagePosX(FPageNPos, FLeftMargin, FLeftMargin + RealWidth); PosY := SetPagePosY(FPageNPos, FTopMargin, Printer.PageHeight - FBottomMargin + 8); TextOut(PosX, PosY, FPageNLabel + IntToStr(PrinterPageNo)); end; if (FTitle <> '') or (FDatePos in [pnTopLeft, pnTopCenter, pnTopRight]) or (FPageNPos in [pnTopLeft, pnTopCenter, pnTopRight]) then FirstRecordY := FTopMargin + HeightScale(TextHeight('M'), FVertGap) + tmpColHeaderHeight else FirstRecordY := FTopMargin + tmpColHeaderHeight; if tmpFontCreated then begin Font.Assign(tmpFont); SetPixelsPerInch; end; tmpFont.Free; if FFullPage then if FColLines then for FieldNo := 2 to NPositions do begin MoveTo(FLeftMargin + Positions[FieldNo], FirstRecordY); LineTo(FLeftMargin + Positions[FieldNo], Printer.PageHeight - FBottomMargin); end; if dgTitles in FDBGrid.Options then WriteColHdrsToPrinter(FirstRecordY - tmpColHeaderHeight); end; end; procedure TPrtGrid.WriteColHdrsToPrinter(PosY: longint); var Col, PosX: longint; DSrcFld: longint; TmpFont: TFont; Rect: TRect; begin with FDBGrid.DataSource.DataSet, Printer.Canvas do begin tmpFont := TFont.Create; tmpFont.Assign(Font); Font.Assign(FColHeaderFont); SetPixelsPerInch; Rect.top := CenterY(PosY, TextHeight('M'), 2*FVertGap); Rect.bottom := FirstRecordY+((RecCounter + 1) * TextHeight('M')); Col := 0; for DSrcFld := 0 to FieldCount - 1 do begin if Fields[DSrcFld].Visible then begin inc(Col); PosX := FLeftMargin + PrepareAlign(Fields[DSrcFld], Col); Rect.left := FLeftMargin + Positions[Col] + FHorizGap; Rect.right := FLeftMargin + Positions[Col+1] - FHorizGap; TextRect(Rect, PosX, Rect.top, Fields[DSrcFld].DisplayLabel); end; end; Moveto(FLeftMargin, FirstRecordY); Lineto(FLeftMargin + RealWidth, FirstRecordY); Font.Assign(tmpFont); SetPixelsPerInch; tmpFont.Free; end; end; procedure TPrtGrid.WriteRecordToPrinter; var Col, PosX, PosY, FieldNo: longint; DSrcFld: longint; tmpFont: TFont; Rect: TRect; begin if (PrinterPageNo >= FFromPage) and (PrinterPageNo <= FEndPage) then with FDBGrid.DataSource.DataSet, Printer.Canvas do begin tmpFont := TFont.Create; tmpFont.Assign(Font); Font.Assign(FLinesFont); SetPixelsPerInch; Col := 0; PosY := FirstRecordY + RecCounter * DetailLineCharHeight; Rect.top := CenterY(PosY, TextHeight('M'), FVertGap); Rect.bottom:=FirstRecordY+((RecCounter+1) * DetailLineCharHeight); for DSrcFld := 0 to FieldCount - 1 do begin if Fields[DSrcFld].Visible then begin inc(Col); PosX := FLeftMargin + PrepareAlign(Fields[DSrcFld], Col); Rect.left := FLeftMargin + Positions[Col] + FHorizGap; Rect.right := FLeftMargin + Positions[Col+1] - FHorizGap; TextRect(Rect, PosX, Rect.top, Fields[DSrcFld].DisplayText); end; end; if FRowLines then begin MoveTo(FLeftMargin, PosY); LineTo(FLeftMargin + RealWidth, PosY); end; if not FFullPage then if FColLines then for FieldNo := 2 to NPositions do begin MoveTo(FLeftMargin + Positions[FieldNo], FirstRecordY); LineTo(FLeftMargin + Positions[FieldNo], PosY + DetailLineCharHeight); end; Font.Assign(tmpFont); SetPixelsPerInch; tmpFont.Free; end; end; procedure TPrtGrid.PageJump; begin RecCounter := 0; if (PrinterPageNo >= FFromPage) and (PrinterPageNo < FEndPage) then Printer.NewPage; inc(PrinterPageNo); end; function TPrtGrid.RealWidth: longint; begin Result := Printer.PageWidth - FLeftMargin - FRightMargin; end; function TPrtGrid.AllPageFilled: boolean; begin Result := (not FPrintToFile) and ((FirstRecordY + (RecCounter + 1) * DetailLineCharHeight) >= (Printer.PageHeight - FBottomMargin)); end; procedure TPrtGrid.Print; var BMark: TBookMark; PosY: longint; tmpStyle: TBrushStyle; begin PosY := 0; if not Assigned(FDBGrid) then raise Exception.Create('Erro: DBGrid não associado.'); if FPrintToFile then begin WriteAllToFile; Exit; end; InitializePrinter; with FDBGrid.DataSource.DataSet do begin BMark := GetBookMark; try DisableControls; RecCounter := 0; PrinterPageNo := 1; CalcPrinterPositions; if (Positions[NPositions + 1] > RealWidth) then begin if MessageDlg('Impressão muito larga para o papel.'+ ' Aborta a impressão?', mtConfirmation, mbYesNoCancel, 0 )<>idNo then begin Printer.Abort; exit; end; end; Screen.Cursor := crHourGlass; First; while not EOF do begin if RecCounter = 0 then WriteTitleToPrinter; WriteRecordToPrinter; Inc(RecCounter); Next; if AllPageFilled then begin PageJump; if PrinterPageNo > FEndPage then break; end; end; if FRowLines then begin PosY := FirstRecordY + RecCounter * DetailLineCharHeight; Printer.Canvas.MoveTo(FLeftMargin, PosY); Printer.Canvas.LineTo(FLeftMargin + RealWidth, PosY); end; if FBorder then begin tmpStyle:=Printer.Canvas.Brush.Style; Printer.Canvas.Brush.Style:=bsClear; if FullPage then Printer.Canvas.Rectangle(FLeftMargin, FirstRecordY - ColHeaderHeight, FLeftMargin + RealWidth, Printer.PageHeight - FBottomMargin) else Printer.Canvas.Rectangle(FLeftMargin, FirstRecordY - ColHeaderHeight, FLeftMargin + RealWidth, PosY); Printer.Canvas.Brush.Style:=tmpStyle; end; finally EnableControls; Screen.Cursor := crDefault; GotoBookMark(BMark); FreeBookMark(BMark); Printer.EndDoc; end; end; end; procedure TPrtGrid.PrintDialog; begin with TPrintDialog.Create(Self) do begin try Options := [poPageNums, poPrintToFile, poWarning]; MinPage := 1; MaxPage := MaxPages; FromPage := 1; ToPage := MaxPages; if Execute then begin if PrintRange = prPageNums then begin FFromPage := FromPage; FEndPage := EndPage; end; FOrientation:=GetOrientation; if PrintToFile then SaveToFile else begin FPrintToFile := false; Print; end; end; finally Free; end; end; end; procedure TPrtGrid.SaveToFile; begin FPrintToFile := true; with TSaveDialog.Create(Self) do begin try Filter := 'List Files (*.LST)|*.LST|Any file(*.*)|*.*'; if FPrintFileDir <> '' then InitialDir := FPrintFileDir; if FPrintFileName <> '' then begin FileName := FPrintFileName; Filter := Filter + '|This file (*' + ExtractFileExt(FileName) + ')|*' + ExtractFileExt(FileName); FilterIndex := 3; end; if Execute then begin FPrintFileDir := ExtractFilePath(FileName); FPrintFileName := ExtractFileName(FileName); OutFileName := FileName; Print; end; finally Free; end; end; end; procedure TPrtGrid.SetPixelsPerInch; var FontSize: integer; begin if not Printer.Printing then ShowMessage('Erro: BeginDoc não foi chamado antes do SetPixelsPerInch'); FontSize:=Printer.Canvas.Font.Size; Printer.Canvas.Font.PixelsPerInch:=GetDeviceCaps(Printer.Handle,LOGPIXELSY); Printer.Canvas.Font.Size := FontSize; GetTextMetrics( Printer.Canvas.Handle,TextMetrics ); end; function TPrtGrid.GetOrientation : TPrinterOrientation; var FDevice, FDriver, FPort: PChar; FHandle: THandle; FDeviceMode: PDevMode; begin result := poPortrait; GetMem (FDevice, 255); GetMem (FDriver, 255); GetMem (FPort, 255); Printer.GetPrinter (FDevice, FDriver, FPort, FHandle); if FHandle = 0 then begin Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter (FDevice, FDriver, FPort, FHandle); end; if FHandle <> 0 then begin FDeviceMode := Ptr(FHandle); case FDeviceMode^.dmOrientation of dmOrient_Portrait: result := poPortrait; dmOrient_Landscape: result := poLandscape; else result := poLandscape; end; end else ShowMessage('Erro não consigo identificar o modo de saida'); FreeMem (FDevice, 255); FreeMem (FDriver, 255); FreeMem (FPort, 255); end; procedure TPrtGrid.InitializePrinter; begin Printer.Orientation := FOrientation; Printer.BeginDoc; Printer.Title := FPrintMgrTitle; Printer.Canvas.Font.Assign(FLinesFont); SetPixelsPerInch; FVertGap:= Trunc(TextMetrics.tmHeight * 0.8); FHorizGap:= TextMetrics.tmMaxCharWidth div 4; DetailLineCharHeight := HeightScale(TextMetrics.tmHeight,FVertGap); DetailLineCharWidth := TextMetrics.tmMaxCharWidth; if (FColScale <> 100) and (FColScale > 0) and (FColScale < 500) then DetailLineCharWidth := 1+Trunc(DetailLineCharWidth * ColScale / 100); end; procedure Register; begin RegisterComponents('Data Controls', [TPrtGrid]); end; end.
×
×
  • Criar Novo...