EDITOR DE COMPONENTES E COMPONENTES VISUAIS.

Delphi

10/12/2008

BOA TARDE GALERA ESTOU COM UM PROBLEMA, JA PROCUREI EM TODA PARTE MAS NAO ENCONTREI, SE ALGUEM TIVER UM EXEMPLO DE COMO FAÇO UM EDITOR DE COMPONETES, SABE AQUELES DIALOGS? QUE VOCE DA UM DUPLO CLIQUE NO COMPONENTE EM TEMPO DE DESIGN E ABRE O EDITOR... E TAMBEM TO TENTNDO FAZER UM COMPONENTE MISTO, UM EDIT COM UM BUTTON NA FRENTE, PRA FAZER TIPO UM VALIDADOR ex: UM CAPO EDIT ONDE A PESSOA DIGITA O CPF, E O BUTTON NA FRENTE QUE VERIFICA SE JA EXISTE, FAÇO ESSE TIPO DE COISA EM 10 LUGARES DIFERENTES E TODA HORA TENHO QUE COLOCAR O EDIT, DEPOIS O BUTTON E DEPOIS COLOCAR UMA FUNCAO DE VALUDACAO DO BUTTON PARA VALIDAQR O VALOR DO EDIT...

ESPERO QUE ENTENDAM O QUE PRECISO, VLW GALERA


Rpdesign

Rpdesign

Curtidas 0

Respostas

Rpdesign

Rpdesign

10/12/2008

UP


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

achei um topico interessante mas nao consegui fazer se alguem conseguir e puder explicar melhor....

http://universodelphi.blogspot.com/2008/01/editor-de-componente.html


GOSTEI 0
Facc

Facc

10/12/2008

Amigo... nunca escreva o titulo do tópico nem a mensagem em caixa alta, dá impressão de vc estar gritando.


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

desculpe os gritos nao era a intenção :)

alguem ai tem alguma ideia de porque isso nao funciona???

to pesquisando mas noa acho nada sobre o assunto


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

up


GOSTEI 0
Cruyahoo

Cruyahoo

10/12/2008

Procure Luiz Roche, editor de propriedades, que la tem exatamente o que
precisa.

Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos
de uma table, na construcao de um componente.
Se souber me avise aqui no site please.

boa sorte.


GOSTEI 0
Fabriciocolombo

Fabriciocolombo

10/12/2008

montei um exemplo criando um editor de propriedade e de componente. Qualquer dúvida estou a disposição.

Segue link...

http://www.4shared.com/account/file/76082770/e898bd5e/Editor_de_Component.html



GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

Procure Luiz Roche, editor de propriedades, que la tem exatamente o que precisa. Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos de uma table, na construcao de um componente. Se souber me avise aqui no site please. boa sorte.


editor de propriedades e de componente sao diferentes, mas valeu a dica, quem sabe ele nao fala sobre os dois assuntos, vou pesquisar e aviso o pessoal se funcionaou, vou testar tambem o exemplo do nosso amigo abaixo,

tente esplica o que voce quis dizer com ´ Aproveitando o assunto , eu tambem estou com um probleminha que nao consigo fazer uma edicao de propriedade para aparecer os campos
de uma table, na construcao de um componente.
Se souber me avise aqui no site please.
´

quem sabe podemos te ajudar


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

montei um exemplo criando um editor de propriedade e de componente. Qualquer dúvida estou a disposição. Segue link...
http://www.4shared.com/account/file/76082770/e898bd5e/Editor_de_Component.html


obrigado FabricioColombo consegui fazer o que eu precisava apartir do seu exemplo, vou dar uma aprofundada melhor depois, mas desde ja muito obrigado, apesar de ter conseguido noa entendi direito o que aconteceu, porque existe uma referencia circular ignorada pelo compilador que geralmente exibe algum erro, e mesmo assim funcionou, as chamadas tambem estao estranhas, vou procurar sobre Luiz Roche quem sabe consigo entender melhor o que aconteceu...

