Fórum Implementar um método em tempo de execução pela hierarquia ? #279517

29/04/2005

0

Olá pessoal. Estou com problemas para implementar um método a um componente em que crio em tempo de execução. No meu caso estou trabalhando com o relatório do Fortes Report e crio dinamicamente o cara abaixo ([b:4274eb8a08]TRLDBMemo[/b:4274eb8a08]) :

    v_Componente            := TRLDBMemo.Create(ReportNotaFiscal);
    v_Componente.Parent     := v_Parent;
    v_Componente.AutoSize   := True;
    v_Componente.Name       := v_Name;
    v_Componente.Left       := StrToInt(v_Margem);
    v_Componente.Top        := StrToInt(v_Altura);
    v_Componente.Width      := StrToInt(v_Largura);
    v_Componente.DataSource := v_DataSource;
    v_Componente.DataField  := v_DataField;
    v_Componente.Alignment  := v_Alinhamento;
    v_Componente.Behavior   := [beSiteExpander];
    v_Componente.Visible    := True;


Até aí tudo bem mais preciso colocar mais um parâmetros que seria o abaixo :

 RLDBMemo8.BeforePrint := ?????


A declaração de código acima solicita um tipo [b:4274eb8a08]TRLBeforeTextEvent[/b:4274eb8a08]. O que eu sei é que a [b:4274eb8a08]assinatura[/b:4274eb8a08] do método (no caso no evento) é a seguinte:
 RLDBMemoBeforePrint(Sender: TObject; var Text: String; var PrintIt: Boolean); 


