Fórum Sobre types e classes - ajuda, por favor #236943
09/06/2004
0
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
Curtir tópico
+ 0Posts
09/06/2004
Emerson Nascimento
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
09/06/2004
Muxagata
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
09/06/2004
Emerson Nascimento
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
Clique aqui para fazer login e interagir na Comunidade :)