Invalid Pointer Operation ao tentar liberar um objeto
Estou tendo o erro de invid pointer operation ao tentar liberar um objeto
este objeto implementa uma interface, e ao finalizar o processo tento liberar este objeto da memoria e da este erro
alguém sabe me dizer como faço pra resolver isso?
obrigado.
este objeto implementa uma interface, e ao finalizar o processo tento liberar este objeto da memoria e da este erro
alguém sabe me dizer como faço pra resolver isso?
obrigado.

Rafael Reis
Curtidas 0
Respostas

Rafael Reis
15/09/2012
alguém ai? estou ficando doido com esse erro. por favor me ajudem
GOSTEI 0

Marco Salles
15/09/2012
Se o objeto implemta uma interface vc não precisa dar free . Ele é desalocado pela contagem de referencia
Uma especie de coletor de lixo caracteristico da utilização de interfaces
Uma especie de coletor de lixo caracteristico da utilização de interfaces
GOSTEI 0

Rafael Reis
15/09/2012
Olá Marcos..
o problema todo é quando eu fecho a aplicação se eu não libero da memória da o erro de invalid pointer operation.
Eu tenho uma tela onde eu tenho uma propriedade do tipo da minha interface.
quando eu abro esta tela eu passo a instancia de um objeto para esta propriedade. funciona perfeitamente. porém qdo eu fecho o programa dispara esta exceção.
preciso saber onde, ou qual objeto eu preciso liberar da memoria para nao ocorrer esse erro novamente..
sabe me dizer qual o caminho eu devo tomar?
muito obrigado pela ajuda.
o problema todo é quando eu fecho a aplicação se eu não libero da memória da o erro de invalid pointer operation.
Eu tenho uma tela onde eu tenho uma propriedade do tipo da minha interface.
quando eu abro esta tela eu passo a instancia de um objeto para esta propriedade. funciona perfeitamente. porém qdo eu fecho o programa dispara esta exceção.
preciso saber onde, ou qual objeto eu preciso liberar da memoria para nao ocorrer esse erro novamente..
sabe me dizer qual o caminho eu devo tomar?
muito obrigado pela ajuda.
GOSTEI 0

Rafael Reis
15/09/2012
Se quiser posso postar o código para você dar uma analisada.
GOSTEI 0
Alisson Santos
15/09/2012
posta o código para nós analisarmos e poder dar uma resposta mais coerente.
GOSTEI 0

Rafael Reis
15/09/2012
Ok,
Pois bem, é o seguinte, eu tenho uma classe de filtro, no qual ela chama uma tela, e essa classe implementa uma interface
essa classe e basicamente isso
TFilter<T> = class(TInterfacedObject, IFilterable)
private
FFieldsFilterList:TList;
FIndex: TList;
FMultiSelect: Boolean;
FScreenName: string;
FDataSet: TClientDataSet;
FOperationType: TOparationTypes;
FTask: string;
procedure SetDataSet(const Value: TClientDataSet);
procedure SetMultiSelect(const Value: Boolean);
procedure SetScreenName(const Value: string);
procedure SetOperationType(const Value: TOparationTypes);
procedure SetTask(const Value: string);
function GetIndexes(index: integer): TIndex;
function _FieldsFilter(index: Integer): TFieldFilter;
function _OperationType: TOparationTypes;
function _Task: string;
function _MultiSelect: Boolean;
function _ScreenName: string;
public
procedure AddField(value:TFieldFilter); overload;
procedure AddField(description, name, value:string;maskType:TMaskTypes; listValue:TStringList); overload;
procedure AddIndex(order:Integer;field,description:String);
function CountFields: integer;
function CountIndexs: integer;
function GetFieldByName(name:string):TFieldFilter;
function GetIndexs: Tlist;
function Filtering(parameters:TParametro):Tlist;
property ScreenName:string read _ScreenName write SetScreenName;
property MultiSelect:Boolean read _MultiSelect write SetMultiSelect;
property FieldsFilter[index:Integer]:TFieldFilter read _FieldsFilter;
property Indexes[index:integer]: TIndex read GetIndexes;
property OperationType:TOparationTypes read _OperationType write SetOperationType;
property Task:string read _Task write SetTask;
class function Execute(fil:TFilter<T>):TList;
constructor Create();
destructor Destroy(); override;
end;
O método execute chama esta outra tela, que é uma tela que auxilia e captura as informações para se efetuar o filtro.
class function TFilter<T>.Execute(fil:TFilter<T>): TList;
var
f: TFilter<T>
i:integer;
fieldFilter:TFieldFilter;
begin
Application.CreateForm(TfrmFilter,frmFilter);
frmFilter.Filter := fil; // essa propriedade Filter e do tipo da interface que a classe Filter implementa
frmFilter.ShowModal;
result := frmFilter.ResultList;
end;
o problema parece estar nas propriedades indexadas, FieldsFilter e Indexes, pois qual eu nao alimento elas, o erro para de ocorrer.
no create da classe eu faço isso:
constructor TFilter<T>.Create;
begin
FFieldsFilterList := TList.Create;
FIndex := TList.Create;
end;
e no destroy eu faço isso
destructor TFilter<T>.Destroy;
var
i:integer;
begin
for I := 0 to FFieldsFilterList.Count-1 do
FFieldsFilterList.Free;
for I := 0 to FIndex.Count-1 do
FIndex.Free;
end;
e o erro sempre aparece quando eu fecho a aplicação. Dispara o invalid pointer operation.
se nao entenderem ou precisarem de mais algum informação para entenderem o código por favor me digam.
desde já agradeço a ajuda.
Pois bem, é o seguinte, eu tenho uma classe de filtro, no qual ela chama uma tela, e essa classe implementa uma interface
essa classe e basicamente isso
TFilter<T> = class(TInterfacedObject, IFilterable)
private
FFieldsFilterList:TList;
FIndex: TList;
FMultiSelect: Boolean;
FScreenName: string;
FDataSet: TClientDataSet;
FOperationType: TOparationTypes;
FTask: string;
procedure SetDataSet(const Value: TClientDataSet);
procedure SetMultiSelect(const Value: Boolean);
procedure SetScreenName(const Value: string);
procedure SetOperationType(const Value: TOparationTypes);
procedure SetTask(const Value: string);
function GetIndexes(index: integer): TIndex;
function _FieldsFilter(index: Integer): TFieldFilter;
function _OperationType: TOparationTypes;
function _Task: string;
function _MultiSelect: Boolean;
function _ScreenName: string;
public
procedure AddField(value:TFieldFilter); overload;
procedure AddField(description, name, value:string;maskType:TMaskTypes; listValue:TStringList); overload;
procedure AddIndex(order:Integer;field,description:String);
function CountFields: integer;
function CountIndexs: integer;
function GetFieldByName(name:string):TFieldFilter;
function GetIndexs: Tlist;
function Filtering(parameters:TParametro):Tlist;
property ScreenName:string read _ScreenName write SetScreenName;
property MultiSelect:Boolean read _MultiSelect write SetMultiSelect;
property FieldsFilter[index:Integer]:TFieldFilter read _FieldsFilter;
property Indexes[index:integer]: TIndex read GetIndexes;
property OperationType:TOparationTypes read _OperationType write SetOperationType;
property Task:string read _Task write SetTask;
class function Execute(fil:TFilter<T>):TList;
constructor Create();
destructor Destroy(); override;
end;
O método execute chama esta outra tela, que é uma tela que auxilia e captura as informações para se efetuar o filtro.
class function TFilter<T>.Execute(fil:TFilter<T>): TList;
var
f: TFilter<T>
i:integer;
fieldFilter:TFieldFilter;
begin
Application.CreateForm(TfrmFilter,frmFilter);
frmFilter.Filter := fil; // essa propriedade Filter e do tipo da interface que a classe Filter implementa
frmFilter.ShowModal;
result := frmFilter.ResultList;
end;
o problema parece estar nas propriedades indexadas, FieldsFilter e Indexes, pois qual eu nao alimento elas, o erro para de ocorrer.
no create da classe eu faço isso:
constructor TFilter<T>.Create;
begin
FFieldsFilterList := TList.Create;
FIndex := TList.Create;
end;
e no destroy eu faço isso
destructor TFilter<T>.Destroy;
var
i:integer;
begin
for I := 0 to FFieldsFilterList.Count-1 do
FFieldsFilterList.Free;
for I := 0 to FIndex.Count-1 do
FIndex.Free;
end;
e o erro sempre aparece quando eu fecho a aplicação. Dispara o invalid pointer operation.
se nao entenderem ou precisarem de mais algum informação para entenderem o código por favor me digam.
desde já agradeço a ajuda.
GOSTEI 0
Alisson Santos
15/09/2012
já tentou fazer um freeandnil ao inves de free???
GOSTEI 0

Rafael Reis
15/09/2012
Puts Alisson, eu estava tentando liberar os objeto da classe filtro de tudo quanto é jeito e nao tinha me atentado em liberar estar propriedades de classe tbm. Realmente era isso. Com o freeandnil, ele esta liberando certinho da memorias essas propriedades. Eu ja tava ficando doido aqui com esse erro, mas agora está OK.
Muito obrigado pela ajuda.
Muito obrigado pela ajuda.
GOSTEI 0

Rafael Reis
15/09/2012
Aproveitando o ensejo,
Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?
estou usando a versao XE2.
obrigado novamente.
Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?
estou usando a versao XE2.
obrigado novamente.
GOSTEI 0
Alisson Santos
15/09/2012
Existe sim.
Existe uma rotina que quando você fecha o formulário ele mostra o vazamento de memória.
https://www.devmedia.com.br/detectando-memory-leaks-em-delphi-win32-com-cnmemprof-e-fastmm4/11146
Verifica se auxilia você.
Existe uma rotina que quando você fecha o formulário ele mostra o vazamento de memória.
https://www.devmedia.com.br/detectando-memory-leaks-em-delphi-win32-com-cnmemprof-e-fastmm4/11146
Verifica se auxilia você.
GOSTEI 0

Marco Salles
15/09/2012
Aproveitando o ensejo,
Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?
estou usando a versao XE2.
obrigado novamente.
Saberia me dizer, se o delphi tem alguma ferramenta para verificar vazamento de memórias?
estou usando a versao XE2.
obrigado novamente.
Nas vesrões novas esta incporpora o FastMm
é so fazero seguinte no dpr na primeira linha antes de inicializar vc digite o seguinte comando
begin
ReportMemoryLeaksOnShutdown:=true;
Application.Initialize;
Mas faltando ao seu problema inicial o que vc pretende com isto ????
destructor TFilter<T>.Destroy; var i:integer; begin for I := 0 to FFieldsFilterList.Count-1 do FFieldsFilterList.Free; for I := 0 to FIndex.Count-1 do FIndex.Free; end;
GOSTEI 0
Alisson Santos
15/09/2012
Obrigado Marcos, por não utilizar em minhas aplicações não sabia muito bem como responder e peguei um link que tinha aqui da devmedia mesmo.
GOSTEI 0

Rafael Reis
15/09/2012
eu nao sei bem como funciona a classe TList do delphi.
Mas pesquisando na internet, algumas pessoas disseram que o interessante seria liberar cada objeto da memoria da lista, como em outras linguagens.
mas pelo visto isso nao funciona muito bem no delphi né? Usando o freeandil na Tlist, eu nao tive problema.
pelo que eu vi, o freeandnil, ele seta nulo no objeto e depois libera da memória.
vc´s aconselham usar sempre o freeandnil?
Mas pesquisando na internet, algumas pessoas disseram que o interessante seria liberar cada objeto da memoria da lista, como em outras linguagens.
mas pelo visto isso nao funciona muito bem no delphi né? Usando o freeandil na Tlist, eu nao tive problema.
pelo que eu vi, o freeandnil, ele seta nulo no objeto e depois libera da memória.
vc´s aconselham usar sempre o freeandnil?
GOSTEI 0

Marco Salles
15/09/2012
eu nao sei bem como funciona a classe TList do delphi.
Mas pesquisando na internet, algumas pessoas disseram que o interessante seria liberar cada objeto da memoria da lista, como em outras linguagens.
mas pelo visto isso nao funciona muito bem no delphi né? Usando o freeandil na Tlist, eu nao tive problema.
pelo que eu vi, o freeandnil, ele seta nulo no objeto e depois libera da memória.
vc´s aconselham usar sempre o freeandnil?
Mas pesquisando na internet, algumas pessoas disseram que o interessante seria liberar cada objeto da memoria da lista, como em outras linguagens.
mas pelo visto isso nao funciona muito bem no delphi né? Usando o freeandil na Tlist, eu nao tive problema.
pelo que eu vi, o freeandnil, ele seta nulo no objeto e depois libera da memória.
vc´s aconselham usar sempre o freeandnil?
Bem vc não esta liberando cada objeto da Lista , vc esta Liberando a Lista e não porsequente os objetos dela estão sendo
liberados
veja este post
http://marcosalles.wordpress.com/2010/02/18/tlist-e-tobjectlist-objetos/
Finalizando . O seu conceito sobre o FreeandNil esta correto porem nen de todo verdade
Veja este post aqui mesmo
https://www.devmedia.com.br/forum/diferenca-entre-free-e-freeandnil/423681
GOSTEI 0

Rafael Reis
15/09/2012
Bem vc não esta liberando cada objeto da Lista , vc esta Liberando a Lista e não porsequente os objetos dela estão sendo
liberados
veja este post
http://marcosalles.wordpress.com/2010/02/18/tlist-e-tobjectlist-objetos/
Finalizando . O seu conceito sobre o FreeandNil esta correto porem nen de todo verdade
Veja este post aqui mesmo
https://www.devmedia.com.br/forum/diferenca-entre-free-e-freeandnil/423681
Bastante interessante.
nesse caso então, como eu uso o TList em uma tela genéricar, eu teria que fazer dessa forma?
destructor TFilter<T>.Destroy; var i:integer; begin for I := 0 to FFieldsFilterList.Count-1 do T(FFieldsFilterList).Free; // Libero cada objeto da lista FreeandNil(FFieldsFilterList) // libero a lista em si end;
GOSTEI 0

Marco Salles
15/09/2012
Sim é isto...
So que usar freeandnil para ambos .. Em algumas das vezes o free tb é suficiente
So que usar freeandnil para ambos .. Em algumas das vezes o free tb é suficiente
GOSTEI 0
Alisson Santos
15/09/2012
Marcos creio que se ele utilizar apenas o free não vai ser liberado o ponteiro da memória, creio que tenha que utilizar o FreeAndNil, pois ele tanto libera o objeto da memória como o ponteiro.
No caso ele não utilizar o Create(Self), sendo assim teria que utilizar o FreeAndNil.
Eu sempre aconselho a utilizar esse comando, pois terá a certeza que o objeto está destruido e limpo a memória.
No caso ele não utilizar o Create(Self), sendo assim teria que utilizar o FreeAndNil.
Eu sempre aconselho a utilizar esse comando, pois terá a certeza que o objeto está destruido e limpo a memória.
GOSTEI 0

Marco Salles
15/09/2012
Marcos creio que se ele utilizar apenas o free não vai ser liberado o ponteiro da memória, creio que tenha que utilizar o FreeAndNil, pois ele tanto libera o objeto da memória como o ponteiro.
No caso ele não utilizar o Create(Self), sendo assim teria que utilizar o FreeAndNil.
Eu sempre aconselho a utilizar esse comando, pois terá a certeza que o objeto está destruido e limpo a memória.
No caso ele não utilizar o Create(Self), sendo assim teria que utilizar o FreeAndNil.
Eu sempre aconselho a utilizar esse comando, pois terá a certeza que o objeto está destruido e limpo a memória.
Ponteiro é apenas algo que aponta para um endereço da memória . Neste endereço pode ter algo aproveitavel ou pode ter lixo
Quando vc utiliza o Freeandnil , vc ao "testar" o ponteiro , vc consegue identificar que este ponteiro aponta para
um endereço inexistente . Mas quem libera Recursos , quem libera memória definitivamente é o Free
faça um simples teste
coloque a instrução ReportMemoryLeaksOnShutdown:=true; no dpr para gerenciar a memória
coloque tres botões e execute separadamente o seguinte evento onclick
coloque
procedure TForm1.Button1Click(Sender: TObject); var lista:TStrings; i:integer; begin for i:=0 to 10 do begin lista:=TStringList.Create; Lista.free; end; end;
procedure TForm1.Button2Click(Sender: TObject); var lista:TStrings; i:integer; begin for i:=0 to 10 do begin lista:=TStringList.Create; FreeAndNil(lista); end; end;
//Aqui sim tem Vazamento de memória
procedure TForm1.Button3Click(Sender: TObject); var lista:TStrings; i:integer; begin for i:=0 to 10 do begin lista:=TStringList.Create; end; end;
GOSTEI 0
Alisson Santos
15/09/2012
Marcos referente aos teste é realmente, mais o que eu queria dizer é que ainda fica com o ponteiro, e o udeal é utilizar o freeandnil para tirar o ponteiro e limpa a memória.
O free realmente faz a limpeza, mais ele não elimina o ponteiro.
O free realmente faz a limpeza, mais ele não elimina o ponteiro.
GOSTEI 0

Deivison Melo
15/09/2012
Podemos dar o tópico como encerrado?
GOSTEI 0

Marco Salles
15/09/2012
Marcos referente aos teste é realmente, mais o que eu queria dizer é que ainda fica com o ponteiro, e o udeal é utilizar o freeandnil para tirar o ponteiro e limpa a memória.
O free realmente faz a limpeza, mais ele não elimina o ponteiro.
O free realmente faz a limpeza, mais ele não elimina o ponteiro.
Olha so , isto não é o caso e nem um pouco tão mais importante . o importante é o free
vou te dar um exemplo
var lista:TStrings; i:integer; begin if lista = nil then showmessage('Mas Eu não estou utilizando o FreeanNil ???'+sLineBreak+ 'Porque este Ponteiro Não foi Limpo ?????'); lista:=TStringList.Create; FreeAndNil(lista); end;
GOSTEI 0
Alisson Santos
15/09/2012
Obrigado pelas explicações, é que eu tinha outro conceito. Mais com o dialogo me deu uma outra visão.
GOSTEI 0
Alisson Santos
15/09/2012
Obrigado pelas explicações, é que eu tinha outro conceito. Mais com o dialogo me deu uma outra visão.
GOSTEI 0

Marco Salles
15/09/2012
claro , nos estamos ai para isto . Mas veja não se pode negar a importancia do freeandNil , devemos tirar proveito dele
veja esta situação
//variavel local fora do evento.. Ok ??
var
Lista:Tstrings;
dentro de um botão
if lista = nil then // tem que cria-la
lista:=TstringList.create;
//Vamos utiliza-la
lista.add('Na segunda Vez vai dar ponteiro Inválido');
showmessage(Lista.Strings[0]);
Lista.free;
end;
Tai um exemplo que devemos utilizar freeandNil ... Não para liberar Recuros , mas para instanciar o objeto , porque
do jeito que esta o Ponteiro vai apontar para um endereço que contem Lixo
depois oara entender o propósito , faça o mesmo teste utilizando o FreeandNil
if lista = nil then // tem que cria-la
lista:=TstringList.create;
//Vamos utiliza-la
lista.add('Na segunda Vez vai dar ponteiro Inválido');
showmessage(Lista.Strings[0]);
Lista.free;
end;
[]sds
veja esta situação
//variavel local fora do evento.. Ok ??
var
Lista:Tstrings;
dentro de um botão
if lista = nil then // tem que cria-la
lista:=TstringList.create;
//Vamos utiliza-la
lista.add('Na segunda Vez vai dar ponteiro Inválido');
showmessage(Lista.Strings[0]);
Lista.free;
end;
Tai um exemplo que devemos utilizar freeandNil ... Não para liberar Recuros , mas para instanciar o objeto , porque
do jeito que esta o Ponteiro vai apontar para um endereço que contem Lixo
depois oara entender o propósito , faça o mesmo teste utilizando o FreeandNil
if lista = nil then // tem que cria-la
lista:=TstringList.create;
//Vamos utiliza-la
lista.add('Na segunda Vez vai dar ponteiro Inválido');
showmessage(Lista.Strings[0]);
Lista.free;
end;
[]sds
GOSTEI 0

Rafael Reis
15/09/2012
Valeu galera, muito obrigado pela ajuda.
pra mim ficou bem claro.
até a próxima
pra mim ficou bem claro.
até a próxima
GOSTEI 0

Rafael Reis
15/09/2012
Pessoal, aproveitando o mesmo assunto.
Eu estou criando um componente, onde o mesmo tem uma propriedade chamada DataSource que é do tipo TList, onde eu passo uma lista de qualquer objeto, e eu o populo lendo esta lista de objeto
sabem me dizer por qual motivo eu não consigo destruir esta lista quando eu destruo o componente? se eu tento destruir o componente, da erro de invalid pointer, se eu não destruo quando fecho a aplicação dá o mesmo erro. Abaixo segue o código fonte do componete.
acho que ainda não entendi muito bem como o delphi trabalha com essa questão de referência de memória.
Se puderem me ajudar mais uma vez, ficarei grato. Obrigado.
Eu estou criando um componente, onde o mesmo tem uma propriedade chamada DataSource que é do tipo TList, onde eu passo uma lista de qualquer objeto, e eu o populo lendo esta lista de objeto
sabem me dizer por qual motivo eu não consigo destruir esta lista quando eu destruo o componente? se eu tento destruir o componente, da erro de invalid pointer, se eu não destruo quando fecho a aplicação dá o mesmo erro. Abaixo segue o código fonte do componete.
acho que ainda não entendi muito bem como o delphi trabalha com essa questão de referência de memória.
Se puderem me ajudar mais uma vez, ficarei grato. Obrigado.
unit RCheckListBox; interface uses System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.CheckLst, Generics.Collections, RTTI; type TRCheckListBox = class(TCheckListBox) private FDescriptionName: String; FMandatoryField: boolean; FDataSource: TList; FPersistentField: boolean; FFieldName: String; FIDName: String; FListValue: TStrings; function GetValue: String; procedure SetDataSource(const Value: TList); procedure SetDescriptionName(const Value: String); procedure SetFieldName(const Value: String); procedure SetIDName(const Value: String); procedure SetMandatoryField(const Value: boolean); procedure SetPersistentField(const Value: boolean); procedure SetValue(const Value: String); procedure SetListValue(const Value: TStrings); { Private declarations } protected { Protected declarations } published property FieldName:String read FFieldName write SetFieldName; property MandatoryField: boolean read FMandatoryField write SetMandatoryField; property PersistentField: boolean read FPersistentField write SetPersistentField; property IDFieldName:String read FIDName write SetIDName; property DescriptionFieldName:String read FDescriptionName write SetDescriptionName; property ListValue: TStrings read FListValue write SetListValue; public property DataSource:TList read FDataSource write SetDataSource; property Value:String read GetValue write SetValue; procedure FindIndexByIDFieldName(idFieldNameValue: string); procedure DataBind; function GetObject<T: class>:T; function GetCheckedObjects: TList; constructor Create(AOwner: TComponent);override; destructor destroy; end; procedure Register; implementation procedure Register; begin RegisterComponents('SIATD', [TRCheckListBox]); end; { TRCheckListBox } constructor TRCheckListBox.Create(AOwner: TComponent); begin inherited; self.FListValue := TStringList.Create; end; procedure TRCheckListBox.DataBind; var i:integer; context: TRttiContext; prop: TRttiProperty; begin self.Clear; if (self.FDataSource <> nil) or (self.FListValue <> nil) then begin if self.FDataSource <> nil then begin for i := 0 to self.FDataSource.Count-1 do begin prop := context.GetType(TObject(self.FDataSource[i]).ClassType).GetProperty(self.FDescriptionName); self.Items.Add(prop.GetValue(TObject(self.FDataSource[i])).ToString); end; end else if self.FListValue <> nil then begin for I := 0 to self.FListValue.Count-1 do begin self.Items.Add(self.FListValue.Names[I]) end; end; if self.Items.Count > 0 then self.ItemIndex := 0; end; end; destructor TRCheckListBox.destroy; var i:integer; begin for I := 0 to FDataSource.Count-1 do ////...>>>> aqui que dá o erro FreeAndNil(TObject(FDataSource[i])) FreeAndNil(FDataSource); inherited Destroy; end; procedure TRCheckListBox.FindIndexByIDFieldName(idFieldNameValue: string); var I:integer; context: TRttiContext; prop: TRttiProperty; begin if Assigned(FDataSource) then begin for i := 0 to FDataSource.Count-1 do begin prop := context.GetType(TObject(FDataSource[i]).ClassType).GetProperty(self.IDFieldName); if Pos(prop.GetValue(TObject(FDataSource[i])).ToString, idFieldNameValue ) > 0 then Self.Checked[I] := true else Self.Checked[I] := false; end; end else begin for I := 0 to self.Items.Count-1 do begin if FListValue.Count > 0 then begin if Pos(self.FListValue.ValueFromIndex[I], idFieldNameValue ) > 0 then Self.Checked[I] := true else Self.Checked[I] := false; end else begin if Pos(self.Items[I], idFieldNameValue ) > 0 then Self.Checked[I] := true else Self.Checked[I] := false; end; end; end; end; function TRCheckListBox.GetCheckedObjects: TList; var i:integer; list:Tlist; begin if FDataSource <> nil then begin list := TList.Create; for i := 0 to FDataSource.Count-1 do begin if self.Checked[I] then list.Add(TObject(DataSource[i])); end; result := list; end else result := nil; end; function TRCheckListBox.GetObject<T>: T; begin if (FDataSource <> nil) and (self.Checked[self.GetItemIndex]) then Result := T(TObject(FDataSource[self.GetItemIndex])); end; function TRCheckListBox.GetValue: String; var ind:integer; context: TRttiContext; prop: TRttiProperty; val: string; I: Integer; begin val := EmptyStr; if Self.FDataSource = nil then begin for I := 0 to self.Items.Count-1 do begin if self.Checked[I] then begin if self.FListValue.Count = 0 then val := val + self.Items[i]+',' else val := val + self.FListValue.ValueFromIndex[I]+','; end; end; System.Delete(val,System.Length(val),1); result := val; end else begin for I := 0 to self.FDataSource.Count-1 do begin if self.Checked[I] then begin prop := context.GetType(TObject(Self.FDataSource[I]).ClassType).GetProperty(self.IDFieldName); val := val + prop.GetValue(TObject(Self.FDataSource[I])).ToString+','; end; end; System.Delete(val,System.Length(val),1); result := val; end; end; procedure TRCheckListBox.SetDataSource(const Value: TList); begin FDataSource := Value; end; procedure TRCheckListBox.SetDescriptionName(const Value: String); begin if FDescriptionName <> Value then FDescriptionName := Value; end; procedure TRCheckListBox.SetFieldName(const Value: String); begin if FFieldName <> Value then FFieldName := Value; end; procedure TRCheckListBox.SetIDName(const Value: String); begin if FIDName <> Value then FIDName := Value; end; procedure TRCheckListBox.SetListValue(const Value: TStrings); begin if FListValue <> Value then FListValue.Assign(Value); end; procedure TRCheckListBox.SetMandatoryField(const Value: boolean); begin if FMandatoryField <> Value then FMandatoryField := Value; end; procedure TRCheckListBox.SetPersistentField(const Value: boolean); begin if FPersistentField <> Value then FPersistentField := Value; end; procedure TRCheckListBox.SetValue(const Value: String); begin self.FindIndexByIDFieldName(Value); end; end.
GOSTEI 0
Alisson Santos
15/09/2012
O que ele retorna para você de informação nessa linha de erro.??
GOSTEI 0

Rafael Reis
15/09/2012
O que ele retorna para você de informação nessa linha de erro.??
então dá este erro de invalid Pointer Operation.
e se eu comento esta parte, o erro ocorre quando eu fecho a aplicação. Conseguir ser claro?
GOSTEI 0

Rafael Reis
15/09/2012
E ai pessoal, ninguém?
GOSTEI 0

Rafael Reis
15/09/2012
O problema todo é quando eu passo essa lista por referencia entre os forms, o Delphi parece que se perde, e não consegue destruir essa lista.
Qual seria a melhor forma de se fazer isso no Delphi?
Por exemplo
eu crio uma lista
lista := Tlist.create;
e passo para um outro form essa lista por referencia
ou seja, form2.lista := lista
ai na hora de destruir ele se perde.
Qual seria a melhor forma de se fazer isso no Delphi?
Por exemplo
eu crio uma lista
lista := Tlist.create;
e passo para um outro form essa lista por referencia
ou seja, form2.lista := lista
ai na hora de destruir ele se perde.
GOSTEI 0

Leonardo Xavier
15/09/2012
Pode ser que não tenha nada a ver... mas ja tentou mudar o i para I, pois já vi muitos erros "estranhos".
var i:integer;//mudar para I//aqui dá o erro. begin for I :
GOSTEI 0