kleberns Postado Junho 13, 2005 Denunciar Share Postado Junho 13, 2005 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kikonanet Postado Junho 14, 2005 Denunciar Share Postado Junho 14, 2005 Olá,sCampo := 'XML' + CampoXML(sConteudo, ....);ttDT.scampo := sConteudo;Ae não entendi direito o que você quer fazer. Explica melhor ae...Abs.Kiko Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 14, 2005 Autor Denunciar Share Postado Junho 14, 2005 Bele !typeTDadosTrn = recordFuncao : string;XMLDataHoraGeracao,XMLCD,XMLMSG,XMLNumero,XMLCDLoja,XMLDataHoraTransacao: string;endtu 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 15, 2005 Denunciar Share Postado Junho 15, 2005 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 15, 2005 Autor Denunciar Share Postado Junho 15, 2005 Legal !Como assim usar classe ???você pode me dar um exemplo e uma breve explicacao da sua ideia ?att.Nogueira Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 17, 2005 Autor Denunciar Share Postado Junho 17, 2005 Como assim usar classe ???você pode me dar um exemplo e uma breve explicacao da sua ideia ?att.Nogueira Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 18, 2005 Denunciar Share Postado Junho 18, 2005 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Guest Postado Junho 18, 2005 Denunciar Share Postado Junho 18, 2005 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 18, 2005 Denunciar Share Postado Junho 18, 2005 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. Abraços,Graymalkin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kleberns Postado Junho 20, 2005 Autor Denunciar Share Postado Junho 20, 2005 Legal !Estou gostando das "solucoes" sobre este tópico.Infelizmente eu sou leigo neste assunto de ponteiros e manipulacao de objeto, mas se eu tiver algo eu vou ajudar com certeza.Por enquanto obrigado pelas respostas.att.Nogueira Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
kleberns
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
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.