Form Herdado - Mudança de quot;paiquot;

Delphi

29/03/2005

Oi galera;

Existe alguma forma de mudar o ´pai´ do form, ao criá-lo?

Exemplo: eu uso uma tela de GRID que, hora será chamada como fmMDIChild e hora deverá ser chamada como fsNORMAL, para poder dar showmodal.

Tem como trocar:
[b:bd59283c58]De[/b:bd59283c58] :arrow: TfmGrTipo = class(TfmMasterGrid)
[b:bd59283c58]Para[/b:bd59283c58] :arrow: TfmGrTipo = class(TfmMasterGrid[b:bd59283c58]ONLINE[/b:bd59283c58])

Valew


Gustavo_pacheco

Gustavo_pacheco

Curtidas 0

Respostas

Andremuller

Andremuller

29/03/2005

acho que até daria pra fazer isso passando esse parâmetro no construtor da classe, mas não acho que seja uma boa idéia.

Não daria pra fazer algo do tipo

TfmGrTipo = class(TfmMasterGrid)
TfmGrTipoOnLine = class(TfmGrTipo)

Ou se isso for um caso comum para diversos forms eu faria da seguinte forma: passaria no construtor de TfmMasterGrid a forma como quero que ele seja executado e então essa função estaria implementada pra todos os forms, ou pega um ancestral ainda mais baixo.

Server?


GOSTEI 0
Andremuller

Andremuller

29/03/2005

Esse ´Server?´ no final da mensagem era pra ser Serve?


GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

Já tentei mudar no constructor, mas o form ´pisca´ e é exatamente isso que o usuário não quer :? :(


GOSTEI 0
Andremuller

Andremuller

29/03/2005

O que você muda no construtor o ancestral ou a visualização?

Se for a visualização não faz muito sentido ele piscar porque a atualização é feita antes do show.

O que seria o piscar, ele aparece, desaparece e depois aparece novamente?


GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

A principio eu só tinha o MASTERGRID do tipo FSMDICHILD para forms normais, com botão inclui, exclui, etc.

Então precisei que esses forms fossem utilizados para pesquisas , porém chamando com showmodal; só que para isso o form deveria ser do tipo FSNORMAL e o VISIBLE FALSE

No Create eu fiz assim:

if xPesquisa = true then
  fmGrTipo.formstyle := fsnormal;
  fmGrTipo.visible := false;
  fmGrTipo.showmodal
end;


Nessa de visible true/false é que ele pisca...

Então resolvi criar um MASTERGRIDONLINE já com as propriedades default, mas não consigo mudar o PARENT do grid em tempo de execução... :(


GOSTEI 0
Andremuller

Andremuller

29/03/2005

agora entendi, o que você fez não foi escrever o construtor, foi colocar isso no evento OnCreate.

Olha só, a minha dica foi a seguinte:

Reescreve o construtor, como no exempo que segue:
type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    constructor Create(AOwner: TComponent; AFormStyle: TFormStyle); reintroduce;
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

{ TForm2 }

constructor TForm2.Create(AOwner: TComponent; AFormStyle: TFormStyle);
begin
  inherited Create(AOwner);
  FormStyle := AFormStyle;
end;


Depois faz a chamada passando a forma como tu quer que o form seja executado, tipo:
  Form2 := TForm2.Create(Application, fsNormal);
  try
    Form2.ShowModal;
  finally
    FreeAndNil(Form2);
  end;



GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

Eu já havia feito isso no .CREATE:

  if xSearch then
  begin
    FormStyle := fsNormal;
    Visible := false;
    Position := poScreenCenter;
  end;


Então resolvi inverter a situação:
  if not xSearch then
  begin
    FormStyle := fsMDIChild;
    Visible := true;
    Position := poMainFormCenter;
  end;


Depois disso começou a dar a mensagem de ACCESS VIOLATION

arrrgggth ...


GOSTEI 0
Andremuller

Andremuller

29/03/2005

Tu poderia postar todo o código do teu create, inclusive o cabeçalho do método?

Ficaria melhor de avaliar isso


GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

Lá vai:

constructor TfmMasterGrid.Create(Search:boolean=false;KeyAtu:integer=0);
begin
  xCreated := false;
  xKeyManut := 0;
  LimpaCampos;
  xKeyAtu := KeyAtu;
  xSearch := Search;
{
  if xSearch then
  begin
    FormStyle := fsNormal;
    Visible := false;
    Position := poScreenCenter;
  end;
}
  if not xSearch then
  begin
    FormStyle := fsMDIChild;
    Visible := true;
    Position := poMainFormCenter;
  end;

  inherited Create(Application);
  xConteudoPesq := ´´;
  xColuna := nil;
  HabBarrasSkin(self);
end;



GOSTEI 0
Andremuller

Andremuller

29/03/2005

tu por acaso não devia estar executando o

inherited Create(Application);

antes de mais nada?

tem que ver em que ponto em específico está dando o acces violation, talvez seja porque tu está tentando acessar um atributo do form antes dele estar criado.


GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

Vix... Piscou MENOS, mas agora meu form ficou totalmente preto...

Queria tentar resolver chamando o form de outro pai e não mudando o create...


GOSTEI 0
Andremuller

Andremuller

29/03/2005

Mudar a herança não vai ter como e não sei mais como lhe ajudar.
Fiz a seguinte aplicação
criei um form2 com o seguinte construtor

constructor TForm2.Create(ANormal: Boolean);
begin
  inherited Create(Application);
  if ANormal then
  begin
    FormStyle := fsNormal;
    Position := poScreenCenter;
    Refresh;
    ShowModal;
  end
  else
  begin
    FormStyle := fsMDIChild;
    Position := poMainFormCenter;
  end;
end;


e no form1 fiz as seguintes chamadas

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(True);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2 := TForm2.Create(False);
end;


E funciona bem, esse seu ´pisca´ não consigo simular


GOSTEI 0
Fred

Fred

29/03/2005

acho que nao entendi direito, mas... Porque vc esta usando a propriedade VISIBLE DO FORM??????????????????


GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

Beleza cara, valeu mesmo...

Deve ser então algum outro problema de componentes (eu uso skin, vou ver com o suporte deles)

Mas de qq forma obrigadão pela força!


GOSTEI 0
Gustavo_pacheco

Gustavo_pacheco

29/03/2005

Fred,

A propriedade VISIBLE é necessária para dar o SHOWMODAL...


GOSTEI 0
POSTAR