Criar Type Atribuir Property em Runtime
Olá colegas,
No código apresentado abaixo consegui atribuir um valor a property Modelo em tempo de execução, mas nada verdade o que preciso é que seja carregada uma lista de Modelos ao selecionar certo Fabricante mas não estou conseguindo, para criar essa lista preciso criar um enum com os modelos do fabricante, mas como fazer isso em runtime?
No código apresentado abaixo consegui atribuir um valor a property Modelo em tempo de execução, mas nada verdade o que preciso é que seja carregada uma lista de Modelos ao selecionar certo Fabricante mas não estou conseguindo, para criar essa lista preciso criar um enum com os modelos do fabricante, mas como fazer isso em runtime?
unit EasyECFMain;
interface
uses
SysUtils, Classes, Dialogs;
type
TFabricante = (Bematech, Daruma, Elgin);
TEasyECF = class(TComponent)
private
FFabricante: TFabricante;
FModelo: String;
procedure SetFabricante(const Value: TFabricante);
procedure SetModelo(const Value: String);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedure FabricanteSelecionado;
published
{ Published declarations }
property Fabricante: TFabricante read FFabricante write SetFabricante;
property Modelo: String read FModelo write SetModelo;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(´EasyECF´, [TEasyECF]);
end;
{ TEasyECF }
// procedure para teste
procedure TEasyECF.FabricanteSelecionado;
var
Impressora: String;
begin
case FFabricante of
Bematech: Impressora := ´Bematech´;
Daruma: Impressora := ´Daruma´;
Elgin: Impressora := ´Elgin´;
end;
ShowMessage(´Impressora para: ´+Impressora);
end;
procedure TEasyECF.SetFabricante(const Value: TFabricante);
begin
FFabricante := Value;
case FFabricante of
Bematech: SetModelo(´MP2100THFI´);
Daruma: SetModelo(´Teste1´);
Elgin: SetModelo(´Teste2´);
end;
end;
procedure TEasyECF.SetModelo(const Value: String);
begin
FModelo := Value;
end;
end.
Tappedroso
Curtidas 0
Respostas
.lg.
28/07/2009
Já pensou em usar [b:859925ce84]TStringList[/b:859925ce84] no tipo do modelo!?
assim. Vc poderia ir adicionando itens a lista.
eu faria uma array dinamica e com o tipo enum escolhido e os itens adicionado... seria um indice a mais na array.
Estou meio ocupado agora, mas depois faço um exemplo e posto aqui pra vc. (se quiser)
Se ficar dificil de entender, da o tok q explico melhor.[/code]
assim. Vc poderia ir adicionando itens a lista.
eu faria uma array dinamica e com o tipo enum escolhido e os itens adicionado... seria um indice a mais na array.
Estou meio ocupado agora, mas depois faço um exemplo e posto aqui pra vc. (se quiser)
Se ficar dificil de entender, da o tok q explico melhor.[/code]
GOSTEI 0
Tappedroso
28/07/2009
Mas essa property irá aparecer como um combobox no object inspector?
Eu tentei colcar a property como array mas quando dou um build o delphi aponta que a property não pode ser um array.
Mas põe um exemplo por favor, pode ser que eu não tenha entendido bem o conceito.
Agradeço desde já.
Abraços.
Eu tentei colcar a property como array mas quando dou um build o delphi aponta que a property não pode ser um array.
Mas põe um exemplo por favor, pode ser que eu não tenha entendido bem o conceito.
Agradeço desde já.
Abraços.
GOSTEI 0
.lg.
28/07/2009
Pensei que vc queria em run-time e não em modo de edição.
Aí a situação muda (pelo menos ao meu ver). Eu ainda não vi como fazer para uma nova tela aparecer para ir adicionando novos itens. (falei complicado) O exemplo que posso dar é: Quando vc adiciona um [b:42cc0e6f85]ClientDataSet[/b:42cc0e6f85] ele tem a propriedade [i:42cc0e6f85]FieldDefs[/i:42cc0e6f85] que abre uma telinha para vc adicionar os campos. O campo em si é uma classe.
Em modo de design seria dessa forma. aplicaria o que mencionei dessa forma. Desculpe se minha explicação está meio que corrida, pois acesso as vezes a comunidade e hj estou c poko tempo. a noite faço um exemplo e posto pra tu. rs
Aí a situação muda (pelo menos ao meu ver). Eu ainda não vi como fazer para uma nova tela aparecer para ir adicionando novos itens. (falei complicado) O exemplo que posso dar é: Quando vc adiciona um [b:42cc0e6f85]ClientDataSet[/b:42cc0e6f85] ele tem a propriedade [i:42cc0e6f85]FieldDefs[/i:42cc0e6f85] que abre uma telinha para vc adicionar os campos. O campo em si é uma classe.
Em modo de design seria dessa forma. aplicaria o que mencionei dessa forma. Desculpe se minha explicação está meio que corrida, pois acesso as vezes a comunidade e hj estou c poko tempo. a noite faço um exemplo e posto pra tu. rs
GOSTEI 0
Guinther
28/07/2009
Boa-tarde
Tem que criar um editor de propriedades. É meio complexo. O primeiro passo é criar um pacote somente de design. Nele coloque uma unit.
Abaixo eu fiz há algum tempo algo bem semelhante, um Combo no ObjectInspector que mostrava uma lista de idiomas:
Aqui criamos o editor da propriedade:
...
TIdiomasList = class (TStringProperty)
public
procedure GetValues(Proc: TGetStrProc); override;
function GetAttributes : TPropertyAttributes; override;
end;
...
Aqui registramos o editor vinculando-o a uma classe e a uma propriedade:
procedure Register;
begin RegisterPropertyEditor(TypeInfo(string),TWWTranslator,´Idioma´,TIdiomasList);
end;
Implementando o editor:
function TIdiomasList.GetAttributes: TPropertyAttributes;
begin
Result:=inherited GetAttributes + [paValueList];
end;
procedure TIdiomasList.GetValues(Proc: TGetStrProc);
var
cont : byte;
begin
for cont:=1 to LangPairNumIdiomas do
Proc(LangPairLong[cont]);
end;
Sendo que:
LangPairNumIdiomas = 12;
LangPairLong : array [1..LangPairNumIdiomas] of string =
(´Inglês para Alemão´,´Inglês para Espanhol´,´Inglês para Francês´,
´Inglês para Italiano´,´Inglês para Português´,´Alemão para Inglês´,
´Alemão para Francês´,´Espanhol para Inglês´,´Francês para Inglês´,
´Francês para Alemão´,´Italiano para Inglês´,´Português para Inglês´);
Att,
Guinther Pauli
http://guintherpauli.blogspot.com
http://twitter.com/guintherpauli
Tem que criar um editor de propriedades. É meio complexo. O primeiro passo é criar um pacote somente de design. Nele coloque uma unit.
Abaixo eu fiz há algum tempo algo bem semelhante, um Combo no ObjectInspector que mostrava uma lista de idiomas:
Aqui criamos o editor da propriedade:
...
TIdiomasList = class (TStringProperty)
public
procedure GetValues(Proc: TGetStrProc); override;
function GetAttributes : TPropertyAttributes; override;
end;
...
Aqui registramos o editor vinculando-o a uma classe e a uma propriedade:
procedure Register;
begin RegisterPropertyEditor(TypeInfo(string),TWWTranslator,´Idioma´,TIdiomasList);
end;
Implementando o editor:
function TIdiomasList.GetAttributes: TPropertyAttributes;
begin
Result:=inherited GetAttributes + [paValueList];
end;
procedure TIdiomasList.GetValues(Proc: TGetStrProc);
var
cont : byte;
begin
for cont:=1 to LangPairNumIdiomas do
Proc(LangPairLong[cont]);
end;
Sendo que:
LangPairNumIdiomas = 12;
LangPairLong : array [1..LangPairNumIdiomas] of string =
(´Inglês para Alemão´,´Inglês para Espanhol´,´Inglês para Francês´,
´Inglês para Italiano´,´Inglês para Português´,´Alemão para Inglês´,
´Alemão para Francês´,´Espanhol para Inglês´,´Francês para Inglês´,
´Francês para Alemão´,´Italiano para Inglês´,´Português para Inglês´);
Att,
Guinther Pauli
http://guintherpauli.blogspot.com
http://twitter.com/guintherpauli
GOSTEI 0
Tappedroso
28/07/2009
Guinther,
Aparecer como um combobox no object inspector eu já consegui, a property Fabricante aparece como um combo, fiz com enum, e é o ideal pq depois uso o retorno num case of...O que estou precisando é de outro combo, o Modelo, mas esse modelo tem q ter seus ´itens´ alterados conforme a seleção do fabricando, ou seja, eu tenho que criar um enum em runtime certo? Mas não sei se tem como fazer isso.
vlw. Abraços.
Aparecer como um combobox no object inspector eu já consegui, a property Fabricante aparece como um combo, fiz com enum, e é o ideal pq depois uso o retorno num case of...O que estou precisando é de outro combo, o Modelo, mas esse modelo tem q ter seus ´itens´ alterados conforme a seleção do fabricando, ou seja, eu tenho que criar um enum em runtime certo? Mas não sei se tem como fazer isso.
vlw. Abraços.
GOSTEI 0
Carlos Rigo
28/07/2009
Eu sei que faz muito tempo, mas estou com a mesma dificuldade. Alguem poderia dar um exemplo?
GOSTEI 0