não querendo abusar, eu na verdade usei somente os itens relacionados ao editor de componentes, a parte de edicao de propriedades nao usei, mesmo porque nao sei como funciona direito, deixei por conta do object inspector se virar com os campos, mas tenho muito interesse em aprender sobre isso, se alguem tiver alguma coisa...

o processo para criar editores individuais para cada propriedade é semelhante a esse que o FabricioColombo passou?

ex: noa quero que a pessoa de duplo clique para editar o componente, quero por exemplo que cada propriedade tenah seu proprio editor, ex: um componente de impressao, com as propriedades Porta, Pagina, Campos

onde a propriedade porta abriria um dialog com a lista das portas instaladas no windows para selecionar inpedindo assim que a pessoa digite um valor invalido, Pagina abrindo um dialog onde a pessoa arraste os campos e monte o relatorios, e campos com um dialog onde vc seleciona os campos da tabela que seram listados....

entendeu? nao quero fazer isso exatamente mas queria criar esses editores em todas as propriedades...

vle galera


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

Desculpe parecer chato, sei que ja estou abusando, mas pulamos um topico, sobre os compoentes visuais, quando vou criar um novo componente preciso herdar de alguma coisa, e nao sei como fazer no caso de um componente ser a juncao de dois, como por exemplo um botao e um edit juntos


GOSTEI 0
Fabriciocolombo

Fabriciocolombo

10/12/2008

cruyahoo

se vc estiver usando ´DataField´ como nome da propriedade, o delphi já deveria mostrar os campos no object inspector... se vc estiver usando outro nome de propriedade, como ´FieldName´, por exemplo, vc deve fazer o registro do Editor.


  RegisterPropertyEditor(TypeInfo(string), TClasseDoComponent, ´FieldName´, TDataFieldProperty);


P.S. precisa adicionar a uses DBReg;


GOSTEI 0
Fabriciocolombo

Fabriciocolombo

10/12/2008

TComponent - O ponto de partida para componentes não visuais.
TWinControl - O ponto de partida se é necessário que o componente tenha ´handles´ (foco).
TGraphicControl - Um ponto de partida bom para componentes visuais que não tenham ´handles´, ou seja, não recebem foco. Esta classe tem os metodos Paint e Canvas.
TCustomControl - O ponto de partida mais comum. Esta classe tem ´handle´ de janela, eventos e propriedades comuns e, principalmente, os metodos Canvas e Paint.

Para unir mais de um componente, podem utilizar um panel para criar um container, e criar os componentes em RunTime dentro do panel, ou apenas ´ligá-los´ através de properties como o TLabeledEdit que vem com o delphi. Olhe a implementação do compoente TCustomLabeledEdit na vcl do delphi.


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

primeiramente obrigado FabricioColombo, vou estudar isso com mais cuidado depois, estou com um grande problema pessoal, ta quase tudo certo mas ta dando erro o codigo ta ai em baixo, alguem sabe onde estou errando??


unit SuperComboBox;

interface

uses
  SysUtils, Classes, DesignEditors, DesignIntf,
  Windows, Messages, Controls, StdCtrls, Grids, ValEdit, Consts, Dialogs;
type
  TSuperComboBox = class(TComboBox)
  private
    FDBField:String;
    FNulo : Boolean;
    FMsgNulo : String;
    FTESTE : TItemProps;
    FRegiao:integer;

      { Private declarations }
  protected
    { Protected declarations }
  public
   constructor Create(AOwner: TComponent); override;
    { Public declarations }
  published
    { Published declarations }
    property DBField : String read FDBField write FDBField;
    property DBRegiao : Integer read FRegiao write FRegiao;
    property Nulo : Boolean read FNulo write Fnulo;
    property MsgNulo : String read FMsgNulo write FMsgNulo;
  end;


  TEditorSuperComboForm = class(TComponentEditor)
  private
  public
    function GetVerb(Index: Integer): String; override;
    function GetVerbCount: Integer; override;
    procedure Edit; override;
    procedure ExecuteVerb(Index: Integer); override;
  end;

procedure Register;


implementation

{ TEditorSuperComboForm }

uses uEditorSuperComboDialog;

constructor TSuperComboBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FNulo:=true;
end;

procedure TEditorSuperComboForm.Edit;
begin
  inherited;
end;

procedure TEditorSuperComboForm.ExecuteVerb(Index: Integer);
var
  SuperComboBox : TSuperComboBox;
begin
 case Index of
   0: Execute(Component as TSuperComboBox);
 end;
end;

function TEditorSuperComboForm.GetVerb(Index: Integer): String;
begin
  case Index of
    0: Result := ´Editar´;
  end;
end;

function TEditorSuperComboForm.GetVerbCount: Integer;
begin
  Result := 1;
end;



procedure Register;
begin
  RegisterComponents(´SuperComponentes´, [TSuperComboBox]);

  //Esse é o que aparece com o botão direito do mouse ou duplo clique no componente
  RegisterComponentEditor(TSuperComboBox, TEditorSuperComboForm);

end;


end.




unit uEditorSuperComboDialog;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids, ValEdit, SuperComboBox, AUTOMASOFT;

type
  TEditorSuperComboDialog = class(TForm)
    ValueListEditor1: TValueListEditor;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;    
  private
    { Private declarations }
  public
    itens : TStrings;
    { Public declarations }
  end;

  procedure Execute(Editor : TSuperComboBox);

var
  EditorSuperComboDialog: TEditorSuperComboDialog;

implementation

{$R *.dfm}

procedure Execute(Editor : TSuperComboBox);
var
  fEditor: TEditorSuperComboDialog;
  i, l : integer;
  flag : boolean;
begin
  try
    fEditor := TEditorSuperComboDialog.Create(Editor);
    fEditor.itens:=Editor.Items;

    /// verifica se tem itens
    if fEditor.Itens.Count>0 then
    begin
      //pula os itens no formato errado
      for i:=0 to fEditor.Itens.Count-1 do
      begin
        flag:=false;
        for l:=0 to length(trim(fEditor.Itens[i])) do
        begin
//          showmessage(copy(trim(fEditor.Itens[i]),l,1));
          if copy(trim(fEditor.Itens[i]),l,1)=´>´ then
          begin
            flag:=true;
            break;
          end;
        end;
        if flag then
          if (trim(EXPLODE(trim(fEditor.Itens[i]),´>´)[0])<>´´) and (trim(EXPLODE(trim(fEditor.Itens[i]),´>´)[1])<>´´) then
          fEditor.ValueListEditor1.InsertRow(EXPLODE(trim(fEditor.Itens[i]),´>´)[0],EXPLODE(trim(fEditor.Itens[i]),´>´)[1],TRUE);
      end;
    end;
    //// grava mudancas
    if fEditor.ShowModal = mryes then
    begin
      /// armazena resultado
      Editor.Items.Clear;
      for i:=1 to fEditor.ValueListEditor1.RowCount-1 do
      begin
        Editor.AddItem(fEditor.ValueListEditor1.Keys[i]+´ > ´+fEditor.ValueListEditor1.Values[fEditor.ValueListEditor1.Keys[i]],Editor);
      end;
    end;

  finally
    fEditor.Free;
  end;
end;

end.




GOSTEI 0
Fabriciocolombo

Fabriciocolombo

10/12/2008

qual é o erro? é na compilação ou na execução?


GOSTEI 0
Cruyahoo

Cruyahoo

10/12/2008

Obrigado pela dica vou desta-lo desta forma também mas vai aqui
detalhe do que estou tentando fazer.

Bem , fiz alguns testes e consegui da senguinte maneira:

Properties Campo : Tfield read fCampo write setCampo ;

onde a setCampo segue como procedure:

procedure TAlteraSenha.SetCampoSenha(VCampo:Tfield);
begin
if Vcampo <> FcampoSenha then FcampoSenha := Vcampo;
end;

Sendo assim meu componente aparecerá no object inspector o combobox de campos da tabela no seguinte formato:

assim:

TBCLIENTESnome
TBCLIENTESendereco

ou quando se usa Data Module:

DataModule1.TBCLIENTESnome
Datamodule1.TBCLIENTESendereco

Já está funcionando, mas gostaria que apareceresse somente
o nome de campo ex. nome
enrereco
cep

hardruzzi




«


GOSTEI 0
Cruyahoo

Cruyahoo

10/12/2008

A todos, a quem possa ser útil

Considerando o tópico de muita avalia, e tentando dar continuidade ao
assunto sem querer desviar objetivo, aqui vai o código do componente
que se utiliza de um form que fará parte da VCL. Estes 2 componentes:
SENHA e ALTERASENHA,
geram a tela de uma entrada de senha, checa na base e retorna true,
deixando a condição com o criador do sistema esclher ( se a senha
alternativa ou a do usuario for ok entao fecha ou abre alguma coisa etc.).
O componente ALTERASENHA solicita a senha atual e habilita combo
p/ solicitacao de senha obrigatoria ou nao, alem de permitir a alteracao
da senha. O campo CampoReq é o que se refere a obrigatoriedade de impostar ou nao.
Estou tentando aprimorar para aprender mais.
Segue o codigo que eh composta de unidades do codigo componente
e a unit dfm que eh a forma do compnente, que já opera normalmente.

{Todas as referencias de variaveis partem e referenciam nesta unidade. Ate as atribuicoes
de valores para serem passados como rerefencia para o formSENHA. Ver chamada
principal SenhaOk do tipo Execute, lá estao as atribuicoes.}

unit SENHA;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DB,DBTables,Dbctrls;

type
Tsenha = class(Tcomponent)
private

// FDS: TDataSource;//Reservado
FSenhaAlt: String;
FcampoSenha : Tfield;
FCor: Tcolor;
FTitulo: String;
// procedure SetDS(Value: TDataSource);
procedure SetCampoSenha(Value:Tfield);
protected
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
function SenhaOk:boolean;//Chamadora inicial principal.Equivalente a Execute
published
// property DatSource : TDataSource read FDS write SetDS;//Reservado
property SenhaAlternat : String read FSenhaAlt write FSenhaAlt;
property Titulo : String read FTITULO write FTITULO;
property Cor : Tcolor read FCor write FCor;
property CampoSenha : Tfield read FcampoSenha write SetCampoSenha;
end;

procedure Register;

implementation

uses SENHAform;

constructor Tsenha.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
end;

destructor Tsenha.Destroy;
begin
inherited Destroy;
end;
{Reservado e testado ok}
{procedure Tsenha.SetDS(value: TDataSource);
begin
if value <> fDS then fDS := value;
end;
}
procedure Tsenha.SetCampoSenha(Value:Tfield);
begin
if value <> FcampoSenha then FcampoSenha := value;
end;


{Metodo chamador principal: chama o form de senha verifica chkSENHA criada como publica e
atribuida no form, se a senha estiver Ok, setando paralelamente a funcao aqui formSENHA.chk,
que por sua vez resulta o valor booleano para o form da aplicacao}

function Tsenha.SenhaOk:boolean; //Equivale ao metodo Execute
begin
formSENHA:=TformSENHA.Create(Application);
try
// formSENHA.Inicializar;
formSENHA.SENHALTERN:=FSenhaAlt;
formSENHA.valorSENHA:=FcampoSenha.value;
formSENHA.Caption:=FTitulo;
formSENHA.Color:=FCor;
formSENHA.ShowModal;
if formSENHA.chkSENHA then
begin
result:=true
end
else
result:=false;
finally
formSENHA.Free;
end;
end;

procedure Register;
begin
// RegisterComponents(´MyCmpDesenv´, [Tsenha]);
RegisterComponents(´MyCompProduc´, [Tsenha]);
end;

end.

/////////////Unidade form do componente:

unit SENHAform;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, DBCtrls, ExtCtrls;

type
TformSENHA = class(TForm)
Label1: TLabel;
Edit1: TEdit;
btOK: TButton;
btCANCELA: TButton;

// procedure Inicializar; Nao usou inicializar
function CRIP6(mCad : string):string;
{Dos componentes deste form}
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }

public
{ Public declarations }
SENHALTERN : String;
valorSENHA : String;
chkSENHA : Boolean;//Sera lida na funcao SenhaOk do componente.

end;

var
formSENHA: TformSENHA;

implementation

{$R *.DFM}

{procedure TfSENHA.Inicializar; //Nao usou inicializar.
begin
dbGrid.ReadOnly:=FReadOnly;
pBusca.Visible:=FBuscar;
if FFiltrar then
dbGrid.PopupMenu:=PopupMenu1
else
dbGrid.PopupMenu:=nil;
end;}

PROCEDURE TformSENHA.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
BEGIN
btOk.Click;
END;
end;


procedure TformSENHA.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
edit1.text:=´´;
end;


{OBS btOK: Abaixo o evento cnclick foi substituido pelo efeito Modalresult da
propriedade no botao pelo método onClose Query do Form.}
procedure TformSENHA.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (ModalResult=mrOK) then
// begin
if (Edit1.Text = ´´) then
begin
ShowMessage(´Entre com a senha´);
CanClose:=False;
end
else if((edit1.Text <> ´´) AND (CRIP6(edit1.text)=valorSENHA)) OR (edit1.text=SENHALTERN) THEN
{Fecha o form de senha retornando chkSENHA p/ SENHA.pas no método SENHAok, que por
sua vez passa true p/ a chamada boleana do componente no form da APL.}
begin
chkSENHA:=true;//Criada como publica neste form.
CanClose:=True;
end
else
begin
MessageDLG(´Senha não confere.´,mtWarning,[mbOk],0);
chkSENHA:=False;
CanClose:=False;
end;
{Se botao cancel for precionado, CloseQuery do form vai ler propriedade
ModalResult setado no botao. OnCloseQuery do form esta perguntando pelo fechamento}
IF ModalResult=mrCANCEL THEN
begin
chkSENHA:=false;
CanClose:=true;
end;

end;

FUNCTION TformSENHA.CRIP6(mCad : string):string;
var
v1,v2,v3,v4,v5,v6 : INTEGER;
t1,t2,t3,t4,t5,t6 : INTEGER;
BEGIN
v1:=ord(mCad[1]); v2:=ord(mCad[2]);
v3:=ord(mCad[3]); v4:=ord(mCad[4]);
v5:=ord(mCad[5]); v6:=ord(mCad[6]);

t1:=((v1*1 + v2*2 + v4*3 + v5*4 + v3*6 + v6)mod 223) + 32;
t2:=((v1*2 + v2*5 + v4*1 + v5*3 + v3*5 + v6)mod 223) + 32;
t3:=((v1*6 + v2*3 + v4*7 + v5*1 + v3*2 + v6)mod 223) + 32;
t4:=((v1*2 + v2*5 + v4*1 + v5*3 + v3*7 + v6)mod 223) + 32;
t5:=((v1*4 + v2*4 + v4*3 + v5*5 + v3*1 + v6)mod 223) + 32;
t6:=((v1*3 + v2*1 + v4*7 + v5*2 + v3*6 + v6)mod 223) + 32;

result:=chr(t5) + chr(t1) + chr(t6) + chr(t2) + chr(t4) + chr(t3);
END;

end.

O componente reune um form e a unidade principal, observando a dependencia na clausula Uses, fazendo com que este se possa agrupar mais componente em outro tipo de desenvolvimento, por ex. botao +
Paineis etc.
foi a técnica bem simples que consegui.
Se alguem quizer testar esteje a vontade e retorne a parece neste topico.

obrigado


GOSTEI 0
Bruno6652

Bruno6652

10/12/2008

Eu estou fazendo um editor de propriedades para os meus componentes, entretanto está dando alguns erros em algumas Units do Delphi, tais como:

DesignEditors
DesignIntf

Declarei elas, mas o Delphi acusa um erro dizendo que não existe essa Unit, meio estranho isso.

Alguem tem uma idéia?

OBS: Eu uso Delphi 2007.

Obrigado


GOSTEI 0
Bruno6652

Bruno6652

10/12/2008

Pessoal, desculpem esse UP.

Mas preciso tirar essa duvida, porque to desenvolvendo os editores de propriedades conforme os turoriais e livros e nao funciona, dando erros nas units citadas.

Sera que alguem pode me ajudar nessa?

Muito obrigado

OBS: Lembrando que uso Delphi 2007


GOSTEI 0
Bruno6652

Bruno6652

10/12/2008

Ninguem sabe mesmo como me ajudar nessa?

2 UPs, vou acabar sendo expulso xD


GOSTEI 0
Fabriciocolombo

Fabriciocolombo

10/12/2008

vc precisa incluir na library do delphy o diretório $(DELPHI)\Source\ToolsAPI.

Se estiver usando apenas em uma Package, pode apenas adicionar designide.dcp($(DELPHI)\Lib) como Requires


GOSTEI 0
Rpdesign

Rpdesign

10/12/2008

Bruno6652

oque o Fabricio falou funciona perfeitamente no delphi 7, porem no delphi 2007 essas suas units nao vem no diretorio do toolsapi, entao, um metodo que utilizei foi, pegar na pasta do delphi 7 e carregar junto com meu projeto, se por acaso faltar a unit proxies.pas, que tambem noa vem com o delphi 2007 é so criar uma unit em branco no delphi e salvar junto com seu projeto com o nome de proxies.pas

ainda nao sei se meu delphi 2007 veio com problemas ou se realmente nao estao mais distribuindo essas units :)


GOSTEI 0
Fabriciocolombo

Fabriciocolombo

10/12/2008

Utilizo apenas o delphi 7, então não sei dizer com relação ao 2007, mais no meu delphi 7 tbm não vem a unit Proxies, e eu faço o seguinte:

Dentro da Unit C:\Arquivos de programas\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas, eu altero as seguintes Linhas:

Na Linha 530
uses DesignConst, Consts, RTLConsts, Contnrs,Proxies;

Fica assim :
uses DesignConst, Consts, RTLConsts, Contnrs;//Proxies;


Na Linha 914
  if (FAncestor = nil) and (Component <> Designer.Root)  and    
     IsProxyClass(Component.ClassType) then

Fica assim :
  if (FAncestor = nil) and (Component <> Designer.Root)  then
   //and  IsProxyClass(Component.ClassType) then


Na Linha 2743 e 2744
  while IsProxyClass(ComponentClass) do
  ComponentClass := TComponentClass(ComponentClass.ClassParent);

Fica assim:
  //    while IsProxyClass(ComponentClass) do
  //      ComponentClass := TComponentClass(ComponentClass.ClassParent);


Para o Delphi 7 funciona bem


GOSTEI 0
Bruno6652

Bruno6652

10/12/2008

Desculpem-me pela demora na resposta.

Eu consegui fazer funcionar.
Adicionei ao Library o diretório ToolsAPI e chamei as classes no Uses e deu certo.

Obrigado a todos que me ajudaram.


GOSTEI 0
Cruyahoo

Cruyahoo

10/12/2008

FabricioColombo,

Agradeço a dica, e informo que já conclui o componente,
e aquele campo onde pede o nome do campo (Tfield), relamente
não precisava de maiores tratos visto que declarando o tipo Tfield
para a propriedade, o object Insp. ja aparece com as opcoes.
Só ficou uma coisa estranha. É que as opcoes aparecem sempre como
decendentes do dataset ex:
opcao 1 TBclientesNOME
opcao 2 TBclientesCHAVE

e assim por diante. Ateh funciona , mas fica meio fora de padrao ao contrario de se apresentar na forma so dos campos ex:
opcao 1 NOME
opcao 2 CHAVE ... ETC..

eu teria que selecionar um dataset e a partir dele construir uma procedure ou funcao que me retornasse so o nome do campo.


GOSTEI 0
POSTAR