Res: [delphi-br] Ponteiro - Ajuda

2008-10-30 Por tôpico Andresa Ferreira
Oi João... Muito, muito obrigada.

A propriedade FechtAll da query estava false, por isso ele dava erro.

Valeu.
Andresa





De: Joao Morais [EMAIL PROTECTED]
Para: delphi-br@yahoogrupos.com.br
Enviadas: Quarta-feira, 29 de Outubro de 2008 13:49:27
Assunto: Re: [delphi-br] Ponteiro - Ajuda


2008/10/29 Andresa Ferreira andresa_delphi@ yahoo.com. br:
 Oi João.

 Então, eu uso delphi7 e não achei a opçao Debug Units, porém achei Debug DCUs.
 Qdo dei CTRL+F3 apareceu a mensagem anexa.

A lista não aceita anexos. Passa um link com a imagem ou transcreve o
local aonde o código parou.

Estive analisando um pouco mais detalhadamente seu código, você
utiliza SetLength com base em um RecordCount. Quem te garante que o
recordcount retornou a quantidade correta de registros? Se você tentar
acessar um elemento além do tamanho do array, você terá um AV também.
Execute a rotina passo a passo (coloque um breakpoint no setlength) e
veja se ao menos a sua rotina chega até o fim, do contrário, diga qual
foi a linha em que ela parou.

 Sabe João, eu nunca tinha usado ponteiros antes, e não tô gostando 
 srsrssrrs... . Teria
 um meio de eu fazer esse processo sem usar ponteiros??? ?

Eu acho que não. Você poderia usar objetos, mas teria que se preocupar
em alocar e desalocar da mesma forma.

Joao Morais
 


  Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua 
cara @ymail.com ou @rocketmail.com.
http://br.new.mail.yahoo.com/addresses

[As partes desta mensagem que não continham texto foram removidas]



Res: [delphi-br] Ponteiro - Ajuda

2008-10-29 Por tôpico Andresa Ferreira
Oi João

Então, eu uso delphi7 e não achei a opçao Debug Units, porém achei Debug DCUs. 
Qdo dei CTRL+F3 apareceu a mensagem anexa.

Sabe João, eu nunca tinha usado ponteiros antes, e não tô gostando 
srsrssrrs Teria um meio de eu fazer esse processo sem usar ponteiros

Preciso muito finalizar esse menu.

Grata,
Andresa





De: Joao Morais [EMAIL PROTECTED]
Para: delphi-br@yahoogrupos.com.br
Enviadas: Terça-feira, 28 de Outubro de 2008 18:34:02
Assunto: Re: [delphi-br] Ponteiro - Ajuda


2008/10/28 Andresa Ferreira andresa_delphi@ yahoo.com. br:
 Oi João.

 Mas o que eu devo fazer
 Coloquei o Dispose no final do processo, mas ocorre o mesmo problema.

 Não sei mais o que fazer...

 Me ajuda ;)

Ligue as informações de debug do seu projeto. Vá também em Project |
Options | Compiler | ligue Use Debug Units. Dê um build all.

Logo que o erro ocorrer, vá até a IDE e pressione Ctrl+F3. Se você
tiver sorte, irá parar no ponto exato em que ocorreu a exceção. Isso
pode te dar uma pista. Usar FastMM com FullDebugMode habilitado
aumentam suas chances.

Com esta informação você terá uma pista do que é, e por consequência
do que você terá que fazer.

Joao Morais
 


  Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua 
cara @ymail.com ou @rocketmail.com.
http://br.new.mail.yahoo.com/addresses

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Ponteiro - Ajuda

2008-10-29 Por tôpico Joao Morais
2008/10/29 Andresa Ferreira [EMAIL PROTECTED]:
 Oi João

 Então, eu uso delphi7 e não achei a opçao Debug Units, porém achei Debug DCUs.
 Qdo dei CTRL+F3 apareceu a mensagem anexa.

A lista não aceita anexos. Passa um link com a imagem ou transcreve o
local aonde o código parou.

Estive analisando um pouco mais detalhadamente seu código, você
utiliza SetLength com base em um RecordCount. Quem te garante que o
recordcount retornou a quantidade correta de registros? Se você tentar
acessar um elemento além do tamanho do array, você terá um AV também.
Execute a rotina passo a passo (coloque um breakpoint no setlength) e
veja se ao menos a sua rotina chega até o fim, do contrário, diga qual
foi a linha em que ela parou.

 Sabe João, eu nunca tinha usado ponteiros antes, e não tô gostando 
 srsrssrrs Teria
 um meio de eu fazer esse processo sem usar ponteiros

Eu acho que não. Você poderia usar objetos, mas teria que se preocupar
em alocar e desalocar da mesma forma.

Joao Morais


[delphi-br] Ponteiro - Ajuda

2008-10-28 Por tôpico Andresa Ferreira
Bom dia a todos.

Estou fazendo um menu treeview para meu sistema. Fiz o código mostrado abaixo. 
Ele executou perfeitamente algumas vezes depois começou dar access violation, 
passei para outra máquina, funcionou umas duas vezes e depois o mesmo erro. 
Acredito que seja algum problema de memória, mas não consigo corrigir. Alguém 
poderia me ajudar?

Desde já agradeço.

Código:
  TMenu = Record
    iId_Nivel: Integer;
    sDs_Opcao: String;
    iId_Nivel_Ch: Integer;
//    sNm_Form: String;
  end;
  pMenu = ^TMenu;

procedure TfrmMenuModulos.FormCreate(Sender: TObject);
var
  Menu: pMenu;
  sTexto: String;
  tnInd: TTreeNode;
  aNode: Array of TTreeNode;
  i: Integer;
begin
  inherited;
  VerificaQuery;
  if LoginUsuario then
    Inicializa_Menu;
  All_QryAux.Close;
  All_QryAux.SQL.Clear;
  All_QryAux.SQL.Add(' SELECT ID_NIVEL,');
  All_QryAux.SQL.Add('    DS_OPCAO,');
  All_QryAux..SQL.Add('    ID_NIVEL_CHAMAR,');
  All_QryAux.SQL.Add('    NM_FORM');
  All_QryAux.SQL.Add('   FROM CTRL_MENU');
  All_QryAux.SQL.Add('  WHERE ID_PROJETO = ' + IntToStr(dmDataBase.id_Projeto));
  All_QryAux.SQL.Add('    AND ID_MODULO  = ' + IntToStr(dmDataBase.id_Modulo));
  All_QryAux.SQL.Add('  ORDER BY ID_NIVEL, ID_ITEM');
  All_QryAux.Open;
  i := 0;
  tvMenu.Items.Clear;
  SetLength(aNode, All_QryAux.RecordCount);
  All_QryAux.First;
  While not All_QryAux.Eof do
  begin
    New(Menu);
    Menu^.iId_Nivel    := All_QryAux.FieldByName('ID_NIVEL').AsInteger;
    Menu^.sDs_Opcao    := All_QryAux.FieldByName('DS_OPCAO').AsString;
    Menu^.iId_Nivel_Ch := All_QryAux.FieldByName('ID_NIVEL_CHAMAR').AsInteger;
//    Menu^.sNm_Form := All_QryAux.FieldByName('NM_FORM').AsString;
    sTexto := Trim(All_QryAux.FieldByName('DS_OPCAO').AsString);
    If All_QryAux.FieldByName('ID_NIVEL').AsInteger = 1 then
  aNode[i]:= tvMenu.Items.AddObject(Nil, sTexto, Menu)
    else
    begin
  tnInd := IndiceHie(Menu);
  aNode[i] := tvMenu.Items.AddChildObject(tnInd, sTexto, Menu);
    end;
    Inc(i);
    All_QryAux.Next;
    Dispose(Menu);
  end;
  For i := Low(aNode) to High(aNode) do
    If aNode[i]  Nil then
  aNode[i].Expanded:= True;
  tvMenu.FullCollapse;
end;
function TfrmMenuModulos.IndiceHie(p_Hie: pMenu): TTreeNode;
Var
  i: Integer;
begin
  Result:= Nil;
  For i := 0 to tvMenu.Items.Count do
  begin
    If (pMenu(tvMenu.Items[i].Data)^.iId_Nivel_Ch = p_Hie^.iId_Nivel) then
    begin
  Result:= tvMenu..Items[i];
  Break;
    end;
  end;
end;



  Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua 
cara @ymail.com ou @rocketmail.com.
http://br.new.mail.yahoo.com/addresses

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Ponteiro - Ajuda

2008-10-28 Por tôpico Joao Morais
2008/10/28 Andresa Ferreira [EMAIL PROTECTED]:
 Bom dia a todos.

Boa tarde,

 ... depois começou dar access violation,

 Código:
   TMenu = Record
 iId_Nivel: Integer;
 sDs_Opcao: String;
 iId_Nivel_Ch: Integer;
 //sNm_Form: String;
   end;
   pMenu = ^TMenu;