:(
O maior problema que terei é porque ele utiliza os parâmetros [b:4274eb8a08]Text [/b:4274eb8a08]e [b:4274eb8a08]PrintIt[/b:4274eb8a08], por dentro do código esses parâmetros são para imprimir o valor do texto a ser impresso e o outro para dizer se esse texto será ou não impresso.

Resumindo a história, como poderei implementar um método em tempo de execução para o componente TRDBMemo do FortesReport para o evento BeforePrint do mesmo que que tenha também como parâmetros os mesmos [b:4274eb8a08](Sender: TObject; var Text: String; var PrintIt: Boolean)[/b:4274eb8a08], sendo assim manipulados internamente dando a fidelidade de funcionamento ?????

Espero que tenham entendido aguardo um retorno. :wink:


Faelcavalcanti

Faelcavalcanti

Responder

Posts

29/04/2005

Faelcavalcanti

Segue abaixo o que consta no help, mas mesmo eu associando a um método qualquer que faiz qualquer coisa não executa nada, mesmo que esteja com a mesma assinatura e implementando os mesmos tipos. Como associar para que o evento sempre seja disparado ????

Antes da impressão de uma caixa de texto. [b:7250b37858]Unit [/b:7250b37858] RLReport TRLBeforeTextEvent = [b:7250b37858]procedure[/b:7250b37858](Sender: TObject; [b:7250b37858]var [/b:7250b37858]Text: [b:7250b37858]string[/b:7250b37858]; [b:7250b37858]var [/b:7250b37858]PrintIt: boolean) [b:7250b37858]of object[/b:7250b37858]; Descrição Implemente um evento TRLBeforeTextEvent para decidir se o controle será impresso, através do parâmetro PrintIt, para alterar o texto a imprimir ou para alterar as suas características, como por exemplo: dimensões, cor, bordas etc. [b:7250b37858]Nota[/b:7250b37858]: Este evento aparecerá como o nome BeforePrint nas caixas de texto.


:cry:
Preciso de toda ajuda e reforço possível . Câmbio e desligo!


Responder

Gostei + 0

29/04/2005

Massuda

Eu não entendi o que você quis dizer com ´hierarquia´...

Talvez eu esteja sendo simplista, mas acho que [url=http://forum.clubedelphi.net/viewtopic.php?t=57985]este tópico[/url] pode ser útil a você.


Responder

Gostei + 0

29/04/2005

Faelcavalcanti

Quando falei hierarquia é porque quero associar o evento [b:cf4e0fa9dc]BeforePrint[/b:cf4e0fa9dc] do meu componente [b:cf4e0fa9dc]TRLDBMemo[/b:cf4e0fa9dc] em que estou criando em tempo de execução. Quando eu coloco:
 v_Component.BeforePrint := ????? 


é esperado o tipo [b:cf4e0fa9dc]TRLBeforeTextEvent[/b:cf4e0fa9dc], mas eu também poderia implementar o [b:cf4e0fa9dc]TRLBeforePrintEvent[/b:cf4e0fa9dc].

Gostaria de associar um método que eu criei como você informou no tópico ao meu componente criado no momento. No seu caso o [b:cf4e0fa9dc]OnClick[/b:cf4e0fa9dc], teria como parâmetro o [b:cf4e0fa9dc]Sender[/b:cf4e0fa9dc] e pronto. No meu caso eu tenho um tipo que está descrito da seguinte forma :
 TRLBeforeTextEvent = procedure(Sender: TObject; var Text: string; var PrintIt: boolean) of object; 


Como poderia implementá-lo da mesma forma ???

Obrigado Massuda, me ajudou um bocado mais ainda vou precisar de mais uma força!!! :roll:


Responder

Gostei + 0

29/04/2005

Massuda

Como poderia implementá-lo da mesma forma ???
A idéia é a mesma... no form que vai conter o componente você declara uma procedure assim:
type
  TSeuForm = ...
  ...
  private
    procedure RLDBMemoBeforePrint(Sender: TObject; var Text: string; var PrintIt: boolean);
....

procedure TSeuForm.RLDBMemoBeforePrint(Sender: TObject; var Text: string; var PrintIt: boolean);
begin
  ...
end;

// quando você cria seu RLDBMemo você faz...
// RLDBMemo.BeforePrint := RLDBMemoBeforePrint;



Responder

Gostei + 0

29/04/2005

Faelcavalcanti

Pronto cara aí você chegou onde eu queria. Fiz diversos métodos e procedimentos associando o meu componente desta forma. Sendo que quando eu boto pra [b:ad4df4cba3]rodar[/b:ad4df4cba3] :cry:, ele não faiz nada somente na hora que eu estou atribuindo é que ele irá executar. Isso aí tudo bem ele teria que executar de todo o jeito.

Mas no meu caso ele campo Componente irá executar diversas vezes no relatório com mais de 10(dez) páginas aí quando é para executar neste momento ele não faiz nada.

Sei que o erro certamente está entre a [b:ad4df4cba3]cadeira [/b:ad4df4cba3]e o [b:ad4df4cba3]teclado[/b:ad4df4cba3] :D , mas ainda não consegui associar a este evento. Quanto a um evento Onclick de um Button tudo bem, mas com esse não funcionou e até agora não sei porque. Why ????


Responder

Gostei + 0

29/04/2005

Faelcavalcanti

Para ficar mais simples e em comparativo com o seu tópico enviado como sugestão temos o seguinte :

TNotifyEvent = procedure (Sender: TObject) of object


no meu caso seria

TRLBeforeTextEvent = procedure(Sender: TObject; var Text: string; var PrintIt: boolean) of object


Quando eu for implementar o primeiro seria como passado por você:
Button.OnClick := SuaProcedureQueTrataOnClick;

no meu caso terei :
 
var 
  v_Text : String;
  v_PrintIt : Boolean;
begin
  RLDBMemo.BeforePrint := MeuMetodoBeforePrint(Nil, v_Text, v_PrintIt);
end;

// meu método abaixo 
function MeuMetodoBeforePrint(Sender: TObject; var Text: string; var PrintIt: boolean) : TRLBeforeTextEvent;
begin
  ShowMessahe(´Até que enfim hein´);
end;


Após isso feito só é executado na hora da atribuição, após isto não é mais executado. O que estou fazendo de errado ????


Responder

Gostei + 0

29/04/2005

Massuda

Um ponto importante sobre tratadores de eventos (ou seja, os métodos que serão executados quando um evento é disparado) é que geralmente você não executa esses tratadores, quem irá executar é o componente quando ele detectar a ocorrência do evento.

Outro ponto importante é que todo tratador de evento é um ponteiro para um método de um objeto, ou seja, é declarado como sendo
TAlgumEvento = procedure (....) of object;
Isso significa que um tratador de evento deve ser obrigatoriamente um método de um objeto que existe quando o evento ocorre. Geralmente, esse objeto é o form onde o componente é posto (no seu caso, seria o report).

Pegando o código que você postou aqui, você teria de fazer algo assim...
  v_Componente := TRLDBMemo.Create(ReportNotaFiscal); 
  v_Componente.Parent := v_Parent; 
  ...
  v_Componente.Visible    := True; 
  v_Componente.BeforePrint := ReportNotaFiscal.RLDBMemoBeforePrint;
...

type
  TReportNotaFiscal = class
  ...
  public
    procedure RLDBMemoBeforePrint(Sender: TObject;
      var Text: string; var PrintIt: boolean);
...

procedure TReportNotaFiscal.RLDBMemoBeforePrint(Sender: TObject;
  var Text: string; var PrintIt: boolean);
begin
  ...
end;



Responder

Gostei + 0

30/04/2005

Faelcavalcanti

Poxa caras. Vocês não vão acreditar, fiquei entretido na maior moleza de todos os tempos. Olhem só como resolvi meu problema:

Como segue a descrição sobre a implementação abaixo :
TRLBeforeTextEvent = procedure(Sender: TObject; var Text: string; var PrintIt: boolean) of object;


Primeiro criei um procedimento que seja suportável a um tipo Object:
 
type
  TForm1 = class(TForm)
  ...
  ...
  RLReport1: TRLReport;  
  ...
  ...
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Teste(Sender      : TObject;
                    var Text    : String;
                    var PrintIt : Boolean);end;
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Teste(Sender      : TObject;
                       var Text    : String;
                       var PrintIt : Boolean);
begin
  ShowMessage(´You Win!!!´);
end;


Ao meu componente eu declaro da seguinte forma :
var v_NewMemo : TRLDBMemo;
begin
  v_NewMemo             := TRLDBMemo.Create(Nil);
  v_NewMemo.AutoSize    := True;
  v_NewMemo.Parent      := RLBand1;
  v_NewMemo.Visible     := True;
  v_NewMemo.Name        := ´Rlm_NewMemo´;
  v_NewMemo.BeforePrint := Teste;
end;


Estava viajando em outro planeta quando pensei que tivesse que implementar uma função com o mesmo tipo de retorno implementando, ou seja, através do [b:c5803b3779]override[/b:c5803b3779], o seu comportamento. Já pensaram!!! Nothing to see!!!!

Bem obrigado pela força Massuda, se não fosse você não teria chegado a esta conclusão ainda mais, olha só são 03:20 mas consegui!!!!!!! Aaaaaaahhhhhhhhhhhh! :twisted: :twisted:

É como eu sempre digo na maioria das vezes a culpa ficam em torno de 5¬ no delphi, 5¬ na máquina e 90¬ nos programadores, ou seja, o problema está entre o teclado e a cadeira. Bah que merda!!!! :x
:wink: :wink: :wink:
Valeu!!!!!


Responder

Gostei + 0

20/03/2007

Cabelo

Pessoal..

Estou com o mesmo problema do amigo.. mas ele conseguiu resolver de forma simples, e foi a primeira coisa que tentei fazer.. mas acho que estou errando em algo simples..

Segue o código de criação..

v_band_detail := TRLBand.Create(l_component);
with v_band_detail do
begin
   BeforePrint := P_BeforePrint;
   Parent := v_rl_report;
   BandType := btDetail;
end;


segue minha procedure

procedure P_BeforePrint(Sender: TObject;  
var PrintIt: boolean);
begin
   SowMessage(´Imprimindo´);
end;


Espero que quando o BeforePrint do componente seja disparado, eu possa utilizar a procedure, para tratar os dados que irão aparacer em um TRLImage, dependendo do que o select retornar..

Quando faço exatamente como está acima, gera um erro :

[Error] FU00000.pas(14981): Incompatible types: ´method pointer and regular procedure´


Não sei o que estou fazendo, mas tenho a impressão de ser uma coisa muito simples..

Alguém pode me ajudar????

Obrigado a todos antecipadamente!!!!

Um abraço.


Responder

Gostei + 0

22/03/2007

Cabelo

sobe..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar