Sign in Join
Wiki copytemporary

LazReport Tutorial/pt: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Relatório
22
33Vamos usar um demo de banco de dados fornecido pelo Delphi (alias DBDEMOS). Você deve criar uma nova aplicação com o formulário principal chamado Form1.
44
55Ponha no formulário os seguintes componentes:
66
77- TTable:
88- Table1.DataBaseName := DBDEMOS
99- Table1.TableName := ANIMALS.DBF
1010- Table1.Active := TRUE
1111- TDataSource
1212- DataSource1.DataSet := Table1
1313- TfrDBDataSet
1414- frDbDataSet.DataSource := DataSource1
1515- TfrReport
1616- TfrDesigner
1717- 2 TButton
1818- Button1.Caption := ' Editing'
1919- Button2.Caption := ' Preview'
2020
2121O que resulta em:
2222
2323![](/wiki-images/6/6f/Imagem1.jpg)
2424
2525O LazReport permite associar nomes de variáveis a campos de dados ou valores do sistema, o que possibilita evitar que o usuário final decifre os geralmente pequenos nomes de campos. Em nosso exemplo vamos tentar criar uma variável nos campos BMP e NAME na Tabela1.
2626
2727![](/wiki-images/2/23/Imagem2.jpg)
2828
2929Clique em Variables Editor...
3030
3131![](/wiki-images/7/74/Imagem3.jpg)
3232
3333Agora clique no botão “Variables” para definir o lado esquerdo desta janela.
3434
3535![](/wiki-images/6/6a/Imagem4.jpg)
3636
3737Escreva as sentenças conforme indicado na figura acima. Demo Variables representa a categoria e CampoXXXX as variáveis. Para diferenciar as duas, as variáveis começam com um espaço. Então clique em OK para ter o seguinte:
3838
3939![](/wiki-images/f/f1/Imagem5.jpg)
4040
4141A categoria é disposta na ComboBox de variáveis acima. Cada variável precisa ser associada a um campo. Para isso, selecione a variável e depois o campo. A variável Name Field é associada ao campo Name da Tabela1.
4242
4343Como para as variáveis, clique com o botão direito do mouse no componente frReport e então em New State. Você abriu o editor:
4444
4545![](/wiki-images/3/38/Imagem6.jpg)
4646
4747Talvez você tenha notado um pequeno número de objetos na barra de objetos.
4848
4949![](/wiki-images/f/f3/Imagem7.jpg)
5050
5151Deve ter visto que os objetos são iguais aos componentes QRLabel, QRMemo, etc, do QuickReport.
5252
5353![](/wiki-images/f/f2/Imagem8.jpg)
5454
5555Em nosso relatório em branco você deve clicar no tipo de faixa que deseja criar: Selecione o título do estado e clique OK.
5656
5757| Tipo de faixa | Uso |
5858|-------------------|-------------------------------------------------------|
5959| Report title | Publicado apenas na primeira página |
6060| Report summary | Publicado apenas na última página |
6161| Page header | Publicado no topo de cada página |
6262| Page footer | Publicado no pé de cada página |
6363| Master header | Publicado no começo do primeiro nível (detalhe/barra) |
6464| Master Data | Dados do primeiro nível |
6565| Master Footer | Publicado no final do primeiro nível |
6666| Detail header | Publicado no começo do segundo nível (barra/detalhe) |
6767| Detail Data | Dados de segundo nível |
6868| Detail Footer | Publicado no final do segundo nível |
6969| Subdetail Header | Publicados no começo do terceiro (barra/detalhes) |
7070| Subdetail Data | Dados de terceiro nível |
7171| Subdetail Footer | Publicados no fim do terceiro nível |
7272| Overlay | |
7373| Heading of column | Publicado no topo de cada coluna |
7474| Column base | Publicado no começo do grupo |
7575| Heading of group | Publicado no topo de cada página |
7676| Foot of group | Publicado no final do grupo |
7777| VarColumn | Usado para tabelas cruzadas |
7878
7979Nesta faixa, adicione um retângulo e o dimensione como quiser. Escolha uma cor para o plano de fundo com o botão Baldinho Cheio, então clique duas vezes no retângulo para indicar o título.
8080
8181![](/wiki-images/2/2f/Imagem9.jpg)
8282
8383Na primeira linha deve ser indicado o título do relatório e na segunda, duas informações do sistema precisam ser adicionados. Eles são obtidos clicando em DB Field e depois em Other na ComboBox. Agora temos:
8484
8585![](/wiki-images/b/b2/Imagem10.jpg)
8686
8787Vamos inserir a faixa como dados mestre, então clique duas vezes nessa faixa para selecionar frDBDataSet1, a principal fonte de dados do nosso exemplo.
8888
8989![](/wiki-images/a/ae/Imagem11.jpg)
9090
9191Na metade esquerda da faixa insira um retângulo e dê um duplo clique.
9292
9393![](/wiki-images/2/2d/Imagem12.jpg)
9494
9595Aqui podem ser colocados vários campos, mas pode ser mantido um retângulo para um único campo a fim de aplicar formatos, por exemplo. A primeira linha Name \[Field Name\] é obtida escrevendo-se Name e então, com o botão Variable, inserindo a variável \[Field Name\] (poderíamos ter escrito isto diretamente). Para a segunda linha, Size\[\[Table1, “SIZE”\]*2.54\], nós escrevemos Size e com o botão DB Field escolhemos o tamanho do campo de Table1 e para converter este campo, expresso em polegadas, para centímetros, multiplicamos este campo por 2.54. Pode-se ver o poder do fastreport. Com apenas um retângulo coloca-se em nosso estado, a segunda nomeação, dois campos, incluindo um calculado. Agora no lado direito da faixa selecione uma imagem. Para mostrar sempre a mesma figura, seria suficiente dar um duplo clique nessa figura e carregar a figura desejada. Nós queremos uma figura associada com o pressionamento da tecla F11, para mostrar o Inspetor de Objetos.
9696
9797![](/wiki-images/f/f9/Imagem13.jpg)
9898
9999Informe a propriedade do Memo com a propriedade \[ImageField\]. Isso transforma a figura em um objeto associado com o campo de dados. O nosso primeiro estado está concluído. Deve ser gravado com o mesmo nome rapff. Um clique na pré-visualizaçao nos dá:
100100
101101![](/wiki-images/e/e3/Imagem14.jpg)
102102
103103Agora vamos escrever o código necessário para carregar e visualizar ou editar o nosso relaltório rap1frf. Para isto adicione ao projeto o seguinte código:
104104
105-`TForm1.Button2Click(Sender procedure: TObject);  `\
106-`begin `\
107-`  frReport1.LoadFromFile(' rap1.frf');  `\
108-`  FrReport1.ShowReport;  `\
109-`end;`\
110-`TForm1.ButtonClick(Sender procedure: TObject);  `\
111-`begin `\
112-`  frReport1.LoadFromFile(' rap1.frf');  `\
113-`  frReport1.DesignReport;  `\
114-`end; `\
105+``` pascal
106+TForm1.Button2Click(Sender procedure: TObject);
107+begin
108+ frReport1.LoadFromFile(' rap1.frf');
109+ FrReport1.ShowReport;
110+end;
111+TForm1.ButtonClick(Sender procedure: TObject);
112+begin
113+ frReport1.LoadFromFile(' rap1.frf');
114+ frReport1.DesignReport;
115+end;
116+```
115117
116118Você tem uma edição com pré-visualização que dá a possibilidade de os usuários finais modificarem o relatório sem precisar modificar a aplicação básica.
117119
118120Agora vamos adicionar funcionalidades ao nosso exemplo básico. Você deve adicionar um componente TButton com a propriedade Caption := ‘Print’; e um TPrintDialog. Obtemos isso:
119121
120122![](/wiki-images/3/31/Imagem15.jpg)
121123
122124Adicione também as unidades de impressora na cláusula uses do seu formulário e ponha o seguinte código no evento OnClick do botão Print:
123125
124-`TForm1.bPrintClick(Sender procedure: TObject);  `\
125-`var`\
126-`   FromPg, ToPg, Cpy: Integer;  `\
127-`   ind: Integer;  `\
128-`   St: String;  `\
129-`   Collap: Boolean;  `\
130-`begin `\
131-`    / / Carregar o estado`\
132-`   St:=ExtractFilePath(ParamStr(0));  `\
133-`   frReport1.LoadFromFile(St+' rap1.frf');  `\
134-`   / / Mudando a impressora padrão`\
135-`   ind: = Printer.PrinterIndex;  `\
136-`   / / Preparar o estado; para sair se a preparação não  funcionar`\
137-`   if not frReport1.PrepareReport then Exit;  `\
138-`   / / inicializa a limpeza do diálogo para edição de parâmetros`\
139-`  with PrintDialog1 C `\
140-`  begin `\
141-`       Options:=[poPageNums ]; / / autoriza a seleção de páginas`\
142-`       Copies: = 1;           / / apenas uma espécie`\
143-`       Collate: = True;     / / cópias ordenadas`\
144-`       FromPage: = 1;     / / página do começo`\
145-`       ToPage: = frReport1.EMFPages.Count;  //  última página`\
146-`      MaxPage: = frReport1.EMFPages.Count; / / número máximo de página`\
147-`       if Execute then    / /    limpeza do diálogo   `\
148-`       begin `\
149-`            if (Printer.PrinterIndex < > ind )/ / a impressora mudou?   `\
150-`               or frReport1.CanRebuild / / possui uma regeneração de estado? `\
151-`               // mudança de impressora   `\
152-`               or frReport1.ChangePrinter(ind, Printer.PrinterIndex) then                `\
153-`               frReport1.PrepareReport  `\
154-`            else Exit; / / a mudança de impressora ocorreu de forma errônea `\
155-`     if PrintDialog1.PrintRange = prPageNums then / / fez-se uma seleção de páginas`\
156-`     begin `\
157-`          FromPg : = PrintDialog1.FromPage; / / primeira página`\
158-`          ToPg : = PrintDialog1.ToPage;      / / última  `\
159-`     end; `\
160-`          Cpy :=PrintDialog1.Copies;   / / número de cópias           `\
161-`         Collap :=PrintDialog1.Collate;  / / exemplares ordenados   `\
162-`     // recorte de edição da página FromPg com ToPg  , " Cpy " `\
163-`     // exemplares ordenados  (Collap))  `\
164-`frReport1.PrintPreparedReport(FromPg, ToPg, Cpy, Collap);  `\
165-`    end; `\
166-`  end; `\
167-`end;`
126+``` pascal
127+TForm1.bPrintClick(Sender procedure: TObject);
128+var
129+ FromPg, ToPg, Cpy: Integer;
130+ ind: Integer;
131+ St: String;
132+ Collap: Boolean;
133+begin
134+ / / Carregar o estado
135+ St:=ExtractFilePath(ParamStr(0));
136+ frReport1.LoadFromFile(St+' rap1.frf');
137+ / / Mudando a impressora padrão
138+ ind: = Printer.PrinterIndex;
139+ / / Preparar o estado; para sair se a preparação não funcionar
140+ if not frReport1.PrepareReport then Exit;
141+ / / inicializa a limpeza do diálogo para edição de parâmetros
142+ with PrintDialog1 C
143+ begin
144+ Options:=[poPageNums ]; / / autoriza a seleção de páginas
145+ Copies: = 1; / / apenas uma espécie
146+ Collate: = True; / / cópias ordenadas
147+ FromPage: = 1; / / página do começo
148+ ToPage: = frReport1.EMFPages.Count; // última página
149+ MaxPage: = frReport1.EMFPages.Count; / / número máximo de página
150+ if Execute then / / limpeza do diálogo
151+ begin
152+ if (Printer.PrinterIndex < > ind )/ / a impressora mudou?
153+ or frReport1.CanRebuild / / possui uma regeneração de estado?
154+ // mudança de impressora
155+ or frReport1.ChangePrinter(ind, Printer.PrinterIndex) then
156+ frReport1.PrepareReport
157+ else Exit; / / a mudança de impressora ocorreu de forma errônea
158+ if PrintDialog1.PrintRange = prPageNums then / / fez-se uma seleção de páginas
159+ begin
160+ FromPg : = PrintDialog1.FromPage; / / primeira página
161+ ToPg : = PrintDialog1.ToPage; / / última
162+ end;
163+ Cpy :=PrintDialog1.Copies; / / número de cópias
164+ Collap :=PrintDialog1.Collate; / / exemplares ordenados
165+ // recorte de edição da página FromPg com ToPg , " Cpy "
166+ // exemplares ordenados (Collap))
167+frReport1.PrintPreparedReport(FromPg, ToPg, Cpy, Collap);
168+ end;
169+ end;
170+end;
171+```
168172
169173É um pouco longo mas nada impede que você crie uma classe herdada do TfrReport com um método de impressão ou, mais fácil, crie um procedimento PrintReport(letat: string) que carregue o relatório e o imprima.
170174
171175No menu Edit File \> Page Options você obtém isso:
172176
173177![](/wiki-images/7/73/Imagem24.jpg)
174178
175179Para escolher o tamanho do papel
176180
177181![](/wiki-images/a/ac/Imagem16.jpg)
178182
179183Para escolher as margens
180184
181185![](/wiki-images/3/3d/Imagem17.jpg)
182186
183187Para especificar o número de colunas e o espaço entre as colunas.
184188
185189No menu principal do editor, selecione File \> Report options para mostrar a seguinte caixa de diálogo:
186190
187191![](/wiki-images/4/4c/Imagem18.jpg)
188192
189193Aqui você especifica a impressora necessária para o carregamento de estados e se a preparação é feita em duas formas.
190194
191195Se você quer numerar suas páginas com a página atual a partir do número total de páginas, você deve escolher a opção Two-pass Report.
192196
193197Aqui serão adicionadas ao nosso exemplo algumas variáveis não relacionadas aos dados. Elas tornarão possível, por exemplo, mostrar as diferentes nomeações de acordo com o contexto. Para isso, abra o editor de relatórios e selecione o menu File e a Lista de Variáveis. Com uma variável Test, como explicado anteriormente, a única diferença é que você não vai selecionar um campo de valor, mas deixar None (o valor padrão). Publique um dos objetos e adicione a variável Test como visto anteriormente. Retorne ao Delphi (não esquecer de salvar seu relatório) e publique o evento OnGetValue do componente FrRepor1 adicionando o seguinte código:
194198
195-`procedure TForm1.frReport1GetValue(const ParName: String;  `\
196-`var ParValue: Varying; VAr fld: TField);  `\
197-`begin `\
198-` // trata o caso de variáveis não dependentes`\
199-` if UpperCase(ParName)=' TEST' then `\
200-`    ParValue:=' Answer: Variable " test1 " ';  `\
201-`end;`
199+``` pascal
200+procedure TForm1.frReport1GetValue(const ParName: String;
201+var ParValue: Varying; VAr fld: TField);
202+begin
203+ // trata o caso de variáveis não dependentes
204+ if UpperCase(ParName)=' TEST' then
205+ ParValue:=' Answer: Variable " test1 " ';
206+end;
207+```
202208
203209Ou também é possível passar o valor diretamente para a variável através do seguinte código:
204210
205-` procedure TForm1.Button1Click(Sender:TObject);`\
206-` begin`\
207-`   frReport1.Values.FindVariable('test').Field := QuotedStr('test1');`\
208-`   frReport1.ShowReport;`\
209-` end;`
211+``` pascal
212+ procedure TForm1.Button1Click(Sender:TObject);
213+ begin
214+ frReport1.Values.FindVariable('test').Field := QuotedStr('test1');
215+ frReport1.ShowReport;
216+ end;
217+```
210218
211219Isto não é usado para os dados, mas para permitir formatar os dados com DisplayFormat. Agora vamos ver como criar uma variável calculada. Como antes, vamos criar uma nova categoria (opcional) e uma variável. Test Calculation. Selecione uma nova variável e escolha um valor da ComboBox " Other " e " Expression ". Essa seleção ativa a área de dados de entrada Expression. Escreva o seguinte: \[Table1."SIZE"\] + \[Table1."WEIGHT"\] . Dessa forma você obterá o sumário dos campos de dados Size e Weight. Você também pode colocar nome nas variáveis. E pode utilizar os seguintes operadores:
212220
213221| Tipos de Operadores | Operadores |
214222|----|----|
215223| Logic | \>, \<, BUT, AND, NOT, =, \< \>, \> =, \< = |
216224| Mathematics\|\|-, *, +, MOD, / | |
217225
218226Mais à frente você poderá dispor dos seguintes funções padronizadas:
219227
220228| Função | Descrição | Exemplos |
221229|----------------|---------------------------|----------|
222230| SUM | Soma | |
223231| AVG | Média | |
224232| MIN | Mínimo | |
225233| MAX | Máximo | |
226234| FORMATDATETIME | Data e hora formatadas | |
227235| FORMATFLOAT | Ponto flutuante formatado | |
228236| LOWERCASE | Letras minúsculas | |
229237| NAMECASE | Primeira maiúscula | |
230238| STRTODATE | Data para string | |
231239| STRTOTIME | Hora para string | |
232240| UPPERCASE | Letras maiúsculas | |
233241
234242Se não for suficiente você pode criar suas próprias funções, mas isso nós veremos mais adiante.
235243
236244Agora vamos definir um formato para as variáveis de uma área. Um formato é válido para todas as variáveis de uma área de display. Para mostrar o editor de formatos, clique com o botão direito em uma área e então em Variable Format.
237245
238246![](/wiki-images/8/8e/Imagem19.jpg)
239247
240248A primeira ComboBox indica o tipo de dado (texto, numérico, data, hora, lógico). A segunda permite selecionar o formato preestabelecido. O tipo Text não permite qualquer formatação e o tipo Number requer um número decimal com vírgula. A não ser para os tipos Text e Logic, você pode usar as funções de formatação do Delphi. Você pode incluir também o conceito de highlighting, que é muito útil para enfatizar dados. Você pode especificar uma condição para aplicar o highlighting. Para isso use a palavra-chave Value para indicar o valor da variável. Aqui é requisitado o highlighting para todos os valores maiores que 1000. Por padrão o highlighter é um simples negrito sobre fundo branco. Você pode definir esses parâmetros para uma área clicando no botão Realce.
241249
242250![](/wiki-images/8/8c/Imagem20.jpg)
243251
244252Então você pode definir a cor do plano de fundo, o estilo e a cor da fonte a ser usada selecionando Intesified brightness.
245253
246254## Funções
247255
248256É necessário adicionar ao arquivo FR.lng a linha seguinte:
249257
250258FCT = CATEGORY \| FCT(\<X\>, \<Y\>, \<Z \>) \| Help on the function
251259
252260onde: FCT é o nome da função. CATEGORY, é o nome da categoria. FCT(\<X\>, \<Y\>, \<Z \>), é a visualização dos parâmetros necessários, com no máximo 3 parâmetros. Help., é uma pequena Ajuda que deve tornar possívell ao usuário entender o objetivo da função. \| é um separador. Cada parâmetro é separado por vírgula e pode ser uma expressão, uma constante, uma variável, um campo ou dados. As constantes de tipo alfanumérico devem ser limitadas por um caractere. As variáveir são limitadas por and. Os campos de dados são limitados como as variáveis e tem o seguinte formato:
253261
254262Dataset_Name. "Field_Name"
255263
256264Funções Estatísticas:
257265
258266SUM(\<X \>)
259267. Retorna a soma dos valores dados por \<X\>, que é geralmente um campo de dados.
260268
261269AVG(\<X \>)
262270Retorna a média dos valores dados por \<X\>.
263271
264272COUNT
265273Meter.
266274
267275MIN(\<X \>)
268276Retorna o valor mínimo dos valores dados em \<X\>.
269277
270278MAX(\<X \>)
271279Retorna o valor máximo dos valores dados em \<X \>.
272280
273281### Funções nos dados:
274282
275283FORMATDATETIME(\<X\>, \<Y \>)
276284Retorna os dados abreviados em (TDateTime) \< Y \> no formato \< X \>. \< X \> usa a descrição padrão [Lazarus para formatos](https://www.freepascal.org/docs-html/rtl/sysutils/formatdatetime.html).
277285
278286FORMATFLOAT(\<X\>, \<Y \>)
279287Retorna o numeral \< Y \> no formato \< X \>. \< X \> usa o padrão de descrição [Lazarus para formatos](https://www.freepascal.org/docs-html/rtl/sysutils/formatfloat.html).
280288
281289STRTODATE(\<X \>)
282290Retorna a repesentação (TdateTime) da string \< X \>. \< X \> deve respeitar o formato de dados
283291
284292STRTOTIME(\<X \>)
285293Retorna A representação digital (TDateTime) da string \< X \>. \< X \> deve respeitar o formato de horas.
286294
287295### Funções nos caracteres de conexão:
288296
289297LOWERCASE(\<X \>)
290298Retorna a string \<X\> em letras minúsculas.
291299
292300UPPERCASE(\<X \>)
293301Retorna a string \<X\> em maiúsculas.
294302
295303NAMECASE(\<X \>)
296304Retorna a string \<X\> com a primeira letra maiúscula.
297305
298306COPY(\<X\>, \<Y\>, \<Z \>)
299307Retorna a string \<X\> na posição \< Y \> e comprimento\< Z \>.
300308
301309Funções nos numerais:
302310
303311FRAC(\<X \>)
304312Retorna a parte decimal do número \< X \>.
305313
306314INT(\<X \>)
307315Retorna a parte inteira do número \< X \>.
308316
309317ROUND(\<X \>)
310318Retorna o número inteiro correspondente ao arredondamento de \< X \>.
311319
312320STR(\<X \>)
313321Retorna a string correspondente de um número \< X \>.
314322
315323### Funções Lógicas:
316324
317325IF(\<X\>, \<Y\>, \<Z \>)
318326Retorna \< Y \> se a expresssão \< X \> é verdadeira, se falsa retorna \< Z \>.
319327
320328Para adicionar suas próprias funções é realmente muito simples. Aqui um código-fonte para adicionar as funções POS e SQRT:
321329
322-`Unit FR_OGFct;`\
323-`interface `\
324-`implementation `\
325-`uses FR_Pars, FR_Class; / / Declaração-padrão`\
326-`type `\
327-` //Declaração de TBrOGFunctionLibrary `\
328-`TfrOGFunctionLibrary = class(TfrFunctionLibrary)`\
329-` public  `\
330-`  constructor Create; override;  `\
331-`  procedure DoFunction(FNo:integer procedure;  p1, p2,`\
332-`             p3:Variant; var valley:string); override;  `\
333-`             p3:Variant; var valley:string);`\
334-` end;  `\
335-`//************************** / / * TfrOGFunctionLibrary `\
336-`constructor TfrOGFunctionLibrary.Create;`\
337-`begin  `\
338-` inherited Create;  `\
339-` with List do `\
340-` begin`\
341-`  Add('POS');`\
342-`  ADD('SQRT');`\
343-` end;`\
344-`end;`\
345-`Procedure TfrOGFunctionLibrary.DoFunction(FNo:Integer procedure;  p1,`\
346-`p2, p3:Variant; Var valley:String);`\
347-`VAr Par1, Par2:  Varying;`\
348-`  Result:  Variantying;`\
349-`begin`\
350-`Try`\
351-` Case FNo of  //FNo é um íindice das funções declaradas no constructor  `\
352-`  0 : Begin   //função POS `\
353-`        Par1:=VarToStr(Parser.Calc(p1)); `\
354-`        Par2:=VarToStr(Parser.Calc(P2)); `\
355-`        Resultat:=Pos(Par1,Par2);`\
356-`      end;`\
357-`   1 : Resultat:=SQRT(Parser.Calc(P1));  //função SQRT`\
358-`  end;`\
359-` Except   `\
360-`  // String resultante se der erro   `\
361-`  Resultat:='Erreur fonction '+List.Strings[FNo];`\
362-` end;`\
363-` Val:=VarToStr(Resultat); // String  resultante`\
364-`end;`\
365-`Procedure DoInit;`\
366-`begin`\
367-` frRegisterFunctionLibrary(TfrOGFunctionLibrary);`\
368-`end;`
330+``` pascal
331+Unit FR_OGFct;
332+interface
333+implementation
334+uses FR_Pars, FR_Class; / / Declaração-padrão
335+type
336+ //Declaração de TBrOGFunctionLibrary
337+TfrOGFunctionLibrary = class(TfrFunctionLibrary)
338+ public
339+ constructor Create; override;
340+ procedure DoFunction(FNo:integer procedure; p1, p2,
341+ p3:Variant; var valley:string); override;
342+ p3:Variant; var valley:string);
343+ end;
344+//************************** / / * TfrOGFunctionLibrary
345+constructor TfrOGFunctionLibrary.Create;
346+begin
347+ inherited Create;
348+ with List do
349+ begin
350+ Add('POS');
351+ ADD('SQRT');
352+ end;
353+end;
354+Procedure TfrOGFunctionLibrary.DoFunction(FNo:Integer procedure; p1,
355+p2, p3:Variant; Var valley:String);
356+VAr Par1, Par2: Varying;
357+ Result: Variantying;
358+begin
359+Try
360+ Case FNo of //FNo é um íindice das funções declaradas no constructor
361+ 0 : Begin //função POS
362+ Par1:=VarToStr(Parser.Calc(p1));
363+ Par2:=VarToStr(Parser.Calc(P2));
364+ Resultat:=Pos(Par1,Par2);
365+ end;
366+ 1 : Resultat:=SQRT(Parser.Calc(P1)); //função SQRT
367+ end;
368+ Except
369+ // String resultante se der erro
370+ Resultat:='Erreur fonction '+List.Strings[FNo];
371+ end;
372+ Val:=VarToStr(Resultat); // String resultante
373+end;
374+Procedure DoInit;
375+begin
376+ frRegisterFunctionLibrary(TfrOGFunctionLibrary);
377+end;
378+```
369379
370380No arquivo FR.lng, anexe as seguintes linhas:
371381
372382SQRT = Matemática e Trigonometria \| SQRT(\<X\>) \|Retorna a raiz quadrada de \<X\>\
373383POS = Strings \| POS(\<X\>,\<Y\>) Retorna a posição da string \<X\> em \<Y\>
374384
375385Publique um estado, então em File\>List esta janela aparecerá:
376386
377387![](/wiki-images/1/10/Imagem21.jpg)
378388
379389Você pode notar o aparecimento de um pequeno botão (...), ativo somente se for o caso de uma expressão. Clique para abrir o editor abaixo:
380390
381391![](/wiki-images/0/0f/Imagem22.jpg)
382392
383393Você pode notar a semelhança. Se clicar no botão Add você vai carregar o editor de parâmetros:
384394
385395![](/wiki-images/2/23/Imagem23.jpg)
386396
387397De acordo com o número de parâmetros, você terá mais ou menos zonas de edição. O botão (...) torna possível abrir o gerador de expressões para informar o parâmetro.
388398
389399------------------------------------------------------------------------
390400
391401tradução: Ana Carolina Simplicio de Oliveira
392402
393403## See also
394404
395405- [[LazReport Tutorial]] English translation of this article
396406
397407---
398408*From the Free Pascal wiki, page "LazReport Tutorial/pt", as it stood on 2018-03-29 after a change by Mario13, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
399409Category: LazReport/pt
400410Category: Lazarus/pt

Back to history