Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.011 c
1-28791
Blacked
2003-02-01 01:23
2003.02.10
Как поместить Форму на TabSheet?


4-29176
DDF
2002-12-25 08:33
2003.02.10
Перехват Текста под мышью.


6-28974
Друпи
2002-10-02 23:41
2003.02.10
SMS


3-28610
FrozenHeart
2003-01-23 00:43
2003.02.10
Поля в БД


6-28981
Verner
2002-12-16 15:34
2003.02.10
Локальный порт для клиента TCP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский