Ir para conteúdo
Fórum Script Brasil
  • 0

Type Record


kleberns

Pergunta

Pessoal !

type

TDadosTrn = record

Funcao : string;

XMLDataHoraGeracao,

XMLCD,

XMLMSG,

XMLNumero,

XMLCDLoja,

XMLDataHoraTransacao: string;

end;

var

ttDT: TDadosTrn;

sCampo, sConteudo: string;

Existe uma maneira de fazer a seguinte instrucao ?

sCampo := 'XML' + CampoXML(sConteudo, ....);

ttDT.scampo := sConteudo;

Isto é somente um exemplo.

OBS: vocês concordam q eu teria q fazer um case ???? não tem uma forma igual a q eu comentei acima ?

att.

Nogueira

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Bele !

type

TDadosTrn = record

Funcao : string;

XMLDataHoraGeracao,

XMLCD,

XMLMSG,

XMLNumero,

XMLCDLoja,

XMLDataHoraTransacao: string;

end

tu tenho esta estrutura de dados com seus campos, certo ?!

Gostaria de acessar os campos desta estrutura não como ttDT.XMLDataHoraGeracao e sim ttDT.[uma variavel q contem o nome do campo], entendeu ?

Pois o nome do campo e seu conteudo, vira em um arquivo TXT, então quando tiver uma inclusao de um novo campo, eu so vou no type TDadosTRN e jogo o campo la, por exemplo, XMLNOVOCAMPO e a rotina pra frente se vira para jogar o q veio no TXT. Exemplo: (arquivo.txt) = XMLNOVOCAMPO=CONTEUDO DESTE CAMPO -> (rotina padronizada de leitura do arquivo) ttDT.XMLNovoCampo=CONTEUDO DESTE CAMPO.

att.

Nogueira

Link para o comentário
Compartilhar em outros sites

  • 0

Até onde sei, Delphi não possui execução dinâmica de código, e também não tem instrospecção (ou reflexão) sobre Records. Qualquer um dos dois permitiria fazer o que você quer. De qualquer forma, existe uma certa forma (limitada) de instrospecção sobre atributos de classes (uma função chamada FieldAddress). Apesar de compreender para que ela serve, não sei exatamente como utilizá-la (talvez você tenha sucesso em uma busca no Google). É claro que isso implicaria em você utilizar uma classe ao invés de um record.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Como assim usar classe ???

você pode me dar um exemplo e uma breve explicacao da sua ideia ?

Sim, uma classe. Cole isso aqui em uma unit:

unit Unit2;

interface

type TDadosTrn = class
  public
    Funcao : string;
    XMLDataHoraGeracao,
    XMLCD,
    XMLMSG,
    XMLNumero,
    XMLCDLoja,
    XMLDataHoraTransacao: string;
  end;

implementation

end.
Daí, fazendo referência a essa unit (pela cláusula Uses), você poderá criar um objeto assim (e preencher seus atributos também):
var objeto : TDadosTrn;

begin
  objeto := TDadosTrn.Create;
  objeto.Funcao := 'teste';
  objeto.XMLDataHoraGeracao := '18/06/2005 00:58:00';
end;
Porém, a parte de que comentei seria isso aqui:
var objeto : TDadosTrn;
    pont : Pointer;

begin
  objeto := TDadosTrn.Create;
  objeto.Funcao := 'teste';
  objeto.XMLDataHoraGeracao := '18/06/2005 00:58:00';
  pont := objeto.FieldAddress('Funcao');
end;

Note que em "pont" está um ponteiro para o membro "Funcao" do objeto. Entretanto, como eu disse anteriormente, não sei como manipular esse ponteiro para poder ler ou escrever no membro (mas deve haver um jeito...).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, se eu entendi bem a solução seria esta:

type 
  TFuncao = function: string of object;
 TDadosTrn = class
 public
   Funcao : TFuncao;
   XMLDataHoraGeracao,
   XMLCD,
   XMLMSG,
   XMLNumero,
   XMLCDLoja,
   XMLDataHoraTransacao: string;
 end;
var objeto : TDadosTrn;

function Tform1.Teste: String;
begin
    Result:= 'Resultado';
end;

begin
 objeto := TDadosTrn.Create;
 objeto.Funcao := teste;
 objeto.XMLDataHoraGeracao := '18/06/2005 00:58:00';
  //Para obter o retorno do ponteiro funcao
   if Assigned(objeto.Funcao) then
      ShowMessage(objeto.funcao);
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade, "Funcao" ali não é uma "função" no sentido estrito da palavra (ou seja, não é algo para ser executado). O que ele queria fazer é transformar algo como...

objeto.Campo := 'um teste'
... em:
defina(objeto, 'Campo', 'um teste');
Ou seja, passar o atributo como uma string. FieldAddress retorna um ponteiro para um campo (atributo) do objeto, porém não sei para qual tipo (classe) eu deveria colocá-lo. Por exemplo:
var pt : ^TForm;
    ps : ^String;
    pi : ^Integer;

    i : integer;
    s : string;

begin
  pt := @self;
  pt^.Caption := 'teste';

  i := 2;
  s := 'um teste';

  pi := @i;
  ps := @s;

  showmessage(inttostr(pi^));
  showmessage(ps^);
end;

Todos aí são válidos porque eu coloquei o endereço de um inteiro em um ponteiro de um inteiro, o endereço de uma string em um ponteiro de string, e um endereço de um objeto TForm em um ponteiro de TForm. Mas, aí é que entra o problema, eu vou colocar o retorno do FieldAddress em um "ponteiro de quê"? Se alguém tiver alguma luz a respeito, por favor, isso seria muito bem vindo. smile.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...