GARANTIR DESCONTO

Fórum Dúvida com função!!! #300033

19/10/2005

0

Olá Pessoal..

estou tentando desenvolver uma Unit, onde possa colocar funções q vou usar em todo projeto. Uma das funções é para desabilitar a propriedade somente leitura dos objetos do form, mas não estou conseguindo.
Vejam como estou tentando.

Primeiro criei essa classe:
unit UnitFuncoes;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBCtrls, StdCtrls, Buttons, jpeg, ExtCtrls, Mask;
Type
  Funcoes = class(TForm)
    Procedure Ativa (Form : TForm);

  Public
end;
implementation
uses CadastroTios;

//Ativa a propriedade ReadOnly
Procedure Funcoes.Ativa (Form: TForm);
var i : Integer;
begin
for i := 0 to Form.ComponentCount -1 do
  if Form.Components[i] is TDBEdit then
  begin
    TDBEdit(Form.Components[i]).ReadOnly:=True;
  end;

for i := 0 to Form.ComponentCount -1 do
  if Form.Components[i] is TDBComboBox  then
  begin
    TDBComboBox(Form.Components[i]).ReadOnly:=True;
  end;
end;

end.



Depois tentei chamar assim nos outros forms:

UnitFuncoes.Funcoes.Ativa(NomeDoForm);


Mas está dando esse erro: ´This form of method call only allowed for class methods´

Não estou conseguindo resolver.
Se alguém conseguir descobrir o q estou errando, por favor me ajude.

Grato
Humberto Duarte


Hcaixeta

Hcaixeta

Responder

Posts

19/10/2005

Massuda

Do jeito que você implementou, você teria que criar um objeto da classe Funcoes para poder usar a procedure Ativa.

Para fazer no estilo que você pretende (estilo .NET?) faça assim...
Type 
  Funcoes = class(TForm) 
    Class Procedure Ativa (Form : TForm); 
....
Class Procedure Funcoes.Ativa (Form: TForm); 
...
...daí você poderá usar da forma como pretende. Isso é um [b:d1ee33ea49]método de classe[/b:d1ee33ea49], um método de uma classe que não está atrelado a nenhuma instância em particular da classe.


Responder

Gostei + 0

20/10/2005

Michael

O Delphi 2005 extendeu o uso de [b:6b8a946a4b]namespaces[/b:6b8a946a4b], antes limitado apenas à aplicações .NET, para projetos Win32. Desta forma, a sua unit acima poderia se chamar UnitFuncoes.Funcoes (arquivo: UnitFuncoes.Funcoes.pas). Assim, vc não precisa mais criar uma classe Funcoes. Basta declarar as rotinas normalmente no corpo da unit.

Vc pode usar namespaces para organizar melhor suas funções. Veja um exemplo:

- Unit Funcoes.Matematicas.pas - Apenas funções numéricas;
- Unit Funcoes.Logicas.pas - Funções de processamento;
- Unit Funcoes.Desenho - Rotinas de desenhos.

Então, quando for usar, vc declara apenas as que são necessárias.

O legal de usar namespaces é o fato de o CodeInsight do Code Editor entendê-los. Continuando com o exemplo acima, imagine que vc declarou as três units. Durante a programação, digite Funcoes. e Ctrl + espaço. Serão exibidas Matematicas, Logicas e Desenho. Escolha Desenho e digite . de novo mais Ctrl + espaço. Serão mostradas todas as rotinas de desenho. Fica bem organizado.

Vale lembrar que esse recurso é uma simulação dos namespaces do .NET. Ou seja, é apenas um truque para termos o efeito de orientação a objetos extendida a arquivos do framework da Microsoft.

[]´s


Responder

Gostei + 0

20/10/2005

Hcaixeta

Oi Pessoal!!!!

Deu certinho... MUITO OBRIGADO!!!
Se alguém precisar dessa função ela ficou assim:

unit UnitFuncoes;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBCtrls, StdCtrls, Buttons, jpeg, ExtCtrls, Mask;

Type
  Funcoes = class(TForm) 
    Class Procedure Ativa (Form : TForm);
    Class Procedure Desativa (Form : TForm);  
  Private
  Public

end;

implementation

//Ativa a propriedade ReadOnly
class Procedure Funcoes.Ativa (Form: TForm);
var i : Integer;
begin
for i := 0 to Form.ComponentCount -1 do
  if Form.Components[i] is TDBEdit then
  begin
    TDBEdit(Form.Components[i]).ReadOnly:=True;
  end;

for i := 0 to Form.ComponentCount -1 do
  if Form.Components[i] is TDBComboBox  then
  begin
    TDBComboBox(Form.Components[i]).ReadOnly:=True;
  end;
end;

//Desativa a propriedade ReadOnly
class Procedure Funcoes.Desativa (Form: TForm);
var i : Integer;
begin
for i := 0 to Form.ComponentCount -1 do
  if Form.Components[i] is TDBEdit then
  begin
    TDBEdit(Form.Components[i]).ReadOnly:=False;
  end;

for i := 0 to Form.ComponentCount -1 do
  if Form.Components[i] is TDBComboBox  then
  begin
    TDBComboBox(Form.Components[i]).ReadOnly:=False;
  end;
end;

end.


Para chamar:


Uses UnitFuncoes

Funcoes.Ativa(NomeDoForm);
Funcoes.Desativa(NomeDoForm);


Nessa funções ainda podem ser adicionados mais componenetes além dos [color=red:24f212c92e]TDBComboBox[/color:24f212c92e] e dos [color=red:24f212c92e]TDBEdit[/color:24f212c92e]. Se alguém precisar posso fazer as implementações;

Grato
Humberto Duarte
humduca@gamil.com


Responder

Gostei + 0

21/10/2005

Fabio Nascimento

//Ativa a propriedade ReadOnly class Procedure Funcoes.Ativa (Form: TForm); var i : Integer; begin for i := 0 to Form.ComponentCount -1 do if Form.Components[i] is TDBEdit then begin TDBEdit(Form.Components[i]).ReadOnly:=True; end; for i := 0 to Form.ComponentCount -1 do if Form.Components[i] is TDBComboBox then begin TDBComboBox(Form.Components[i]).ReadOnly:=True; end; end; //Desativa a propriedade ReadOnly class Procedure Funcoes.Desativa (Form: TForm); var i : Integer; begin for i := 0 to Form.ComponentCount -1 do if Form.Components[i] is TDBEdit then begin TDBEdit(Form.Components[i]).ReadOnly:=False; end; for i := 0 to Form.ComponentCount -1 do if Form.Components[i] is TDBComboBox then begin TDBComboBox(Form.Components[i]).ReadOnly:=False; end; end;


Olá amigo, apenas para um melhor aproveitamento do seu código, a sua função poderia ser simplificada desta maneira:

class Procedure Funcoes.Ativa (Form: TForm, Estado: Boolean);
var i : Integer;
begin
for i := 0 to Form.ComponentCount -1 do
if Form.Components[i] is TDBEdit then
TDBEdit(Form.Components[i]).ReadOnly:=Estado
else
if Form.Components[i] is TDBComboBox then
TDBComboBox(Form.Components[i]).ReadOnly:=Estado;

end;

E você chamaria a função:

Ativa(Form1,True) -> para habilitar, ou
Ativa(Form1,False) -> para desahabilitar

Isso deixa o seu código mais legível e fácil de usar.

Espero ter ajudaro []´s


Responder

Gostei + 0

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

Aceitar