GARANTIR DESCONTO

Fórum Criar Type Atribuir Property em Runtime #372856

28/07/2009

0

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?

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

Tappedroso

Responder

Posts

29/07/2009

.lg.

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]


Responder

Gostei + 0

29/07/2009

Tappedroso

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.


Responder

Gostei + 0

29/07/2009

.lg.

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


Responder

Gostei + 0

29/07/2009

Guinther

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


Responder

Gostei + 0

29/07/2009

Tappedroso

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.


Responder

Gostei + 0

10/06/2020

Carlos Rigo

Eu sei que faz muito tempo, mas estou com a mesma dificuldade. Alguem poderia dar um exemplo?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar