2013-11-28 3 views
-2

У меня есть эта проблема, что я могу решить это, выбросив меня эту ошибку, брат, я нажимаю кнопку, которая вызывает форму Cencillo, выполняющую поиск. Ошибка заключается в следующем.Нарушение прав доступа по адресу 09A878EE в модуле

Сообщение: Нарушение прав доступа по адресу 09A878EE в модуле 'Almacen.pgi'. Читайте по адресу 00000000.

И код кнопки, которая дает мне эту ошибку следующим образом:

procedure TfListaEntregaBodegas.SBBuscarClick(Sender: TObject); 
begin 
    inherited; 
    FBuscarRequisicionBodega := TFBuscarRequisicionBodega.Create(Application); 
    FBuscarRequisicionBodega.dsRequisicionBodega.DataSet:=qListaRequisiciones; 
    FBuscarRequisicion.ShowModal; 
    FBuscarRequisicion.Free; 
    dbgListaRequisiciones.Setfocus; 
end; 
+1

На каком языке это? Я принимаю Delphi из вашей истории вопроса. – Charles

+0

Один из объектов - 'nil'. Используйте отладчик, чтобы узнать, какой из них он есть. –

+0

По крайней мере, 'FBuscarRequisicion' станет свисающим указателем после первого вызова этого метода событий (после первого нажатия кнопки). – TLama

ответ

3

Очевидная проблема находится на комментируемых строки ниже, где вы создаете что-то называется TFBuscarRequisicionBodega и присваивают это переменной с именем FBuscarRequisicionBodega и установить несколько свойств FBuscarRequisicionBodega. Затем вы вызываете ShowModal на совершенно другой переменной по имени FBuscarRequisicion и освободите его после этого. Вы теперь осиротели FBuscarRequisicionBodega (ничто никогда не освобождает его), и в то же время вызвали ShowModal на то, что вы еще не указали для кода (FBuscarRequisicion), и освободили его потом. При повторном нажатии на кнопку затем вызовите ShowModal на то, что вы освободили в последний раз.

Эта проблема кажется довольно ясно обнаружить, даже не читая имена переменных - просто проверить эти две строки кода:

FBuscarRequisicionBodega.dsRequisicionBodega.DataSet:=qListaRequisiciones; 
    FBuscarRequisicion.ShowModal; 

Посмотрите, как переменной длины имен не совпадают? (. не выстраивается в линию, потому что первый имеет шесть букв, чем второй).

Прочитайте имена переменных очень тщательно в коде, который вы опубликовали, и проблема кажется очень ясной. (Две секунды с отладчиком скажут вам наверняка, вы действительно должны научиться его использовать).

procedure TfListaEntregaBodegas.SBBuscarClick(Sender: TObject); 
begin 
    inherited; 

    // You create something and assign it to one variable here. 
    // Set debugger breakpoint on next line (F5, click the grey 
    // gutter to the left of the editor line numbers, or right-click 
    // the line and choose Debug->Toggle Breakpoint, run your app (F9), 
    // and step through the code with F8. 
    FBuscarRequisicionBodega := TFBuscarRequisicionBodega.Create(Application); 
    FBuscarRequisicionBodega.dsRequisicionBodega.DataSet:=qListaRequisiciones; 

    // You then call ShowModal on a totally different variable here, then 
    // free it after ShowModal returns. 
    FBuscarRequisicion.ShowModal; 
    FBuscarRequisicion.Free; 
    dbgListaRequisiciones.Setfocus; 
end; 
Смежные вопросы