Sobre types e classes - ajuda, por favor
Colegas,
Eu tenho uma unit pura, sem formulário, na minha aplicação, onde eu coloco as functions, procedures evariáveis comuns do sistema. Isso funciona perfeitamente. O problema é que precisei ter umas listboxs e checklistbox comuns para a aplicação e eu declarei da seguinte forma :
type
Tlista = class(Tform)
lbnota50 : Tlistbox;
lbnota51 : Tlistbox;
lbnota53 : Tlistbox;
lbnota54 : Tlistbox;
lbnota75 : Tlistbox;
lbnotaot : Tlistbox;
checknota : Tchecklistbox;
checkitem : Tchecklistbox;
checkprod : Tchecklistbox;
end;
enuminvalido = class (Exception);
glob = record
achou : boolean;
cgc : string;
nota : integer;
codigo : string;
end;
function tiraponto(texto :string):string;
function achapalavra(chave : string; texto : string) : boolean;
function ObtemdirdoAlias(Alias : string) : string;
procedure criticanum(texto :string; n :integer);
procedure tiraalfa(num1 :string; var num2 :string);
procedure duascasas(num1 :real; var num2 :real);
procedure quatrocasas(num1 :real; var num2 :real);
procedure periodocombarra(data1 :string; var data2 :string);
procedure periodosembarra(data1 :string; var data2 :string);
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
var
gb : glob;
fw : Tlista;
I,limite,tam : integer;
x : real;
Database : Tdatabase;
Ele compila sem problemas, mas quando inicia a aplicação ele aborta no formulário principal quando eu faço :
fw.checknota.Items[0] := ´CNPJ´;
Ele dá ´Access violation at adress .......´
Deve ser uma bobagem, mas eu já quebei a cabeça e não consigo achar uma solução. Alguém tem idéia?
Eu tenho uma unit pura, sem formulário, na minha aplicação, onde eu coloco as functions, procedures evariáveis comuns do sistema. Isso funciona perfeitamente. O problema é que precisei ter umas listboxs e checklistbox comuns para a aplicação e eu declarei da seguinte forma :
type
Tlista = class(Tform)
lbnota50 : Tlistbox;
lbnota51 : Tlistbox;
lbnota53 : Tlistbox;
lbnota54 : Tlistbox;
lbnota75 : Tlistbox;
lbnotaot : Tlistbox;
checknota : Tchecklistbox;
checkitem : Tchecklistbox;
checkprod : Tchecklistbox;
end;
enuminvalido = class (Exception);
glob = record
achou : boolean;
cgc : string;
nota : integer;
codigo : string;
end;
function tiraponto(texto :string):string;
function achapalavra(chave : string; texto : string) : boolean;
function ObtemdirdoAlias(Alias : string) : string;
procedure criticanum(texto :string; n :integer);
procedure tiraalfa(num1 :string; var num2 :string);
procedure duascasas(num1 :real; var num2 :real);
procedure quatrocasas(num1 :real; var num2 :real);
procedure periodocombarra(data1 :string; var data2 :string);
procedure periodosembarra(data1 :string; var data2 :string);
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
var
gb : glob;
fw : Tlista;
I,limite,tam : integer;
x : real;
Database : Tdatabase;
Ele compila sem problemas, mas quando inicia a aplicação ele aborta no formulário principal quando eu faço :
fw.checknota.Items[0] := ´CNPJ´;
Ele dá ´Access violation at adress .......´
Deve ser uma bobagem, mas eu já quebei a cabeça e não consigo achar uma solução. Alguém tem idéia?
Muxagata
Curtidas 0
Respostas
Emerson Nascimento
09/06/2004
você não precisa criar uma classe para um formulário. basta criar as instâncias para as classes desejadas, no caso, Tlistbox e Tchecklistbox.
depois você precisa ´criá-las´: variavel := Classe.Create();
faça isso na seção initialization da sua unit.
deveria ser algo como:
type
    enuminvalido = class (Exception);
    glob = record
        achou : boolean;
        cgc : string;
        nota : integer;
        codigo : string;
    end;
function tiraponto(texto :string):string;
function achapalavra(chave : string; texto : string) : boolean;
function ObtemdirdoAlias(Alias : string) : string;
procedure criticanum(texto :string; n :integer);
procedure tiraalfa(num1 :string; var num2 :string);
procedure duascasas(num1 :real; var num2 :real);
procedure quatrocasas(num1 :real; var num2 :real);
procedure periodocombarra(data1 :string; var data2 :string);
procedure periodosembarra(data1 :string; var data2 :string);
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
var
    gb : glob;
    fw : Tlista;
    I,limite,tam : integer;
    x : real;
    Database : Tdatabase;
    lbnota50 : Tlistbox;
    lbnota51 : Tlistbox;
    lbnota53 : Tlistbox;
    lbnota54 : Tlistbox;
    lbnota75 : Tlistbox;
    lbnotaot : Tlistbox;
    checknota : Tchecklistbox;
    checkitem : Tchecklistbox;
    checkprod : Tchecklistbox;
{Implementação das funções/procedimentos}
Initialization
    lbnota50 := Tlistbox.Create(Application.MainForm);
    lbnota51 := Tlistbox.Create(Application.MainForm);
    lbnota53 := Tlistbox.Create(Application.MainForm);
    lbnota54 := Tlistbox.Create(Application.MainForm);
    lbnota75 := Tlistbox.Create(Application.MainForm);
    lbnotaot := Tlistbox.Create(Application.MainForm);
    checknota := Tchecklistbox.Create(Application.MainForm)
    checkitem := Tchecklistbox.Create(Application.MainForm)
    checkprod := Tchecklistbox.Create(Application.MainForm)
end.
além disso, no seu form principal, você deve adicionar os itens, pois eles ainda não existem.
fw.checknota.Items.Add(´CNPJ´);
não esqueça de utilizar o comando Clear se desejar alterar o conteúdo das listas.
fw.checknota.Items.Clear;
fw.checknota.Items.Add(´CNPJ´);
fw.checknota.Items.Add(´item 2´);
fw.checknota.Items.Add(´item 3´);
fw.checknota.Items.Add(´item 4´);
acho que é isso... espero ter ajudado.
depois você precisa ´criá-las´: variavel := Classe.Create();
faça isso na seção initialization da sua unit.
deveria ser algo como:
type
    enuminvalido = class (Exception);
    glob = record
        achou : boolean;
        cgc : string;
        nota : integer;
        codigo : string;
    end;
function tiraponto(texto :string):string;
function achapalavra(chave : string; texto : string) : boolean;
function ObtemdirdoAlias(Alias : string) : string;
procedure criticanum(texto :string; n :integer);
procedure tiraalfa(num1 :string; var num2 :string);
procedure duascasas(num1 :real; var num2 :real);
procedure quatrocasas(num1 :real; var num2 :real);
procedure periodocombarra(data1 :string; var data2 :string);
procedure periodosembarra(data1 :string; var data2 :string);
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
var
    gb : glob;
    fw : Tlista;
    I,limite,tam : integer;
    x : real;
    Database : Tdatabase;
    lbnota50 : Tlistbox;
    lbnota51 : Tlistbox;
    lbnota53 : Tlistbox;
    lbnota54 : Tlistbox;
    lbnota75 : Tlistbox;
    lbnotaot : Tlistbox;
    checknota : Tchecklistbox;
    checkitem : Tchecklistbox;
    checkprod : Tchecklistbox;
{Implementação das funções/procedimentos}
Initialization
    lbnota50 := Tlistbox.Create(Application.MainForm);
    lbnota51 := Tlistbox.Create(Application.MainForm);
    lbnota53 := Tlistbox.Create(Application.MainForm);
    lbnota54 := Tlistbox.Create(Application.MainForm);
    lbnota75 := Tlistbox.Create(Application.MainForm);
    lbnotaot := Tlistbox.Create(Application.MainForm);
    checknota := Tchecklistbox.Create(Application.MainForm)
    checkitem := Tchecklistbox.Create(Application.MainForm)
    checkprod := Tchecklistbox.Create(Application.MainForm)
end.
além disso, no seu form principal, você deve adicionar os itens, pois eles ainda não existem.
fw.checknota.Items.Add(´CNPJ´);
não esqueça de utilizar o comando Clear se desejar alterar o conteúdo das listas.
fw.checknota.Items.Clear;
fw.checknota.Items.Add(´CNPJ´);
fw.checknota.Items.Add(´item 2´);
fw.checknota.Items.Add(´item 3´);
fw.checknota.Items.Add(´item 4´);
acho que é isso... espero ter ajudado.
GOSTEI 0
Muxagata
09/06/2004
Emerson,
Obrigado pela a ajuda, porém agora está dando a mensagem
´ Control has no parent window´ . Tem idéia do que seja.
Abaixo segue como ficou a Unit.
unit global;
interface
uses
dbiprocs, dbtables, sysutils, Graphics, classes, BDE, stdctrls, checklst,
Qforms;
type
enuminvalido = class (Exception);
glob = record
achou : boolean;
cgc : string;
nota : integer;
codigo : string;
end;
function tiraponto(texto :string):string;
function achapalavra(chave : string; texto : string) : boolean;
function ObtemdirdoAlias(Alias : string) : string;
procedure criticanum(texto :string; n :integer);
procedure tiraalfa(num1 :string; var num2 :string);
procedure duascasas(num1 :real; var num2 :real);
procedure quatrocasas(num1 :real; var num2 :real);
procedure periodocombarra(data1 :string; var data2 :string);
procedure periodosembarra(data1 :string; var data2 :string);
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
var
gb : glob;
I,limite,tam : integer;
x : real;
Database : Tdatabase;
lbnota50 : Tlistbox;
lbnota51 : Tlistbox;
lbnota53 : Tlistbox;
lbnota54 : Tlistbox;
lbnota75 : Tlistbox;
lbnotaot : Tlistbox;
checknota : Tchecklistbox;
checkitem : Tchecklistbox;
checkprod : Tchecklistbox;
implementation
function obtemdirdoalias(alias : string) : string;
var
Desc : pDBDesc;
begin
if DbigetdatabaseDesc(Pchar(Alias),Desc) = 0 then
Result := String(Desc^.szPhyName)
else
Result := ´´;
end;
function tiraponto(texto :string):string;
begin
result := ´´;
while (pos(´.´,texto) > 0) do
delete(texto,pos(´.´,texto),1);
result := texto;
end;
function achapalavra(chave : string; texto : string) : boolean;
begin
result := false;
limite := length(texto);
tam := length(chave);
for I :=1 to limite - (tam -1) do
begin
if copy(texto,I,tam) = chave then
begin
result := true;
break;
end;
end;
end;
procedure criticanum (texto :string; n: integer);
begin
if length(texto) < n then
raise enuminvalido.create(´número inválido´);
end;
procedure tiraalfa (num1: string; var num2 :string);
begin
limite := length(num1);
num2 := ´´;
for I :=1 to limite do
begin
case num1[I] of
´0´..´9´: num2 := num2 + num1[I];
end;
end;
end;
procedure duascasas (num1: real; var num2 :real);
begin
x := num1 * 100;
num2 := round(x)/ 100;
end;
procedure quatrocasas (num1: real; var num2 :real);
begin
x := num1 * 10000;
num2 := round(x)/ 10000;
end;
procedure periodocombarra (data1 : string; var data2 : string);
begin
if data1 = ´´ then
begin
data2 := ´´;
exit;
end;
data2 := data1[5] + data1[6] + ´/´ + data1[1] + data1[2] +
data1[3] + data1[4];
end;
procedure periodosembarra (data1 : string; var data2 : string);
begin
if data1 = ´´ then
begin
data2 := ´´;
exit;
end;
data2 := data1[4] + data1[5] + data1[6] + data1[7] +
data1[1] + data1[2];
end;
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
begin
// if not FileExists(TabFonte) then
// raise Exception.Create(´Tabela ´ + Tabfonte + ´ inexistente´);
DBIInit(nil);
Database := TDatabase.Create(nil);
with Database do
begin
Connected := False;
// Params.Add(´path=´+ExtractFilePath(TabFonte));
Params.Add(´path=´+dirtemp);
DatabaseName := ´CopyPdxTable´;
DriverName := ´STANDARD´;
Connected := True;
end;
Check(DBICopyTable(Database.Handle, True, PChar(TabFonte), nil,
PChar(TabDestino)));
Database.Free;
DBIExit;
end;
initialization
lbnota50 := Tlistbox.Create(Application.Mainform);
lbnota51 := Tlistbox.Create(Application.MainForm);
lbnota53 := Tlistbox.Create(Application.MainForm);
lbnota54 := Tlistbox.Create(Application.MainForm);
lbnota75 := Tlistbox.Create(Application.MainForm);
lbnotaot := Tlistbox.Create(Application.MainForm);
checknota := Tchecklistbox.Create(Application.MainForm);
checkitem := Tchecklistbox.Create(Application.MainForm);
checkprod := Tchecklistbox.Create(Application.MainForm);
end.
lá no form principal eu coloquei a unit global em uses e comecei a dar carga:
checknota.Items[0] := ´CNPJ´;
e aí deu pau!
Obrigado pela a ajuda, porém agora está dando a mensagem
´ Control has no parent window´ . Tem idéia do que seja.
Abaixo segue como ficou a Unit.
unit global;
interface
uses
dbiprocs, dbtables, sysutils, Graphics, classes, BDE, stdctrls, checklst,
Qforms;
type
enuminvalido = class (Exception);
glob = record
achou : boolean;
cgc : string;
nota : integer;
codigo : string;
end;
function tiraponto(texto :string):string;
function achapalavra(chave : string; texto : string) : boolean;
function ObtemdirdoAlias(Alias : string) : string;
procedure criticanum(texto :string; n :integer);
procedure tiraalfa(num1 :string; var num2 :string);
procedure duascasas(num1 :real; var num2 :real);
procedure quatrocasas(num1 :real; var num2 :real);
procedure periodocombarra(data1 :string; var data2 :string);
procedure periodosembarra(data1 :string; var data2 :string);
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
var
gb : glob;
I,limite,tam : integer;
x : real;
Database : Tdatabase;
lbnota50 : Tlistbox;
lbnota51 : Tlistbox;
lbnota53 : Tlistbox;
lbnota54 : Tlistbox;
lbnota75 : Tlistbox;
lbnotaot : Tlistbox;
checknota : Tchecklistbox;
checkitem : Tchecklistbox;
checkprod : Tchecklistbox;
implementation
function obtemdirdoalias(alias : string) : string;
var
Desc : pDBDesc;
begin
if DbigetdatabaseDesc(Pchar(Alias),Desc) = 0 then
Result := String(Desc^.szPhyName)
else
Result := ´´;
end;
function tiraponto(texto :string):string;
begin
result := ´´;
while (pos(´.´,texto) > 0) do
delete(texto,pos(´.´,texto),1);
result := texto;
end;
function achapalavra(chave : string; texto : string) : boolean;
begin
result := false;
limite := length(texto);
tam := length(chave);
for I :=1 to limite - (tam -1) do
begin
if copy(texto,I,tam) = chave then
begin
result := true;
break;
end;
end;
end;
procedure criticanum (texto :string; n: integer);
begin
if length(texto) < n then
raise enuminvalido.create(´número inválido´);
end;
procedure tiraalfa (num1: string; var num2 :string);
begin
limite := length(num1);
num2 := ´´;
for I :=1 to limite do
begin
case num1[I] of
´0´..´9´: num2 := num2 + num1[I];
end;
end;
end;
procedure duascasas (num1: real; var num2 :real);
begin
x := num1 * 100;
num2 := round(x)/ 100;
end;
procedure quatrocasas (num1: real; var num2 :real);
begin
x := num1 * 10000;
num2 := round(x)/ 10000;
end;
procedure periodocombarra (data1 : string; var data2 : string);
begin
if data1 = ´´ then
begin
data2 := ´´;
exit;
end;
data2 := data1[5] + data1[6] + ´/´ + data1[1] + data1[2] +
data1[3] + data1[4];
end;
procedure periodosembarra (data1 : string; var data2 : string);
begin
if data1 = ´´ then
begin
data2 := ´´;
exit;
end;
data2 := data1[4] + data1[5] + data1[6] + data1[7] +
data1[1] + data1[2];
end;
procedure CopiaTabela(Tabfonte,Tabdestino,Dirtemp : string);
begin
// if not FileExists(TabFonte) then
// raise Exception.Create(´Tabela ´ + Tabfonte + ´ inexistente´);
DBIInit(nil);
Database := TDatabase.Create(nil);
with Database do
begin
Connected := False;
// Params.Add(´path=´+ExtractFilePath(TabFonte));
Params.Add(´path=´+dirtemp);
DatabaseName := ´CopyPdxTable´;
DriverName := ´STANDARD´;
Connected := True;
end;
Check(DBICopyTable(Database.Handle, True, PChar(TabFonte), nil,
PChar(TabDestino)));
Database.Free;
DBIExit;
end;
initialization
lbnota50 := Tlistbox.Create(Application.Mainform);
lbnota51 := Tlistbox.Create(Application.MainForm);
lbnota53 := Tlistbox.Create(Application.MainForm);
lbnota54 := Tlistbox.Create(Application.MainForm);
lbnota75 := Tlistbox.Create(Application.MainForm);
lbnotaot := Tlistbox.Create(Application.MainForm);
checknota := Tchecklistbox.Create(Application.MainForm);
checkitem := Tchecklistbox.Create(Application.MainForm);
checkprod := Tchecklistbox.Create(Application.MainForm);
end.
lá no form principal eu coloquei a unit global em uses e comecei a dar carga:
checknota.Items[0] := ´CNPJ´;
e aí deu pau!
GOSTEI 0
Emerson Nascimento
09/06/2004
no OnShow do seu form principal coloque:
lbnota50.Parent := Self;
lbnota51.Parent := Self;
lbnota53.Parent := Self;
lbnota54.Parent := Self;
lbnota75.Parent := Self;
lbnotaot.Parent := Self;
checknota.Parent := Self;
checkitem.Parent := Self;
checkprod.Parent := Self;
lbnota50.Visible := False;
lbnota51.Visible := False;
lbnota53.Visible := False;
lbnota54.Visible := False;
lbnota75.Visible := False;
lbnotaot.Visible := False;
checknota.Visible := False;
checkitem.Visible := False;
checkprod.Visible := False;
só uma questão/sugestão: ao invés de utilizar esses componentes, não seria melhor utilizar arrays? acho que é mais simples...
lbnota50.Parent := Self;
lbnota51.Parent := Self;
lbnota53.Parent := Self;
lbnota54.Parent := Self;
lbnota75.Parent := Self;
lbnotaot.Parent := Self;
checknota.Parent := Self;
checkitem.Parent := Self;
checkprod.Parent := Self;
lbnota50.Visible := False;
lbnota51.Visible := False;
lbnota53.Visible := False;
lbnota54.Visible := False;
lbnota75.Visible := False;
lbnotaot.Visible := False;
checknota.Visible := False;
checkitem.Visible := False;
checkprod.Visible := False;
só uma questão/sugestão: ao invés de utilizar esses componentes, não seria melhor utilizar arrays? acho que é mais simples...
GOSTEI 0