Fórum Sobre types e classes - ajuda, por favor #236943

09/06/2004

0

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?


Muxagata

Muxagata

Responder

Posts

09/06/2004

Emerson Nascimento

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.


Responder

Gostei + 0

09/06/2004

Muxagata

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!


Responder

Gostei + 0

09/06/2004

Emerson Nascimento

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


Responder

Gostei + 0

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

Aceitar