Saudade de ponteiros.

 ...
   While not All_QryAux.Eof do
   begin
 New(Menu);
 Menu^.iId_Nivel:= All_QryAux.FieldByName('ID_NIVEL').AsInteger;
 Menu^.sDs_Opcao:= All_QryAux.FieldByName('DS_OPCAO').AsString;
 Menu^.iId_Nivel_Ch := All_QryAux.FieldByName('ID_NIVEL_CHAMAR').AsInteger;
 //Menu^.sNm_Form := All_QryAux.FieldByName('NM_FORM').AsString;
 sTexto := 
 Trim(All_QryAux.FieldByName('DS_OPCAO').AsString);
 If All_QryAux.FieldByName('ID_NIVEL').AsInteger = 1 then
   aNode[i]:= tvMenu.Items.AddObject(Nil, sTexto, Menu)
 else
 begin
   tnInd := IndiceHie(Menu);
   aNode[i] := tvMenu.Items.AddChildObject(tnInd, sTexto, Menu);
 end;
 Inc(i);
 All_QryAux.Next;
 Dispose(Menu);

Não olhei detalhes do código, mas esse dispose tá estranho. Você está
liberando memória e mantém uma referência para ela atravês do
treeview. O treeview não vai tirar uma cópia dos dados, mas manter um
ponteiro à área que você alocou. Você tem que dar dispose só depois de
não precisar mais dessa área.

A propósito, quando trabalhar com alocação dinâmica, procure manter um
gerenciador de memória ativo e em modo debug. Ele apresenta a você
tanto corrupção quanto vazamentos.

Joao Morais


Res: [delphi-br] Ponteiro - Ajuda

2008-10-28 Por tôpico Andresa Ferreira
Oi João.

Mas o que eu devo fazer
Coloquei o Dispose no final do processo, mas ocorre o mesmo problema.

Não sei mais o que fazer...

Me ajuda ;)

Andresa





De: Joao Morais [EMAIL PROTECTED]
Para: delphi-br@yahoogrupos.com.br
Enviadas: Terça-feira, 28 de Outubro de 2008 14:08:35
Assunto: Re: [delphi-br] Ponteiro - Ajuda


2008/10/28 Andresa Ferreira andresa_delphi@ yahoo.com. br:
 Bom dia a todos.

Boa tarde,

 ... depois começou dar access violation,

 Código:
 TMenu = Record
 iId_Nivel: Integer;
 sDs_Opcao: String;
 iId_Nivel_Ch: Integer;
 // sNm_Form: String;
 end;
 pMenu = ^TMenu;

Saudade de ponteiros.

 ...
 While not All_QryAux.Eof do
 begin
 New(Menu);
 Menu^.iId_Nivel := All_QryAux.FieldByN ame('ID_NIVEL' ).AsInteger;
 Menu^.sDs_Opcao := All_QryAux.FieldByN ame('DS_OPCAO' ).AsString;
 Menu^.iId_Nivel_ Ch := All_QryAux.FieldByN ame('ID_NIVEL_ CHAMAR'). AsInteger;
 // Menu^.sNm_Form := All_QryAux.FieldByN ame('NM_FORM' ).AsString;
 sTexto := Trim(All_QryAux. FieldByName( 'DS_OPCAO' ).AsString) ;
 If All_QryAux.FieldByN ame('ID_NIVEL' ).AsInteger = 1 then
 aNode[i]:= tvMenu.Items. AddObject( Nil, sTexto, Menu)
 else
 begin
 tnInd := IndiceHie(Menu) ;
 aNode[i] := tvMenu.Items.. AddChildObject( tnInd, sTexto, Menu);
 end;
 Inc(i);
 All_QryAux..Next;
 Dispose(Menu) ;

Não olhei detalhes do código, mas esse dispose tá estranho. Você está
liberando memória e mantém uma referência para ela atravês do
treeview. O treeview não vai tirar uma cópia dos dados, mas manter um
ponteiro à área que você alocou. Você tem que dar dispose só depois de
não precisar mais dessa área.

A propósito, quando trabalhar com alocação dinâmica, procure manter um
gerenciador de memória ativo e em modo debug. Ele apresenta a você
tanto corrupção quanto vazamentos.

Joao Morais
 


  Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua 
cara @ymail.com ou @rocketmail.com.
http://br.new.mail.yahoo.com/addresses

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Ponteiro - Ajuda

2008-10-28 Por tôpico Joao Morais
2008/10/28 Andresa Ferreira [EMAIL PROTECTED]:
 Oi João.

 Mas o que eu devo fazer
 Coloquei o Dispose no final do processo, mas ocorre o mesmo problema.

 Não sei mais o que fazer...

 Me ajuda ;)

Ligue as informações de debug do seu projeto. Vá também em Project |
Options | Compiler | ligue Use Debug Units. Dê um build all.

Logo que o erro ocorrer, vá até a IDE e pressione Ctrl+F3. Se você
tiver sorte, irá parar no ponto exato em que ocorreu a exceção. Isso
pode te dar uma pista. Usar FastMM com FullDebugMode habilitado
aumentam suas chances.

Com esta informação você terá uma pista do que é, e por consequência
do que você terá que fazer.

Joao Morais