Fórum Metodos de Classe #296399

21/09/2005

0

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

Tiago Malveira

Responder

Posts

21/09/2005

Michael

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


Responder

Gostei + 0

21/09/2005

Henriquell

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


Responder

Gostei + 0

21/09/2005

Tiago Malveira

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



Responder

Gostei + 0

21/09/2005

Tiago Malveira

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



Responder

Gostei + 0

21/09/2005

Massuda

[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.


Responder

Gostei + 0

21/09/2005

Tiago Malveira

é 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...


Responder

Gostei + 0

21/09/2005

Tiago Malveira

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...


Responder

Gostei + 0

21/09/2005

Massuda

[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)...
var
  Lista: TStringList;
....
  with Lista.Create do begin
    Add(´Teste´);
    Free;
  end;
...o correto seria...
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.


Responder

Gostei + 0

22/09/2005

Isabelct

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´.


Responder

Gostei + 0

22/09/2005

Massuda

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;
...mas aí não faz muito sentido a segunda chamada a Create (que no caso, tem o único efeito de reiniciar a lista, não cria uma lista nova).

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.


Responder

Gostei + 0

22/09/2005

Tiago Malveira

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...


Responder

Gostei + 0

22/09/2005

Massuda

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.


Responder

Gostei + 0

22/09/2005

Massuda

[quote:4c66ea130f=´Tiago Malveira´]Faço isso da seguinte maneira...[/quote:4c66ea130f]Acho que o certo seria...
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).


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar