Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];

Вниз

В WinApi приложении выходит такая ошибка не могу понять почему   Найти похожие ветки 

 
AlexG   (2003-01-21 07:13) [0]

В WinApi приложении выходит такая ошибка не могу понять почему

Application Error
Exception EAccessViolation in module Phone.exe at 0003E966.
Access violation at address 0043E966 in module "Phone.exe". Read of address 00000058.

пример моего кода после отработки которого возникает такая
ошибка

if (Lp = ED) and (HiWord(Wp) = EN_CHANGE) then
begin
GetWindowText(Ed,e,255);
DM.ClientDataSet1.FindNearest([e]);


 
Digitman   (2003-01-21 08:22) [1]

какая строчка конкретно вызывает исключение ?


 
Демонов Е.В.   (2003-01-21 09:30) [2]

а так делал GetMem(e,255);


 
AlexG   (2003-01-21 11:29) [3]

Ни та ни другая - привожу весь код


program Phone;

uses
Windows,
Messages,
CommCtrl,
DMod in "DMod.pas" {DM: TDataModule};

var
Wc: TWndClassEx;
MainWnd, Ed, Cb, LV: HWND;
Mesg: TMsg;
e,c: Array[0..255] of Char;
i: Integer;


procedure AddRecord(rec1,rec2,rec3: PAnsiChar);
var
LI, LI2, LI3: LV_ITEM;
begin
with LI do
begin
mask := LVCF_TEXT;
iItem := 0;
iSubItem := 0;
end;
ListView_InsertItem(LV,LI);
ListView_SetItemText(LV,0,0,rec1);

with LI2 do
begin
mask := LVCF_TEXT;
iItem := 0;
iSubItem := 1;
end;
ListView_InsertItem(LV,LI2);
ListView_SetItemText(LV,0,1,rec2);

with LI3 do
begin
mask := LVCF_TEXT;
iItem := 0;
iSubItem := 2;
end;
ListView_InsertItem(LV,LI3);
ListView_SetItemText(LV,0,2,rec3);
end;


procedure LoadRecords;
var
i : Integer;
a,a1,a2: String;
begin
ListView_DeleteAllItems(LV);
with DM.ClientDataSet1 do
begin
MoveBy(26);
for i := 1 to 27 do
begin
a := FieldByName("phone").asString;
a1 := FieldByName("name").asString;
a2 := FieldByName("adres").asString;
AddRecord(PAnsiChar(a),PAnsiChar(a1),PAnsiChar(a2));
Prior;
end;
end;
end;


function WindowProc(wnd:HWND; Msg: Integer; Wp: WParam; Lp: LParam): LResult; stdcall;
begin
case msg of
wm_destroy:
begin
PostQuitMessage(0);
Exit;
Result := 0;
end;
wm_command:
begin
if (Lp = ED) and (HiWord(Wp) = EN_CHANGE) then
begin
GetWindowText(Ed,e,255);
DM.ClientDataSet1.FindNearest([e]);
// LoadRecords;
end;
if (Lp = Cb) and (HiWord(Wp) = CBN_CLOSEUP) then
begin
GetWindowText(Cb,c,255);
case c[0] of
"


 
AlexG   (2003-01-21 14:53) [4]

Может быть эта ошибка происходит из за того что я использую в WinApi приложении DataModul и ClietDataSet а этого делать нельзя?


 
Digitman   (2003-01-21 15:55) [5]


> Access violation at address 0043E966 in module "Phone.exe"


Запусти приложение под отладчиком, выбери меню "Search | Find errors ..", введи значение 0043E966, отладчик покажет строчку, вызвавшую ошибку. О результатах расскажешь.
А проверять весь текст на предмет "плюх" ну нет никакого желания, если ты сам даже не сподобился локализовать строчку с ошибкой, а уж затем спрашивать, мол, почему и что в этой строчке не так


 
AlexG   (2003-01-22 09:19) [6]

Я даже и не знал что можно найти так строчку с ошибкой, спасибо за совет. Нашел строчку

вот она

DM.ClientDataSet1.FindNearest([e]);


 
Digitman   (2003-01-22 09:36) [7]

ну-ка вот так попробуй :

var
e: String;

...
SetLength(e, 255);
GetWindowText(Ed,PChar(e),255);
SetLength(e, StrLen(PChar(e)));
// здесь средствами отладчика проконтролируй значение строки e
with DM.ClientDataSet1 do // здесь нет исключения ?
FindNearest([e]); // а здесь ?


 
AlexG   (2003-01-22 11:23) [8]

Исключение просиходи именно в строке
with DM.ClientDataSet1 do


 
Digitman   (2003-01-22 11:43) [9]

Ну так - дальше поехали !) разбивай строчку-то длинную на более простые конструкции, ищи, где "грабли"

"Граблей" всего-то двое осталось - либо в переменной DM либо в поле ClientDataSet1 - nil/"мусор"

if Assigned(DM) then
begin
try
ShowMessage(DM.Name); // проверяем существование объекта TDataModule
except
on e:EAccessViolation do
showmessage("Нет такого объекта ! Мусор в переменной DM")
end
with DM do
if Assigned(ClientDataSet1) then
try
ShowMessage(ClientDataSet1.Name); // проверяем существование объекта TClientDataSet
except
on e:EAccessViolation do
showmessage("Нет такого объекта ! Мусор в поле DM.ClientDataSet1")
end;
else
showmessage("Нет такого объекта ! в поле DM.ClientDataSet1 - nil");
- nil");

end
else
showmessage("Нет такого объекта ! в переменной DM - nil");






 
AlexG   (2003-01-22 12:03) [10]

Нет обьекта MD - а в чем проблема так и не пойму, почему его нет
если он есть!


 
Digitman   (2003-01-22 13:32) [11]

Я не вижу нигде ни намека на вызов конструктора объекта TDataModule.

Где она, строчка, конструирующая объект TDataModule ? Покажи пальцем...


 
AlexG   (2003-01-22 13:48) [12]

Зачем ему конструктор если он создается в RunTime
а вот определение его модуля
DMod in "DMod.pas" {DM: TDataModule};



 
Digitman   (2003-01-22 15:34) [13]

бред ! без конструирования объект не может начать существовать !

и конструируется он ИМЕННО в run-time !

вот и покажи мне модуль и строчку в нем, где конструирование происходит и переменная DM в результате этого инициализируется ссылкой на этот объект


 
smok_er   (2003-01-22 15:53) [14]

Digitman обсолютно прав.

Например такая строчка:
Application.CreateForm(Tdm, dm) или
dm := Tdm.Create(Application)

есть где-нибудь в проекте?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
14-39570
Дмитрий К.К.
2003-02-27 06:37
2003.03.13
Именинники 27 февраля


1-39256
Silver_
2003-03-03 16:04
2003.03.13
Вставить DBCheckBox в DBGrid


1-39365
aade
2003-03-02 15:30
2003.03.13
Добавление в меню


1-39245
Сергей
2003-03-02 13:14
2003.03.13
Передача параметров


7-39606
Dimedrol
2003-01-14 17:28
2003.03.13
*.prn файл на принтер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский