Metodos de Classe
estou tendo alguns problemas em criar mais de uma ´class function/procedure´ em um mesmo objeto. Há alguma maneira pra eu poder declarar mais de um desses metodos em uma mesma Classe?
Tiago Malveira
Curtidas 0
Respostas
Michael
21/09/2005
Olá colega!
Ficou meio obscuro a sua dúvida. Não há limite de métodos de classe que vc possa criar.
Vc pode colocar seu código aqui?
[]´s
Ficou meio obscuro a sua dúvida. Não há limite de métodos de classe que vc possa criar.
Vc pode colocar seu código aqui?
[]´s
GOSTEI 0
Henriquell
21/09/2005
ai vai um exemplo p/ vc...
unit P1;
interface
uses.....
type MinhaClasse = class
protected
x : integer;
y : string;
...
...
...
public
function minhaFuncao(z : integer) : boolean;
procedure minhaProcedure;
...
...
...
end;
implementation
function MinhaClasse.minhaFuncao(z : boolean) : boolean;
begin
result := not z;
end;
procedure MinhaClasse.minhaProcedure;
begin
writeln(´executou minhaProcedure´);
end;
end.
Abrços
unit P1;
interface
uses.....
type MinhaClasse = class
protected
x : integer;
y : string;
...
...
...
public
function minhaFuncao(z : integer) : boolean;
procedure minhaProcedure;
...
...
...
end;
implementation
function MinhaClasse.minhaFuncao(z : boolean) : boolean;
begin
result := not z;
end;
procedure MinhaClasse.minhaProcedure;
begin
writeln(´executou minhaProcedure´);
end;
end.
Abrços
GOSTEI 0
Tiago Malveira
21/09/2005
Olá colega!
Ficou meio obscuro a sua dúvida. Não há limite de métodos de classe que vc possa criar.
Vc pode colocar seu código aqui?
[
Fiz um form para dar uma msg de espera enquanto estava sendo realizada uma pesquisa em uma table bdf
na area publica do meu form eu tinha o seguinte codigo
class procedure OpenForm;
class procedure CloseForm;
e a seguinte codificação
class procedure TfrmEspera.OpenForm;
begin
with self.create(nil) do begin
...
end;
end;
class function TfrmEspera.CloseForm;
begin
//fechava o form
end;
eu naum consegui compilar mas, agora, depois de fazer alguns teste pude ver q eh possivel usar mais de um metodo de classe...
obrigado!
]´s
GOSTEI 0
Tiago Malveira
21/09/2005
Olá colega!
Ficou meio obscuro a sua dúvida. Não há limite de métodos de classe que vc possa criar.
Vc pode colocar seu código aqui?
[
Fiz um form para dar uma msg de espera enquanto estava sendo realizada uma pesquisa em uma table bdf
na area publica do meu form eu tinha o seguinte codigo
class procedure OpenForm;
class procedure CloseForm;
e a seguinte codificação
class procedure TfrmEspera.OpenForm;
begin
with self.create(nil) do begin
...
end;
end;
class function TfrmEspera.CloseForm;
begin
//fechava o form
end;
eu naum consegui compilar mas, agora, depois de fazer alguns teste pude ver q eh possivel usar mais de um metodo de classe...
obrigado!
]´s
GOSTEI 0
Massuda
21/09/2005
[quote:c7dfbc851b=´Tiago Malveira´]class procedure TfrmEspera.OpenForm;
begin
with [color=red:c7dfbc851b]self[/color:c7dfbc851b].create(nil) do begin
...
end;
end;[/quote:c7dfbc851b]Em um class function/procedure não existe a variável Self. Isso porque como a função/procedure é da classe toda, ela não se aplica a uma determinada instância da classe (que é o que o valor Self representa).
Fora isso, Self.Create() não faz muito sentido (pode até compilar, mas não deve executar). Será que você poderia explicar melhor o que pretende fazer pois tenho a impressão que o caminho que você está seguindo não seria o usual.
begin
with [color=red:c7dfbc851b]self[/color:c7dfbc851b].create(nil) do begin
...
end;
end;[/quote:c7dfbc851b]Em um class function/procedure não existe a variável Self. Isso porque como a função/procedure é da classe toda, ela não se aplica a uma determinada instância da classe (que é o que o valor Self representa).
Fora isso, Self.Create() não faz muito sentido (pode até compilar, mas não deve executar). Será que você poderia explicar melhor o que pretende fazer pois tenho a impressão que o caminho que você está seguindo não seria o usual.
GOSTEI 0
Tiago Malveira
21/09/2005
é o seguinte...
Estou fazendo uma pesquisa simples em um banco de dados e o resultado da pesquisa estou passando como parametro para uma class procedure para q eu possa mostrar um form com os dados logo ao criar o form. Eu crio o form, faço um select com os dados q passei como parametro e atribuo a edits os resultados do select
por exemplo
class procedure TfrmPesquisa.Open(AId: integer);
begin
with TfrmPesquisa.Create( nil ) do begin
sdsPesq.CommandText := ´SELECT *...´
edit := FieldByName(´id´).AsInteger;
...
end; //with
end;
dessa maneira consigo preencher os dados do meu formulario de pesquisa no momento q o crio, pois essa pesquisa eh feita de outro form...
Estou fazendo uma pesquisa simples em um banco de dados e o resultado da pesquisa estou passando como parametro para uma class procedure para q eu possa mostrar um form com os dados logo ao criar o form. Eu crio o form, faço um select com os dados q passei como parametro e atribuo a edits os resultados do select
por exemplo
class procedure TfrmPesquisa.Open(AId: integer);
begin
with TfrmPesquisa.Create( nil ) do begin
sdsPesq.CommandText := ´SELECT *...´
edit := FieldByName(´id´).AsInteger;
...
end; //with
end;
dessa maneira consigo preencher os dados do meu formulario de pesquisa no momento q o crio, pois essa pesquisa eh feita de outro form...
GOSTEI 0
Tiago Malveira
21/09/2005
geralmente eu uso o metodo create do formulario com o
Self, como usei no meu primeiro exemplo e funciona normalmente!
mas minha duvida eh qto ao uso de mais de uma class procedure/function em uma mesma classe pq ha vezes q tento usar e naum consigo, outras vezes q consigo, e eu gostaria de saber se tem alguma maneira especial de usar esse tipo de metodo...
Self, como usei no meu primeiro exemplo e funciona normalmente!
mas minha duvida eh qto ao uso de mais de uma class procedure/function em uma mesma classe pq ha vezes q tento usar e naum consigo, outras vezes q consigo, e eu gostaria de saber se tem alguma maneira especial de usar esse tipo de metodo...
GOSTEI 0
Massuda
21/09/2005
[quote:5ece658966=´Tiago Malveira´]geralmente eu uso o metodo create do formulario com o Self, como usei no meu primeiro exemplo e funciona normalmente![/quote:5ece658966]Isso funciona somente se o form tiver sido previamente criado (por exemplo, se ele estiver na lista de forms criados automaticamente).
Por exemplo, este código, equivalente ao seu, não deve funcionar (embora compile)......o correto seria...
Quando você chama o Create para um objeto já criado, isso equivale a reiniciar o objeto, não criar um novo objeto.
Por exemplo, este código, equivalente ao seu, não deve funcionar (embora compile)...
var Lista: TStringList; .... with Lista.Create do begin Add(´Teste´); Free; end;
var Lista: TStringList; .... Lista := TStringList.Create; with Lista do begin Add(´Teste´); Free; end;
Quando você chama o Create para um objeto já criado, isso equivale a reiniciar o objeto, não criar um novo objeto.
GOSTEI 0
Isabelct
21/09/2005
Por exemplo, este código, equivalente ao seu, não deve funcionar (embora compile)...
var Lista: TStringList; .... with Lista.Create do begin Add(´Teste´); Free; end;
E por que não funcionaria? Por mais estranho e não usual que seja, ele funciona sim. Eu é que não gosto muito desse tipo de instrução, primeiro porque você não tem uma referência ao ponteiro, e segundo porque eu, particularmente, não gosto de usar a instrução ´with´.
GOSTEI 0
Massuda
21/09/2005
E por que não funcionaria? Por mais estranho e não usual que seja, ele funciona sim.
Você compilou e executou o código mostrado? Deve ocorrer Access Violation ao executar o Create, pois a variável Lista é nil; o código só funciona caso você crie a lista antes...var Lista: TStringList; .... Lista := TStringList.Create; // <- isto faz funcionar with Lista.Create do // <- isto reinicia a lista begin Add(´Teste´); Free; end;
PS: Também não uso o with no meu dia-a-dia, mas assim o exemplo fica parecido com o código que foi postado originalmente pelo Tiago.
GOSTEI 0
Tiago Malveira
21/09/2005
Eu gostaria de esclarecer uma outra duvida q tenho qto a criação de instancias de uma classe sem referencia-la com um ponteiro...
As vezes, por eu criar uma instancia de uma classe sem ter um ponteiro q referencia essa instancia tenho problemas em acessar esse objeto...
Para esse meu problema, uma alternativa seria criar uma class function q retorne o endereço do meu objeto... Faço isso da seguinte maneira...
class function TfrmPesquisa.OpenForm(AId:integer):TfrmPesquisa;
begin
with self.Create( nil ) do begin
show;
...
end;//with
Result := @self;
end;
Eu gostaria de saber se tem alguma maneira de eu obter o endereço desse objeto se essa rotina fosse uma procedure e eu naum retornasse o endereço da minha nova instancia...
As vezes, por eu criar uma instancia de uma classe sem ter um ponteiro q referencia essa instancia tenho problemas em acessar esse objeto...
Para esse meu problema, uma alternativa seria criar uma class function q retorne o endereço do meu objeto... Faço isso da seguinte maneira...
class function TfrmPesquisa.OpenForm(AId:integer):TfrmPesquisa;
begin
with self.Create( nil ) do begin
show;
...
end;//with
Result := @self;
end;
Eu gostaria de saber se tem alguma maneira de eu obter o endereço desse objeto se essa rotina fosse uma procedure e eu naum retornasse o endereço da minha nova instancia...
GOSTEI 0
Massuda
21/09/2005
Em um class function/procedure não existe a variável Self. Isso porque como a função/procedure é da classe toda, ela não se aplica a uma determinada instância da classe (que é o que o valor Self representa).
Desculpe. Depois de alguma pesquisa, descobri que em uma função/procedure de classe, Self se refere à classe e não a uma determinada instância da classe. Isso é um tanto estranho, já que em outras linguagens orientadas a objeto, isso não existe. Por isso seu código funciona.GOSTEI 0
Massuda
21/09/2005
[quote:4c66ea130f=´Tiago Malveira´]Faço isso da seguinte maneira...[/quote:4c66ea130f]Acho que o certo seria...
[quote:4c66ea130f=´Tiago Malveira´]...tem alguma maneira de eu obter o endereço desse objeto se essa rotina fosse uma procedure e eu naum retornasse o endereço da minha nova instancia...[/quote:4c66ea130f]Se não retornar a referência ao form recém criado, você vai precisar ter algum outro mecanismo para localizar o form; uma possibilidade seria dar um nome ao form (propriedade Name) e quando precisar do form, buscar na lista Screen.Forms[] (Screen é uma variável global do Delphi).
class function TfrmPesquisa.OpenForm(AId:integer):TfrmPesquisa; begin Result := self.Create( nil ); with Result do begin show; ... end;//with end;
[quote:4c66ea130f=´Tiago Malveira´]...tem alguma maneira de eu obter o endereço desse objeto se essa rotina fosse uma procedure e eu naum retornasse o endereço da minha nova instancia...[/quote:4c66ea130f]Se não retornar a referência ao form recém criado, você vai precisar ter algum outro mecanismo para localizar o form; uma possibilidade seria dar um nome ao form (propriedade Name) e quando precisar do form, buscar na lista Screen.Forms[] (Screen é uma variável global do Delphi).
GOSTEI 0