Fórum Criar Type Atribuir Property em Runtime #372856
28/07/2009
0
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
Curtir tópico
+ 0Posts
29/07/2009
.lg.
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
29/07/2009
Tappedroso
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
29/07/2009
.lg.
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
29/07/2009
Guinther
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
29/07/2009
Tappedroso
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
10/06/2020
Carlos Rigo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)