Owner e E Objetos em Run-Time
1 - Estou fazendo um programa que cria varios objetos em run-time.
2 - Ainda não li a revista clubedelphi nº 72 que fala sobre isso, mas pretendo lê-la essa semana ainda.
3 - Varias duvidas. Vamos lá.
Quando crio um componente, o que colocar no owner? Quando crio formularios coloco como nil (pelo que li aki no forum). E componentes?
Pergunto isso pois tenho uma rotina que busca por esses componentes e dependendo o owner eles nao sao encontrados.
Qual a melhor forma de buscar componentes? Eu crio um TComponente (por ex Acha_Componente)e faço ele receber Formulario.FindComponent(´nome´) depois uso : TButton(Acha_Componente) ... tem uma forma mais correta de fazer isso. Como criar por ex Botao : TButton e fazer uma
busca soh por botoes, pra nao ter que fazer um laço em componentcount?
Se eu der um free em um componente, o free passa para os que estao ligados a ele pelo parent? (tipo um button em um panel).
Se eu crio um TImage, tem como eu dar um load em jpg ou vou ter q usar TJPegImage? e ao contrario?
valeu galera. breve posto mais algumas...
2 - Ainda não li a revista clubedelphi nº 72 que fala sobre isso, mas pretendo lê-la essa semana ainda.
3 - Varias duvidas. Vamos lá.
Quando crio um componente, o que colocar no owner? Quando crio formularios coloco como nil (pelo que li aki no forum). E componentes?
Pergunto isso pois tenho uma rotina que busca por esses componentes e dependendo o owner eles nao sao encontrados.
Qual a melhor forma de buscar componentes? Eu crio um TComponente (por ex Acha_Componente)e faço ele receber Formulario.FindComponent(´nome´) depois uso : TButton(Acha_Componente) ... tem uma forma mais correta de fazer isso. Como criar por ex Botao : TButton e fazer uma
busca soh por botoes, pra nao ter que fazer um laço em componentcount?
Se eu der um free em um componente, o free passa para os que estao ligados a ele pelo parent? (tipo um button em um panel).
Se eu crio um TImage, tem como eu dar um load em jpg ou vou ter q usar TJPegImage? e ao contrario?
valeu galera. breve posto mais algumas...
M@gnun
Curtidas 0
Respostas
M@gnun
25/04/2006
outra: Tem como definir qual componente ficará na frente . (Como quando se clica com o botao direito do mouse em tempo de projeto e escolhe Control>Bring to Front). Porque a order da criação dos componentes em meu projeto pode variar mas o resultado teria que ser sempre determinados controles na frente de outros.
valeu.
valeu.
GOSTEI 0
Massuda
25/04/2006
[quote:ebefa4d004=´m@gnun´]Quando crio um componente, o que colocar no owner? Quando crio formularios coloco como nil (pelo que li aki no forum). E componentes?[/quote:ebefa4d004]O Owner define um outro componente que irá se encarregar de destruir o componente. Se for nil, nenhum componente irá se responsabilizar por isso, é sua responsabilidade destruir esse componente com Owner = nil.
Isso serve para garantir que componentes contidos em um outro componente (o Owner) sejam destruídos junto com o Owner.
[quote:ebefa4d004=´m@gnun´]Pergunto isso pois tenho uma rotina que busca por esses componentes e dependendo o owner eles nao sao encontrados.[/quote:ebefa4d004]O Owner está associado a idéia de um componente que contem outros componentes. Como as rotinas de busca geralmente procuram por um dos componentes contidos em um componente, dependendo do Owner um dado componente pode ou não ser encontrado dentro de outro.
[quote:ebefa4d004=´m@gnun´]Se eu der um free em um componente, o free passa para os que estao ligados a ele pelo parent? (tipo um button em um panel).[/quote:ebefa4d004]O que você quer dizer com ´passa para os que estao ligados a ele pelo parent´?
Note que Parent e Owner são coisas diferentes. Parent está ligado ao conceito da ordem de exibição dos componentes. Um dado componente sempre é exibido em cima do Parent dele.
[quote:ebefa4d004=´m@gnun´]Tem como definir qual componente ficará na frente...[/quote:ebefa4d004]Pelo que escrevi antes, basta ajustar o Parent adequadamente.
Isso serve para garantir que componentes contidos em um outro componente (o Owner) sejam destruídos junto com o Owner.
[quote:ebefa4d004=´m@gnun´]Pergunto isso pois tenho uma rotina que busca por esses componentes e dependendo o owner eles nao sao encontrados.[/quote:ebefa4d004]O Owner está associado a idéia de um componente que contem outros componentes. Como as rotinas de busca geralmente procuram por um dos componentes contidos em um componente, dependendo do Owner um dado componente pode ou não ser encontrado dentro de outro.
[quote:ebefa4d004=´m@gnun´]Se eu der um free em um componente, o free passa para os que estao ligados a ele pelo parent? (tipo um button em um panel).[/quote:ebefa4d004]O que você quer dizer com ´passa para os que estao ligados a ele pelo parent´?
Note que Parent e Owner são coisas diferentes. Parent está ligado ao conceito da ordem de exibição dos componentes. Um dado componente sempre é exibido em cima do Parent dele.
[quote:ebefa4d004=´m@gnun´]Tem como definir qual componente ficará na frente...[/quote:ebefa4d004]Pelo que escrevi antes, basta ajustar o Parent adequadamente.
GOSTEI 0
Massuda
25/04/2006
[quote:53b1b8863e=´m@gnun´]Quando crio um componente, o que colocar no owner?[/quote:53b1b8863e]Via de regra, defina como Owner o form que contem os componentes. Se optar por usar Owner = nil, lembre-se que você deve em algum momento (provavelmente no OnDestroy do form) destruir os componentes.
GOSTEI 0
M@gnun
25/04/2006
Primeiro de tudo obrigado, e acho que nem vou comprar mais a revista rsrsrs.... brincadeira...
Quiz dizer: se eu destriuir um componente, seu componente ligado pelo [b:df87e97b9e]parent[/b:df87e97b9e] tambem será destruido? Porque em um projeto antigo eu criava um panel, e nele dois botoes (o owner de todos era o form). Eu apenas destruia o panel e depois criava os tres novamente e nao dava access violation.
Entao, pelo o que vc disse deveria dar erro, não é?
E se os parent deles for o mesmo componente?
No caso do quikreport por ex: Tenho que definir o parent dos qrdbtexts e dos qrdbimages como qrband1, porem o ordem de criação deles pode variar, mas sempre o meu qrdbtext tem que ficar por cima do qrdbimage. Em tempo de projeto, se os componentes tem o mesmo parent, o ultimo a ser criado fica por cima, certo? tem como controlar isso?
valeu.
ps: não sei usar a citação do quote aqui no forum, acho que perceberam. como coloca o nome de quem escreveu no lugar de ´citação:´
[b:df87e97b9e]m@gnun escreveu:[/b:df87e97b9e]
Se eu der um free em um componente, o free passa para os que estao ligados a ele pelo parent? (tipo um button em um panel).
[b:df87e97b9e]massuda escreveu: [/b:df87e97b9e]
O que você quer dizer com ´passa para os que estao ligados a ele pelo parent´?
Note que Parent e Owner são coisas diferentes. Parent está ligado ao conceito da ordem de exibição dos componentes. Um dado componente sempre é exibido em cima do Parent dele.
Quiz dizer: se eu destriuir um componente, seu componente ligado pelo [b:df87e97b9e]parent[/b:df87e97b9e] tambem será destruido? Porque em um projeto antigo eu criava um panel, e nele dois botoes (o owner de todos era o form). Eu apenas destruia o panel e depois criava os tres novamente e nao dava access violation.
Entao, pelo o que vc disse deveria dar erro, não é?
[b:df87e97b9e]m@gnun escreveu: [/b:df87e97b9e]
Tem como definir qual componente ficará na frente...
[b:df87e97b9e]massuda escreveu[/b:df87e97b9e]
Pelo que escrevi antes, basta ajustar o Parent adequadamente.
E se os parent deles for o mesmo componente?
No caso do quikreport por ex: Tenho que definir o parent dos qrdbtexts e dos qrdbimages como qrband1, porem o ordem de criação deles pode variar, mas sempre o meu qrdbtext tem que ficar por cima do qrdbimage. Em tempo de projeto, se os componentes tem o mesmo parent, o ultimo a ser criado fica por cima, certo? tem como controlar isso?
valeu.
ps: não sei usar a citação do quote aqui no forum, acho que perceberam. como coloca o nome de quem escreveu no lugar de ´citação:´
GOSTEI 0
Massuda
25/04/2006
[quote:3af9359f12=´m@gnun´]Quiz dizer: se eu destriuir um componente, seu componente ligado pelo [b:3af9359f12]parent[/b:3af9359f12] tambem será destruido?[/quote:3af9359f12]Não. Parent não tem relação com destruição do componente, Parent tem relação com onde um componente é exibido.
[quote:3af9359f12=´m@gnun´]pelo o que vc disse deveria dar erro, não é?[/quote:3af9359f12]Não geraria um erro se os componentes ficassem sem serem destruídos, o que aconteceria é que você perderia um pouco de memória cada vez que isso acontecesse. Entretanto, provavelmente o panel e os botões ou tinham um [b:3af9359f12]Owner[/b:3af9359f12] em comum ou o [b:3af9359f12]Owner[/b:3af9359f12] dos botões era o panel, de modo que quando o panel era destruído, automaticamente os botões também eram destruídos.
[quote:3af9359f12=´m@gnun´]E se os parent deles for o mesmo componente? ... o ultimo a ser criado fica por cima, certo? tem como controlar isso?[/quote:3af9359f12]Aí o que define quem fica por cima de quem é a ordem de criação dos componentes, como você mesmo já descobriu. Fora isso, todo componente visual (derivado de TControl) possui os métodos BringToFront e SendToBack e você pode usá-los exatamente como faz na IDE.
[quote:3af9359f12=´m@gnun´]pelo o que vc disse deveria dar erro, não é?[/quote:3af9359f12]Não geraria um erro se os componentes ficassem sem serem destruídos, o que aconteceria é que você perderia um pouco de memória cada vez que isso acontecesse. Entretanto, provavelmente o panel e os botões ou tinham um [b:3af9359f12]Owner[/b:3af9359f12] em comum ou o [b:3af9359f12]Owner[/b:3af9359f12] dos botões era o panel, de modo que quando o panel era destruído, automaticamente os botões também eram destruídos.
[quote:3af9359f12=´m@gnun´]E se os parent deles for o mesmo componente? ... o ultimo a ser criado fica por cima, certo? tem como controlar isso?[/quote:3af9359f12]Aí o que define quem fica por cima de quem é a ordem de criação dos componentes, como você mesmo já descobriu. Fora isso, todo componente visual (derivado de TControl) possui os métodos BringToFront e SendToBack e você pode usá-los exatamente como faz na IDE.
GOSTEI 0