Fórum Ajuda com ARRAY #216257

24/02/2004

0

pessoal é o seguinte,
criei um tipo TServico dentro de uma Unit chamada Automacao.

unit Automacao;

interface

type TServico = record
              CdServico   : String;
              QtServico   : String;
              VlServico    : String;
            end;
.
.
.


aí dentro desta mesma unit Automacao, criei uma procedure:

procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos:Tservico);
begin
.
.
.
end;


esta procedure Autoriza é chamada em outros forms:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ...
  Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),xxxxx);
 ...
end;


o meu problema é que onde coloquei xxxxx, deve ser informado o array que criei anteriormente utilizando do tipo TServico.
este array deve conter os dados de uma tabela ...
como fazer ?

bem, o q tentei foi utilizar no lugar de xxxxx a chamda para uma Function que poderia me retornar como Result os registros da tabela, só q não consegui utilizar uma Function q me retorne um array ..a dúvida é essa!

o q fiz:

function TForm1.MontaServicos:Array Of TServico;
begin
...

end;


agradeço sua ajuda

Diogo


Diogoalles

Diogoalles

Responder

Posts

24/02/2004

Fórum Vini

Olá,
você tem duas alternativas:
procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos:Array of TServico); 

ou então:
type
  TArraydeServico = array of TServico; //ou array[1..10] of TServico
procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos: TArraydeServico);

Para pegar o tamanho de um array dinâmico, use a função Length().


Espero ter ajudado.
Vinicius.


Responder

Gostei + 0

24/02/2004

Marco Salles

Vini. Voce Poderia Dar Um Exemplo De Como Se Chamaria a Procedure Autoriza Usando Esta Definição

procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos:Array of TServico); 


Copmo Chama-la :?:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
... 
  Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),?????????); 
... 
end;



Responder

Gostei + 0

24/02/2004

Fórum Vini

Marco,
você pode usar um array mesmo:
var A: Array[1..2] of Integer;
begin
  A[1]:= 1;
  A[2]:= X;  
  Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),A); 
end;

ou usando um construtor de open arrays:
Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),[1, X]); 


Espero ter ajudado.
Vinicius.


Responder

Gostei + 0

24/02/2004

Marco Salles

Mas Esta Dando Tipos Incompatíveis...

procedure TForm1.Button1Click(Sender: TObject);
var
A:Array [1..3] Of Integer;
begin
Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),A);
end;



Responder

Gostei + 0

24/02/2004

Fórum Vini

Marco,
deve ser porque o exemplo que eu dei usa um Array of Integer e a sua declaração esta como Array of TServico.

Espero ter ajudado.
Vinicius.


Responder

Gostei + 0

24/02/2004

Marco Salles

Eu Estou Com Dificuldade De Gerar Esta Chamada..Por Isto Eu Gostaria Que Voce Pode-sse Me Adiantar Como Faze-la..Como Eu Definiri-a O ´A´
E Como Eu Chanaria O método Atualiza Definido Por Voce :?:

procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos:Array of TServico); 



Responder

Gostei + 0

24/02/2004

Fórum Vini

Marco,
acho que você não entendeu, eu coloquei um Array of Integer para facilitar a inicialização do array.
Código usando array of Integer:
Declaração:
procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos:Array of Integer);

Chamada:
var A: Array[1..2] of Integer;
begin
  A[1]:= 1;
  A[2]:= X; 
  Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),A);
end;

Código usando array of TServico:
Declaração:
procedure Autoriza(Codigo:Integer;Nome:String;Data:TDate;Servicos:Array of TServico);

Chamada:
var A: Array[1..2] of TServico;
begin
  //Inicialização do array
  A[1].CdServico:= ´1´;
  A[1].QtServico:= ´200´;
  A[1].VlServico:= ´ABC´; 
  
  A[2].CdServico:= ´1´;
  A[2].QtServico:= ´200´;
  A[2].VlServico:= ´ABC´; 
  
  Autoriza(1,´JOSUE SANTOS´,StrToDate(´01/01/1950´),A);
end;



Espero ter ajudado.
Vinicius.


Responder

Gostei + 0

24/02/2004

Marco Salles

Obrigado Amigo, Espero Que o diogoalles me Desculpe Por Intrometer No Tópico Dele...Mas Como Ele Teve Uma Ligeira Ausencia Eu Peguei Emprestado.. Mais Uma Vez Obrigado Vini.


Responder

Gostei + 0

24/02/2004

Fórum Vini

Precisando, é só falar! :lol: :lol:


Responder

Gostei + 0

24/02/2004

Diogoalles

OK Pessoal

Valeu a força aí ..

ficou muito claro , amanha estarei implementando !!!

Vini, só não entendi como seria questão do Contructor ..poderia detalhar ?

abraço


Responder

Gostei + 0

26/02/2004

Diogoalles

Vini,
gostaria de ver se vc pode me ajudar ..
criei tudo o q precisa ..só q em várias vezes q tento executar me dá erro de ´Access Violation´ .. e nem sempre é no mesmo ponto ...
bem ..ai vai :

declaração do tipo TServico

unit Automacao;

interface

uses Windows, SysUtils, Registry, Controls, Forms, Variants;

type TServico = record
              TpServico    : String[1];
              QtServico    : String[12];
              CdServico    : String[8];
              TpPercentual : String[8];
              DsServico    : String[100];
              VlServico    : String[12];
              TpInsumo     : String[4];
              CdPrestDivi  : String[15];
            end;


.... rotina que utiliza o TServico como variável A ..onde defino deinamicamente o seu tamanho

procedure TFrm915F.BtnAutorizarClick(Sender: TObject);
var
  A : array of TServico;
begin
  try
    TblLanProced.Refresh;
    TblLanIns.Refresh;

    Count_Proc_Ins := 0;

    CountProc := TblLanProced.RecordCount;
    CountIns  := TblLanIns.RecordCount;

    Count_Proc_Ins :=  CountProc + CountIns;

    y := (Count_Proc_Ins -1);

    SetLength(A,y);

    TblLanProced.First;
    for x := 0 to (CountProc - 1) do
    begin
      A[x].TpServico    := ´P´;
      A[x].QtServico    := FloatToStr(TblLanProcedQT_PROCED.Value);
      A[x].CdServico    := IntToStr(TblLanProcedCD_PROCED.Value);
      A[x].TpPercentual := IntToStr(TblLanProcedCD_TP_PERCENT.Value);
      A[x].DsServico    := ´´;
      A[x].VlServico    := ´´;
      A[x].TpInsumo     := ´´;
      A[x].CdPrestDivi  := ´´;
      TblLanProced.Next;
    end;

    TblLanIns.First;
    for x := x to y do
    begin
      A[x].TpServico    := ´I´;
      A[x].QtServico    := FloatToStr(TblLanInsQT_INSUMO.Value);
      A[x].CdServico    := IntToStr(TblLanInsCD_INSUMO.Value);
      A[x].TpPercentual := ´´;
      A[x].DsServico    := ´´;
      A[x].VlServico    := FloatToStr(TblLanInsVL_INSUMO.Value);
      A[x].TpInsumo     := IntToStr(TblLanInsCD_TP_INSUMO.Value);
      A[x].CdPrestDivi  := ´´;
      TblLanIns.Next;
    end;

    if((CountIns > 0)or(CountProc > 0))then
    begin
      Autorizacao_Procedimentos(True,True,Frm915F,
                                TblPropAUTOMACAO_CD_UNIDADE.Value,
                                TblPropAUTOMACAO_CD_PRESTADOR.Value,
                                ´01´,
                                TblPacAUTOMACAO_CD_UNIDADE.Value,
                                TblPacAUTOMACAO_CD_CARTEIRA.Value,
                                ´´,´0000´,´00000000´,´S´,
                                (TblMedAUTOMACAO_CD_UNIDADE.Value+TblMedAUTOMACAO_CD_PRESTADOR.Value),
                                IntToStr(Count_Proc_Ins),
                                A);

      if((DtMdlGcm1.CDAutoriza.Active = True)and
         (DtMdlGcm1.CDAutoriza.RecordCount > 0))then
        Autorizado := True;
    end;
  except
    on E : Exception do
    begin
      Screen.Cursor := crDefault;
      DtMdlGcm1.BsMsg.MessageDlg(´Processo cancelado !´+#13+10+
                                 ´Ocorreram erros durante a Autorização.´,
                                 mtError, [mbOK], 0);
    end;
  end;
end;



e aqui tá a Procedure Autorizacao_PRocedimento que tem o array de TServico.

procedure Autorizacao_Procedimentos(PesqUsu,Erros:Boolean;Frm:TForm;UniPrest,  CdPrest,InOperacao,CdUniBenef,CdCartBenef,CdCid,AaGuiaAtend,NrGuiaAtend,IdCartao,
  IdPrestSoli,QtServico:String;
  Servicos:array of TServico);
  //TpServico,QtServ,CdServico,TpPercentual,DsServico,VlServico,TpInsumo,CdPrestDivi: array of String);
begin
   ...



tem algo de errado nos arrays ou na forma como estou trabalhando ?

agradecido

Diogo


Responder

Gostei + 0

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

Aceitar