Fórum quot;Access violationquot; em execução de método em compon #298565
06/10/2005
0
Pessoal,
Estou criando um componente simples, derivado do Tcombobox.
A intenção é criar uma funcionalidade que armazena em outra TString o código do ítem.
Só que dá erro quando executo o método ´adicionar´. Creio que é por que o TStrings ´Fchave1´ não é criado.
´Copiei´ um método ´SetItems´ do Delphi, mas mesmo assim não funciona.
Vejam o código:
----------------------------------------------------------------------------------
unit DTCombobox;
interface
Uses
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TDCombobox = Class(TCombobox)
Private
FChave1: TStrings;
Protected
procedure SetItems(const Value: TStrings); override;
Public
procedure Adicionar(Chave,Item: String);
procedure LimparCombo;
property Chave1: TStrings read FChave1 write SetItems;
Published
End;
Procedure Register;
implementation
procedure TDCombobox.Adicionar(Chave,Item: String);
Begin
Items.Add(Item);
FChave1.Add(Chave);
End;
procedure TDCombobox.LimparCombo;
Begin
Items.Clear;
FChave1.Clear;
End;
procedure Register;
begin
RegisterComponents(´Standard´, [TDCombobox]);
end;
procedure TDCombobox.SetItems(const Value: TStrings);
begin
if Assigned(FChave1) then
FChave1.Assign(Value)
else
FChave1 := Value;
end;
end.
----------------------------------------------------------------------------
Bico, né?
Mas por que não funciona?
Eu tenho que usar mesmo este método SetItems, Certo?
Obrigado.
Estou criando um componente simples, derivado do Tcombobox.
A intenção é criar uma funcionalidade que armazena em outra TString o código do ítem.
Só que dá erro quando executo o método ´adicionar´. Creio que é por que o TStrings ´Fchave1´ não é criado.
´Copiei´ um método ´SetItems´ do Delphi, mas mesmo assim não funciona.
Vejam o código:
----------------------------------------------------------------------------------
unit DTCombobox;
interface
Uses
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TDCombobox = Class(TCombobox)
Private
FChave1: TStrings;
Protected
procedure SetItems(const Value: TStrings); override;
Public
procedure Adicionar(Chave,Item: String);
procedure LimparCombo;
property Chave1: TStrings read FChave1 write SetItems;
Published
End;
Procedure Register;
implementation
procedure TDCombobox.Adicionar(Chave,Item: String);
Begin
Items.Add(Item);
FChave1.Add(Chave);
End;
procedure TDCombobox.LimparCombo;
Begin
Items.Clear;
FChave1.Clear;
End;
procedure Register;
begin
RegisterComponents(´Standard´, [TDCombobox]);
end;
procedure TDCombobox.SetItems(const Value: TStrings);
begin
if Assigned(FChave1) then
FChave1.Assign(Value)
else
FChave1 := Value;
end;
end.
----------------------------------------------------------------------------
Bico, né?
Mas por que não funciona?
Eu tenho que usar mesmo este método SetItems, Certo?
Obrigado.
Del
Curtir tópico
+ 0
Responder
Posts
06/10/2005
Massuda
Tem como fazer seu código funcionar sem alterar seu método SetItems, mas prefiro fazer assim...[list:bd70f56445][*:bd70f56445]Declare FChave1 como sendo uma TStringList ao invés de TStrings[*:bd70f56445]No construtor do seu componente, crie a lista de strings FChave1[*:bd70f56445]No destrutor do seu componete, destrua a lista FChave1[/list:u:bd70f56445]
Responder
Gostei + 0
06/10/2005
Del
Valeu Massuda!
Você ajudou-me a criar o meu primeiro componente! (apesar de anos de exp. em Delphi)
Eu tentei fazer isto que você sugeriu antes mas dava erro. Agora que me toquei... Eu estava fazendo no constuctor: FChave1.Create...
Valeu. Obrigado.
Pessoal, para quem quiser, vai o código completo do componente.
É simples, mas muito útil.
Abraços!
Del.
-------------------------------------------------------------------------------
unit DTCombobox;
interface
Uses
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TDCombobox = Class(TCombobox)
Private
FChave1: TStringList;
Protected
Public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Adicionar(Chave,Item: String);
procedure LimparCombo;
property Chave1: TStringList read FChave1;
Published
End;
Procedure Register;
implementation
procedure TDCombobox.Adicionar(Chave,Item: String);
Begin
Items.Add(Item);
FChave1.Add(Chave);
End;
constructor TDCombobox.Create(AOwner: TComponent);
begin
inherited;
FChave1 := TStringList.Create;
end;
destructor TDCombobox.Destroy;
begin
FChave1.Free;
inherited;
end;
procedure TDCombobox.LimparCombo;
Begin
Items.Clear;
FChave1.Clear;
End;
procedure Register;
begin
RegisterComponents(´Standard´, [TDCombobox]);
end;
end.
Você ajudou-me a criar o meu primeiro componente! (apesar de anos de exp. em Delphi)
Eu tentei fazer isto que você sugeriu antes mas dava erro. Agora que me toquei... Eu estava fazendo no constuctor: FChave1.Create...
Valeu. Obrigado.
Pessoal, para quem quiser, vai o código completo do componente.
É simples, mas muito útil.
Abraços!
Del.
-------------------------------------------------------------------------------
unit DTCombobox;
interface
Uses
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TDCombobox = Class(TCombobox)
Private
FChave1: TStringList;
Protected
Public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Adicionar(Chave,Item: String);
procedure LimparCombo;
property Chave1: TStringList read FChave1;
Published
End;
Procedure Register;
implementation
procedure TDCombobox.Adicionar(Chave,Item: String);
Begin
Items.Add(Item);
FChave1.Add(Chave);
End;
constructor TDCombobox.Create(AOwner: TComponent);
begin
inherited;
FChave1 := TStringList.Create;
end;
destructor TDCombobox.Destroy;
begin
FChave1.Free;
inherited;
end;
procedure TDCombobox.LimparCombo;
Begin
Items.Clear;
FChave1.Clear;
End;
procedure Register;
begin
RegisterComponents(´Standard´, [TDCombobox]);
end;
end.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)