Форум: "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