Control has no parent window? Alguém sabe?
Colegas,
Estou com esse problema na minha aplicação. O Emerson já me deu uma luz, porém ainda não está dando certo. Segue o histórico abaixo:
-------------------------------------------------------------------------------------
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?
Voltar ao Topo
emerson.en
Registrado em: Terça-Feira, 16 de Março de 2004
Mensagens: 73
Localização: São Paulo - SP - Brasil
Enviada: Qua Jun 09, 2004 2:13 pm Assunto:
--------------------------------------------------------------------------------
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.
_________________
Não sabendo que era impossível ele foi lá e fez...
Voltar ao Topo
Muxagata
Registrado em: Segunda-Feira, 7 de Julho de 2003
Mensagens: 8
Enviada: Qua Jun 09, 2004 2:51 pm Assunto: Emerson agora dá ´ Control has no parent window´
--------------------------------------------------------------------------------
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!
Estou com esse problema na minha aplicação. O Emerson já me deu uma luz, porém ainda não está dando certo. Segue o histórico abaixo:
-------------------------------------------------------------------------------------
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?
Voltar ao Topo
emerson.en
Registrado em: Terça-Feira, 16 de Março de 2004
Mensagens: 73
Localização: São Paulo - SP - Brasil
Enviada: Qua Jun 09, 2004 2:13 pm Assunto:
--------------------------------------------------------------------------------
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.
_________________
Não sabendo que era impossível ele foi lá e fez...
Voltar ao Topo
Muxagata
Registrado em: Segunda-Feira, 7 de Julho de 2003
Mensagens: 8
Enviada: Qua Jun 09, 2004 2:51 pm Assunto: Emerson agora dá ´ Control has no parent window´
--------------------------------------------------------------------------------
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!
Muxagata
Curtidas 0
Respostas
Paulo_amorim
09/06/2004
Olá
Tente diminuir as mensagens nas próximas vezes...é cansativo de ler...
nao precisa colocar todo o código :wink:
tente colocar depois de criar:
Espero que ajude
Até+
Tente diminuir as mensagens nas próximas vezes...é cansativo de ler...
nao precisa colocar todo o código :wink:
tente colocar depois de criar:
ListBox.Parent := Application.MainForm;
Espero que ajude
Até+
GOSTEI 0
Muxagata
09/06/2004
Ok, Paulo
Eu coloquei todo o histórico pq ele fazia parte de uma outra mensagem que ninguém respondia.
Tentei o que voce indicou, porém não compilou e deu a mensagem
´ imcompatible types : Twincontrol and Tcustomform´
e agora?
Eu coloquei todo o histórico pq ele fazia parte de uma outra mensagem que ninguém respondia.
Tentei o que voce indicou, porém não compilou e deu a mensagem
´ imcompatible types : Twincontrol and Tcustomform´
e agora?
GOSTEI 0
Paulo_amorim
09/06/2004
Olá
Perdoa-me...nao sabia qual o tipo...
Deve-se então faer um TypeCase
tente
ListBox.Parent := TForm(Application.MainForm)
aqui funcionou...
Até+
Perdoa-me...nao sabia qual o tipo...
Deve-se então faer um TypeCase
tente
ListBox.Parent := TForm(Application.MainForm)
aqui funcionou...
Até+
GOSTEI 0
Muxagata
09/06/2004
Paulo,
Agora compilou, mas o problema continuou. Você disse que funcionou aí. Você poderia me mandar esse teste para ver o que eu estou fazendo de errado. Envie para muxagata@terra.com.br
Um abraço e obrigado pela sua atenção
Agora compilou, mas o problema continuou. Você disse que funcionou aí. Você poderia me mandar esse teste para ver o que eu estou fazendo de errado. Envie para muxagata@terra.com.br
Um abraço e obrigado pela sua atenção
GOSTEI 0
Paulo_amorim
09/06/2004
Olá
Tente o código abaixo...
vc falou que rodou porem nao funcionou...o [b:bfb24a2978]não funcionar[/b:bfb24a2978] significa o que exatamente?
Aqui apareceu o listbox quando apertei o botão que tinha esse codigo...
Espero que ajude
Até+
Tente o código abaixo...
vc falou que rodou porem nao funcionou...o [b:bfb24a2978]não funcionar[/b:bfb24a2978] significa o que exatamente?
var lst: TListBox; begin lst := TListBox.Create(Application.MainForm); lst.Parent := Application.MainForm; lst.Visible := True; lst.Top := 60; lst.Left := 0; end;
Aqui apareceu o listbox quando apertei o botão que tinha esse codigo...
Espero que ajude
Até+
GOSTEI 0
Rookie
09/06/2004
Paulo,
O problema é que eu estava colocando o seu comando em uma unit sem formulário, quando eu passei o comando Listbox := Tform(application.mainform) para o formulário principal deu certo e ele criou em tempo de execução e poluiu a minha tela de abertura ( até aí tudo bem, é só colocar invisível). Porém a minha idéia original é se eu poderia usar uma listbox sem ter que criá-la fisicamente? É possível? Eu só queria os recursos do componente, não criá-lo fisicamente.
O problema é que eu estava colocando o seu comando em uma unit sem formulário, quando eu passei o comando Listbox := Tform(application.mainform) para o formulário principal deu certo e ele criou em tempo de execução e poluiu a minha tela de abertura ( até aí tudo bem, é só colocar invisível). Porém a minha idéia original é se eu poderia usar uma listbox sem ter que criá-la fisicamente? É possível? Eu só queria os recursos do componente, não criá-lo fisicamente.
GOSTEI 0