Parent de novo Componente

Delphi

21/02/2005

Olá
Tenho o seguinte componente....
Só não consigo fazer funcionar a linha Parent dele... (Grifada abaixo)
O componente instala direitinho. Só na hora de colocá-lo na tela ele não assume o verdadeiro pai (essa é boa): Eu seleciono o componente na paleta e clico em algum Tpanel presente no form e ele coloca como seu pai o Form, mas o seu pai real é o TPanel.

Se alguém souber????

Obrigado



unit uComboSafra;

interface

uses
SysUtils, Classes, Controls, StdCtrls, SqlExpr, Forms;

type
TOpcoesComboSafra = (osSafraAtualPadrao, osCarregaTodos, osCarregaNenhum);
TSOpcoesComboSafra = set of TOpcoesComboSafra;

TOnFormShow = procedure(Sender : TObject) of object;

TComboSafra = class(TComboBox)
private
FSQLConnection: TSQLConnection;
FOldOnFormShow : TOnFormShow;

FOpcoes : TSOpcoesComboSafra;

function GetValueAsString : String;
function GetValueAsInteger : Integer;
procedure SetSQLConnection(const Value: TSQLConnection);
procedure CarregaSafras;
procedure OnNewFormShow(Sender : TObject);
public
constructor Create(AOwner: TComponent); override;
published
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
property Opcoes : TSOpcoesComboSafra read FOpcoes write FOpcoes;
property ValueAsString : String read GetValueAsString;
property ValueAsInteger : Integer read GetValueAsInteger;
end;

procedure Register;

implementation

uses Funcoesflh;


{$R TComboSafra.dcr}

procedure Register;
begin
RegisterComponents(´ATC´, [TComboSafra]);
end;

{ TComboSafra }

procedure TComboSafra.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;

constructor TComboSafra.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
[size=18:12457645ea][b:12457645ea] Parent := TWinControl(AOwner);[/b:12457645ea][/size:12457645ea]
Width := 55;
Style := csDropDownList;
Items.Clear;
FOldOnFormShow := TForm(AOwner).OnShow;
TForm(AOwner).OnShow := OnNewFormShow;
end;

procedure TComboSafra.CarregaSafras;
var
opcao : string;
qrySafra : TSQLQuery;
begin
if FSQLConnection = nil then exit;
qrySafra := TSQLQuery.Create(Self);
try
qrySafra.SQLConnection := FSQLConnection;
qrySafra.SQL.text := ´SELECT DISTINCT(SAFRA) FROM CONFIG_DIARIA ORDER BY SAFRA´;
qrySafra.Open;
Opcao := Self.Text;

Self.Items.Clear;
while not qrySafra.Eof do
begin
Self.Items.Add(qrySafra.fieldbyName(´SAFRA´).AsString);
qrySafra.Next;
end;
if osCarregaTodos in FOpcoes then
Self.Items.Add(´Todos´);
if osSafraAtualPadrao in FOpcoes then
begin
qrySafra.Close;
qrySafra.SQL.Text := ´SELECT MAX(SAFRA) AS SAFRA FROM CONFIG_DIARIA WHERE ´+SQLData(´DATA´,Date);
qrySafra.Open;
Opcao := qrySafra.fieldByName(´SAFRA´).AsString;
qrySafra.Close;
end;
Self.ItemIndex := self.Items.IndexOf(Opcao);
finally
qrySafra.Free;
end;
end;

procedure TComboSafra.OnNewFormShow(Sender: TObject);
begin
if Assigned(FOldOnFormShow) then FOldOnFormShow(GetOwner);
CarregaSafras;
end;

function TComboSafra.GetValueAsInteger : Integer;
begin
Result := StrToIntDef(Self.Text,0);
end;

function TComboSafra.GetValueAsString: String;
begin
Result := Self.Text;
end;

end.


Nandolh

Nandolh

Curtidas 0

Respostas

Massuda

Massuda

21/02/2005

Os conceitos de Owner e Parent são diferentes...

Owner está relacionado com alocação de memória e define quem é o responsável por destruir o objeto. Num form, geralmente o Owner dos componentes é o próprio form.

Parent define quem, em termos visuais, é o pai do objeto ou, melhor, dentro de quem o objeto será definido (pode pensar em termos de z-order também).

No seu componente, não atribua o Parent dele no construtor; deixe isso por conta da IDE. No seu código que utiliza o componente, se você estiver usando uma instancia criada na IDE, a IDE gera/executa o código necessário para atribuir o Parent correto do componente e se você estiver criando o componente dinamicamente, você deveria estar atribuindo o Parent do componente após a criação do componente.

Não sei se ficou claro... qualquer coisa, posta aí!


GOSTEI 0
Nandolh

Nandolh

21/02/2005

Se eu retiro a linha do Parent a seguinte mensagem de ero é exibida:

Control ´´ has no parent Window.

Putz agora, Componente sem pai?


GOSTEI 0
Massuda

Massuda

21/02/2005

Se eu retiro a linha do Parent a seguinte mensagem de ero é exibida...
Como é o código onde esse erro está aparecendo? Como seu componente é derivado de TComboBox (e TComboBox sabe lidar com a questão do Parent), não deveria ter problema, a não ser que você esteja criando o componente dinamicamente e não via editor de form do IDE.


GOSTEI 0
POSTAR