Array
(
)

Atribuir novo valor para Constante

Neto
   - 09 mar 2006

Olá a todos.
Estou usando recursos da porta paralela e tudo funciona bem. Agora preciso permitir que seja alterada a porta que esta sendo utiliza, tipo uso a LPT1 (378) mas precisamos mudar as configuraçoes para usar a LPT2 (278), tudo em runtime.
Coloquei um ComboBox para permitir essa mudança, mas quando tento alterar a configuração da contatante BASE, DADOS, etc...., o sistema retorna um erro:

[Error] Unit1.pas(48): ´:=´ expected but ´=´ found

Gostaria de saber também que tipo de dado é a constante BASE, DADOS, STATUS, ect...

Abaixo trecho do programa.
Abraços
Neto


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Bass, ExtCtrls;

{ Comentarios sobre porta paralela
Porta Base/Dados Status Controle
LPT1 0 x 0378 0 x 0379 0 x 037a
LPT2 0 x 0278 0 x 0279 0 x 027a
LPT3 0 x 03bc 0 x 03bd 0 x 03be
}

Const
Base = $378; //Endereço base da porta LPT;
Dados = Base+0; //Endereço para escrita dos dados;
Status = Base+1; //Endereço para leitura dos dados;
Controle = Base+2; //Endereço para escrita;
DadosEPP = Base+4; //ou Base+0, lê e escreve no modo EPP.


type
TForm1 = class(TForm)
ComboBoxPorta: TComboBox;

procedure ComboxPortaChange(Sender: TObject);

private
{ Private declarations }

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// aqui tento trocar de uma porta para outra
procedure TForm1.ComboBox1Change(Sender: TObject);
begin

If ComboBox1.ItemIndex = 0 then // lpt1
begin
Base = $378; //Endereço base da porta LPT;
Dados = Base+0; //Endereço para escrita dos dados;
Status = Base+1; //Endereço para leitura dos dados;
Controle = Base+2; //Endereço para escrita;
DadosEPP = Base+4; //ou Base+0, lê e escreve no modo EPP.
end;


If ComboBox1.ItemIndex = 1 then // lpt2
begin
Base = $278; //Endereço base da porta LPT;
Dados = Base+0; //Endereço para escrita dos dados;
Status = Base+1; //Endereço para leitura dos dados;
Controle = Base+2; //Endereço para escrita;
DadosEPP = Base+4; //ou Base+0, lê e escreve no modo EPP.
end;

end;
end.


Michael
   - 09 mar 2006

Olá!

Como a própria mensagem de erro diz, o operador de atribuição do Delphi é := e não =, este de comparação.

Outra coisa: constantes não devem ser alteradas, e mesmo que vc corrija o erro anterior o Delphi ainda reclamaria, deste vez com a mensagem:


Citação:
Left side cannot be assign to


Existem maneiras de se contornar isso, através de constantes tipadas. Mas no seu caso, como o valor muda em função da seleção do usuário, sugiro usar variáveis - ou campos de classe - para armazenar os valores desejados.

[]´s


Rjun
   - 09 mar 2006

Constante tem esse nome por algum motivo, mas se você quer realmente alterar, veja esse [url=http://forum.clubedelphi.net/viewtopic.php?t=65628]tópico[/url].


Adriano Santos
   - 09 mar 2006

Nossa, vamos entrar em um outra longa discussão, será?


Martins
   - 09 mar 2006


Citação:
Nossa, vamos entrar em um outra longa discussão, será?


Desde que sirva para ampliar o campo do conhecimento na linguagem será bem vinda, caso contrário é melhor parar.

Concordo com o Michael q o melhor nesse caso é usar variaveis e com RJun, a constant deve ter seu valor inalterado, por isso antes de se iniciar um daqueles interminaveis debates, leiam o tópico sugerido pelo colega RJun.

http://forum.clubedelphi.net/viewtopic.php?t=65628

O assunto foi abordado com muito cuidado, e explicações bem detalhadas.


Adriano Santos
   - 09 mar 2006


Citação:

Citação:
Nossa, vamos entrar em um outra longa discussão, será?


Desde que sirva para ampliar o campo do conhecimento na linguagem será bem vinda, caso contrário é melhor parar.

Concordo com o Michael q o melhor nesse caso é usar variaveis e com RJun, a constant deve ter seu valor inalterado, por isso antes de se iniciar um daqueles interminaveis debates, leiam o tópico sugerido pelo colega RJun.

http://forum.clubedelphi.net/viewtopic.php?t=65628

O assunto foi abordado com muito cuidado, e explicações bem detalhadas.


Assino em baixo.


Motta
   - 09 mar 2006

[img:92ab20b242]http://comercial.redeglobo.com.br/imagens_usr/vale_pena_logo.jpg[/img:92ab20b242]


Adriano Santos
   - 09 mar 2006


Citação:
[img:203a6177f2]http://comercial.redeglobo.com.br/imagens_usr/vale_pena_logo.jpg[/img:203a6177f2]



:P, boa.


Rjun
   - 09 mar 2006

Tem gente q parece q tem preguiça de usar a ferramenta de pesquisa.


Martins
   - 09 mar 2006


Citação:
Tem gente q parece q tem preguiça de usar a ferramenta de pesquisa.


Aqui e em quase todos os fóruns é desse jeito, por isso existem vários tópicos q apresentam soluções para o mesmo problema compartilhado por vários usuários (iniciantes, Intermediários, avançados).

At+


Massuda
   - 09 mar 2006

Senhores,

Não há necessidade de prosseguir a discussão sobre o assunto ser (ou não) ´batido´.


Marco Salles
   - 09 mar 2006

Senhores , vamos com calma

Michel disse:

Citação:
Existem maneiras de se contornar isso, através de constantes tipadas


Esta é a idéia

Uma excelente utilização de constantes tipadas é no uso de contadores

olhe uma caracteristica incrivel da constante tipadas: :P :P

Uma constante tipada tem escopo local, porém, seu tempo de vida é o mesmo da aplicação

#Código

Isto mesmo se definirmos uma constante tipada ela so pode ser acessada dentro da rotina Porem seu tempo de vida é o mesmo da aplicação...Isto não é fantático


vantagens :

1)Variavel Global que tb tem o seu tempo de vida = constantes tipadas podem ser acesseveis em qualquer unit que fizer menção a unit aonde esta variavel global foi declarada.. Isto contraria a POO

2)Constantes Tipadas so fazem sentido se forem definidas Localmente ou apos a secção implementation .. Nesse caso ela podera ser vista por toda a unit

3)Tempo de vida da aplicação...Este ajuda muito quem necessitar e gostar de POO
Veja um exemplo
Form1 e form2
Form1 auto criado e form2 Na secção auto valaible
Crie o form2 atraves do form1

#Código
application.CreateForm(TForm2,form2);
Form2.showmodal;
Form2:=nil; ******isto aui é para matar enterrar queimar , vigiar
Freeandnil(Form2);// o Form2 .. Quero destrui-lo mesmo


e no form 2 um botão

#Código
procedure TForm2.Button1Click(Sender: TObject);
const Tipada: integer = 0;
begin
inc(Tipada);
//bloco de código
ShowMessage(IntToStr(Tipada));
end;


a cada criação e destruição do form2 o Valor de Tipada e incrementada.. Isto não é Fantastico

4) Podemos ter varias constantes tipadas com o mesmo nome , se elas tiverem suas definiçoes localmente

5) defina a directiva {$J+} para que o compilador entenda

#Código
implementation

{$R *.dfm} {$J+}


6) e tem mais....


Neto
   - 10 mar 2006

Ok pessoal, obrigado pelas dicas.
Vou de variável
Abraços a todos e bom dia com alegria.
Neto