Propriedades de componente

04/12/2003

2

eu gostaria de criar um componente chamado customedit1mm, derivado de tcustomedit
a unit abaixo não funciona, já que na propriedade datasource deveria poder escolher algum datasource do formulário e a datafield deveria apresetar os campos do datasource selecionado.

a parte de datasource funciona corretamente, mas a parte de data field não funciona

os campos não aparecem, e nem sequer aparece um drop para poder escolhar algum campo, ele fica apenas esperando um string eu tenho que digitar na mão o campo.

mas se eu retirar o número 2 do NOME da propriedade funciona corretamente, a propriedade datafield começa a exibir os campos do datasource selecionado.

alguem sabe me dizer o pq?????


unit CustomEdit1MM;

interface

uses
SysUtils, Classes, DBCtrls, Controls, StdCtrls, db, dbclient, dxDBELib, Mask;

type
TCustomEditMM = class(TCustomEdit)
private
fdatalink : TFieldDataLink;
fdatalink2: TFieldDataLink;
function GetDataField2: string;
function GetDataSource: TDataSource;

procedure SetDataField2(const Value: string);
procedure SetDataSource(const Value: TDataSource);



{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
{ Public declarations }

published

property DataSource: TDataSource read GetDataSource write SetDataSource;
property DataField2: string read GetDataField2 write SetDataField2;
// property text;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents(´Standard´, [TCustomEditMM]);
end;




{ TCustomEditMM }

constructor TCustomEditMM.Create(AOwner: TComponent);
begin
inherited;
fdatalink := TFieldDataLink.Create;
fdatalink2:= TFieldDataLink.Create;
end;


function TCustomEditMM.GetDataField2: string;
begin
Result := FDataLink.FieldName;
end;


function TCustomEditMM.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;



procedure TCustomEditMM.SetDataField2(const Value: string);
begin
FDataLink.FieldName := Value;
end;


procedure TCustomEditMM.SetDataSource(const Value: TDataSource);
begin
if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
FDataLink.DataSource := Value;
if Value <> nil then Value.FreeNotification(Self);
end;


end.


Responder

Posts

05/12/2003

Rafael Heise

Porque o delphi tem algumas coisas já padronizadas, ou melhor, que são registradas e servem para fazer determinadas coisas, ou seja, sempre que tiver aquele nome, ele faz determinada coisa. Então, o que acontece, quando você muda de nome, ele não faz como o delphi faz, dai você tem que registrar para aquela propriedade as mesmas coisas que os componentes da VCL já fizeram. Mas se você faz igual, ele considera como sendo do mesmo tipo (por isso você consegue ver os TDataSource da sua form ou qualquer outra associada). Ou um exemplo melhor. Glyph. Quando você declara uma propriedade com esse nome, já aparece os [...] para você clicar e escolher a imagem.
è isso ae!


Responder

28/09/2005

Steve_narancic

Mas então como criar uma propriedade que não tenha o Nome DataField e que liste os campos?


Responder

28/09/2005

Rafael Heise

Olha, eu estou sem mexer no Delphi fazem 8 meses, e nem tenho delphi aqui (no trabalho), mas até onde me lembro, para criar um componente que liste os campos, você precisa definir essa propriedade como é definido a propriedade do TDataSource, ou TTable...

Dai teria que dar uma olhada nos .pas que estão dentro de uma pasta do Delphi, que são os fontes do biblioteca VCU. Assim de cabeça eu não me lembro, mas é preciso implementar da mesma forma que esses componentes.

Eu sei também que quando você cria uma propriedade com aquele ´carinha especial´, que abre uma janela ou lista os campos, você pode definir (com um certo código) que toda vez que aparecer uma propriedade com aquele nome ela deve se comportar daquela maneira. Mas mesmo pra isso, é preciso olhar a biblioteca do próprio delphi, porque também não me lembro como se faz, mas sei que em uma revista da ClubeDelphi sai uma matéria sobre isso, acho que era algo como Componentes Avançados, ou algo nesse sentido!

valeu!


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira