Форум: "Потрепаться";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизПоиск ошибок Найти похожие ветки
← →
Chubais (2003-01-23 18:31) [0]Вот такой вот у меня вопросик: что за косяки такие могут быть, что ошибки происходят в методах VCL? получаю лог ошибок, смотрю по адресу - а там то в TControl.Perform, то TControl.SetVisible или TField.GetEditText...
8-о
как побороть такую беду?
← →
Chubais (2003-01-23 18:42) [1]вот это я запостил блин... промахнулся))))))))))
← →
smok_er (2003-01-23 19:57) [2]Любая ошибка чем то вызвана :) А ты так говоришь, будто пустой проект с одной формой компилишь и ошибки лезут :)
Исходный код дай какой-то "ошибки".
← →
Chubais (2003-01-24 09:08) [3]smok_er (23.01.03 19:57)
блин...ну ты сказал... откуда мне знать, когда было вызвано TField.GetEditText? ладно бы я запускал в дебаггере, еще можно было что-то придумать, а то программа у юзера такое выдает.
впрочем, могу код привести
TField.GetEditText:
Result := "";
if Assigned(FOnGetText) then
...
push ebx
push esi
mov esi,edx
mov ebx,eax
mov eax,esi
call @LStrClr
cmp word ptr[ebx+$000000d2],$00 вот здесь ошибка
jz +$15
...
ошибка гласит: AV при обращении к адресу 000000d2
наскока я понимаю, в ebx к тому моменту должен лежать адрес этого самого Field, у которого сравнивается значение FOnGetText
почему там оказывается 0, загадка...
может я чо-то неправильно понимаю?
← →
Chubais (2003-01-24 09:23) [4]2 Admin
я конешно все понимаю, но классификация моего вопроса как "потрепаться", рядом с "именинниками 24-го февраля", мне кажется не совсем верной...
← →
Cobalt (2003-01-24 09:43) [5]Малова-то кода. Впечатление такое, что автор забыл, что
FOnGetText - это private properties.
Или это модифицированный код исходинков VCL?
P.S. код совершенно непонятный, к чему он относится, вырван из контекста, который, наверняка, скажет намного больше.
← →
Chubais (2003-01-24 09:48) [6]Cobalt © (24.01.03 09:43)
>>Малова-то кода
открываешь Source\vcl\DB.pas, находишь там
function TField.GetEditText: string;
begin
Result := "";
if Assigned(FOnGetText) then
FOnGetText(Self, Result, False) else
GetText(Result, False);
end;
именно кусок кода, относящийся к ошибке, я и привел
код немодифицированный, самый родной из всех что может быть
← →
Игорь Шевченко (2003-01-24 09:55) [7]Дык, Self нулю равен :-) И все дела...
← →
Chubais (2003-01-24 10:22) [8]Игорь Шевченко © (24.01.03 09:55)
дык ошибка-то вроде на строке if Assigned(FOnGetText)
наскока я понял ей и соответствует cmp word ptr[ebx+$000000d2],$00
до FOnGetText(Self, Result, False) вроде как еще не дошло
даже если Self нулю равен, то как его его метод вызывается?
← →
Mystic (2003-01-24 10:25) [9]В EBX действительно должен быть равно Self, как показывают следующие рассуждения:
1. TField.GetEditText - неявно принимает в регистре EAX этот самый Self.
2. Далее значение EAX сохраняется в EBX
3. По соглашениям Delphi, вызов процедуры/функции не может модифицировать значение регистра EBX, поэтому в EBX остается значение Self.
К сожалению, имхо, приведенного кода недостаточно для того, чтобы определить, почему при вызове GetEditText значение Self равно nil.
← →
Игорь Шевченко (2003-01-24 10:28) [10]Chubais © (24.01.03 10:22)
> даже если Self нулю равен, то как его его метод вызывается?
А что-то запрещает ?
При вызове невиртуального метода генерируется обычный вызов процедуры, а Self передается в качестве параметра. Если внутри метода происходят ссылки на поля этого Self"а, то при равенстве его nil происходит, как у тебя, банальный Access Violation.
А уж почему у тебя поле nil - это я не знаю :-)
← →
Mystic (2003-01-24 10:33) [11]> как его его метод вызывается?
Например, так:
var
F: TField;
begin
F := nil;
ShowMessage(F.Text);
end;
← →
app (2003-01-24 10:38) [12]Chubais © (24.01.03 09:23)
Ты против, только скажи исправим
← →
Chubais (2003-01-24 10:40) [13]
> Mystic © (24.01.03 10:25)
> К сожалению, имхо, приведенного кода недостаточно для того,
> чтобы определить, почему при вызове GetEditText значение
> Self равно nil.
так я больше и не могу привести - не знаю, откуда был вызван этот метод
> Игорь Шевченко © (24.01.03 09:55)
> Дык, Self нулю равен :-) И все дела...
ок, это уяснил
а как быть с остальными ошибками? там тоже какие-то непонятки...
у меня такое ощущение, что я скомпилил прогу с исходниками VCL, а pas не соотвествует dcu...
← →
Игорь Шевченко (2003-01-24 10:42) [14]Chubais © (24.01.03 10:40)
Взять в руки исходники, тщательно просмотреть глазами. Запустить программу под управлением MemProof.
Далее, как обычно...
← →
Anatoly Podgoretsky (2003-01-24 10:42) [15]Chubais © (24.01.03 10:22)
Тебе намекают, что ты объект не создал, именно так и будет в этом случае
← →
Ketmar (2003-01-24 10:47) [16]>Chubais © (24.01.03 10:40)
а что, стэк вызовов моль побила?
Satanas Nobiscum! 24-Jan-XXXVIII A.S.
← →
Chubais (2003-01-24 10:58) [17]
> Ketmar © (24.01.03 10:47)
> >Chubais © (24.01.03 10:40)
> а что, стэк вызовов моль побила?
см:
Chubais © (24.01.03 09:08)
smok_er (23.01.03 19:57)
блин...ну ты сказал... откуда мне знать, когда было вызвано TField.GetEditText? ладно бы я запускал в дебаггере, еще можно было что-то придумать, а то программа у юзера такое выдает.
Anatoly Podgoretsky © (24.01.03 10:42)
ок, понял
> Игорь Шевченко © (24.01.03 10:42)
> Chubais © (24.01.03 10:40)
>
> Взять в руки исходники, тщательно просмотреть глазами. Запустить
> программу под управлением MemProof.
> Далее, как обычно...
попробую...MemProof никогда не пользовал...
← →
Ketmar (2003-01-24 11:01) [18]>Chubais © (24.01.03 10:58)
сорри, не заметил. забираю камень обратно %-))
Satanas Nobiscum! 24-Jan-XXXVIII A.S.
← →
Chubais (2003-01-24 11:09) [19]Ketmar © (24.01.03 11:01)
))))
время собирать камни))))
← →
Anatoly Podgoretsky (2003-01-24 11:25) [20]Chubais © (24.01.03 10:22)
Тебе намекают, что ты объект не создал, именно так и будет в этом случае
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c