Res: [delphi-br] Ponteiro - Ajuda
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
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 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
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 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
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 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