← →
2Wish
(2006-01-18 18:38)
[0]
for i:= ControlCount - 1 downto 0 do
if controls[i] is TImage then
if (controls[i] as TImage).tag <> 0 then
begin
if (Controls[i] as TImage).Left = m.Left then
if (Controls[i] as TImage).Top = m.Top + 64 then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left then
if (Controls[i] as TImage).Top = m.Top - 64 then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left - 64 then
if (Controls[i] as TImage).Top = m.Top then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left + 64 then
if (Controls[i] as TImage).Top = m.Top then (controls[i] as TImage).Free;
end;
Здаствуйте, подскажите пожалуйста, что мне делать, это мой код, свою работу он выполнает, но почему-то вызывает Abstarct Error. У меня собственно два вопроса:
1. Что значит этот Abstarct Error? (В хелпе к Delphi ничего про него нет.)
2. Как от него избавится?
← →
Джо ©
(2006-01-18 18:45)
[1]
> 1. Что значит этот Abstarct Error? (В хелпе к Delphi ничего
> про него нет.)
EAbstractError is the exception class for attempts to call an abstract method.
Unit
SysUtils
Description
EAbstractError is raised when an application tries to call an Object Pascal abstract method. It is also raised at design time when a component with an Object Pascal abstract method is placed on a form.
Abstract methods are declared with the abstract directive and must be overridden in descendant classes before an instance object can be created.
(c) Delphi Help.
← →
TUser ©
(2006-01-18 18:50)
[2]
> Что значит этот Abstarct Error?
Вызов абстрактного метода.
Твой код будет делать следующее — как только первый раз вызовется Free имедж будет удален из списка контролов и контрол i — это бцудет уже другой контрол. А ты обратишся уже к нему, как к TImage. Точнее, as сначала проверит, а потом уже обратится.
правильно сделать так
i:=COntrols.Count-1;
while (i > 0) do begin
Image:=TImage(Constrols[i]);
// теперь можно работать с интересующим тебя контролом
if Image.Left = … then
if Image.Top = … then begin
Image.Free;
inc (i);
Continue;
end;
….
dec (i);
end;
← →
2Wish
(2006-01-18 19:12)
[3]
2TUser
За разъяснее спасибо, но вот код жалко не работает, программа зависает =(
← →
begin…end ©
(2006-01-18 19:18)
[4]
> 2Wish (18.01.06 18:38)
> это мой код, свою работу он выполнает, но почему-то вызывает
> Abstarct Error.
В каком месте?
← →
2Wish
(2006-01-18 19:34)
[5]
Этого я не знаю, отладчик не заходит — просто Abstarct Error. Наверно когда он первый раз обращается к Image»у, то есть вот тут: if (Controls[i] as TImage).Left = m.Left then
← →
begin…end ©
(2006-01-18 19:40)
[6]
> 2Wish (18.01.06 19:34) [5]
> Этого я не знаю, отладчик не заходит — просто Abstarct Error.
Как это — «не заходит»? Поставьте контрольную точку, пошагово выполняйте до появления исключения.
Мне, например, не совсем ясно, как этот код может вызвать EAbstractError.
← →
2Wish
(2006-01-18 20:11)
[7]
«не заходит» это очепятка, имелось ввиду не находит.
поставил в коде операторы Showmessage и начал следить за происходящим:
оказалось абстрактная ошибка произходит в самом конце процедуры, после всех операторов, причем ошибка возникает только если в конце кода стоит m.free;
, когда я создавал топиг я не придал значения этому оператору и даже не скопировал его. тогда новый вопрос: почему освобождение из памяти переменной M: TImage может вызывать абстракную ошибку.
← →
TUser ©
(2006-01-18 20:16)
[8]
inc (i) я там зря написал
← →
Гаврила ©
(2006-01-18 20:30)
[9]
В первоначальном варианте везде замениthen (controls[i] as TImage).Free;
наthen
begin
controls[i].Free;
Continue;
end;
← →
2Wish
(2006-01-18 20:37)
[10]
повторяю: «оказалось абстрактная ошибка произходит в самом конце процедуры, после всех операторов, причем ошибка возникает только если в конце кода стоит m.free;, когда я создавал топиг я не придал значения этому оператору и даже не скопировал его. тогда новый вопрос: почему освобождение из памяти переменной M: TImage может вызывать абстракную ошибку.» В верхнем коде ничего менять не надо.
← →
Плохиш ©
(2006-01-18 21:11)
[11]
> 2Wish (18.01.06 20:37) [10]
Долго смотрел на код, так и не понял, что это за фигня такая «m». Да и по фиг мне, если кто-то отладчиком пользоваться не умеет, то это сугубо его личная проблема. А гадать какое ещё дерьмо из кода здесь не приведено совершенно не интересно.
← →
2Wish
(2006-01-18 22:46)
[12]
2Плохиш
«что это что это за фигня такая «m»» не имеет принципиального значения, хоть какие нить кнопка, хоть название формы.
На один пост выше написанно, «что это что это за фигня такая «m»». Если тебе влом пречитать посты выше, но очень хочется обосрать кого нить — думаю ты выбрал не тот форум.
зы. Вопрос остаётся открытым, выкладываю полный код процедуры:
private
m: TImage;
...
var i:integer
begin
for i:= ControlCount - 1 downto 0 do
if controls[i] is TImage then
if (controls[i] as TImage).tag <> 0 then
begin
if (Controls[i] as TImage).Left = m.Left then
if (Controls[i] as TImage).Top = m.Top + 64 then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left then
if (Controls[i] as TImage).Top = m.Top - 64 then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left - 64 then
if (Controls[i] as TImage).Top = m.Top then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left + 64 then
if (Controls[i] as TImage).Top = m.Top then (controls[i] as TImage).Free;
end;
m.free;
end;
Почему строчка m.free;
вызывает Abstract Error???
← →
Плохиш ©
(2006-01-18 22:59)
[13]
> Почему строчка m.free; вызывает Abstract Error???
Можно увидеть как «m» создаётся? Надоело клещами всё вытягивать.
← →
2Wish
(2006-01-18 23:00)
[14]
m:=(Sender as TImage);
← →
EvS
(2006-01-18 23:07)
[15]
private
m: TImage;
…
m.free;
Ты процедуре компонент создаешь что-ли?
Если нет зачем .free?
← →
Verg ©
(2006-01-18 23:10)
[16]
> Почему строчка m.free; вызывает Abstract Error???
Варинтов тьма.
Например:
Потому, что к этому моменту m содержит «мусор», уже уничтоженный объект.
Где в коде m := ***.Create ?
Когда тя спрашивают «кто такой m», кроме всего имеется ввиду еще и «откуда он взялся, этот m?»
← →
2Wish
(2006-01-18 23:34)
[17]
Нет, он не пустой и содержит именно тот объект который нужен, вся процедура работает зачетально, но ошибка вылазит все равно. Выберает эту переменную М сам юзер, так что получаем её вот таким образом m:=(Sender as TImage);
← →
Verg ©
(2006-01-19 00:38)
[18]
> Выберает эту переменную М сам юзер, так что получаем её
> вот таким образом m:=(Sender as TImage);
Что мешает «юзеру выбрать переменную M» дважды?
← →
Германн ©
(2006-01-19 01:34)
[19]
Понятия не имею причём тут AbstractError, но лично меня крайне смущает то, что во-первых:
> m:=(Sender as TImage);
, а во-вторых:
> m.free;
> end;
>
> Почему строчка m.free; вызывает Abstract Error???
Имхо, «на лице» попытка уничтожить объект из его собственного обработчика.
← →
TUser ©
(2006-01-19 07:32)
[20]
> Гаврила © (18.01.06 20:30) [9]
+ все-таки for на while
← →
StriderMan ©
(2006-02-13 18:08)
[21]
> правильно сделать так
> i:=COntrols.Count-1;
> while (i > 0) do begin
>…..
> inc(i);
Этот цикл будет крутиться бесконечно! i увеличивается.
Abstract error что это
kostya04 |
|
||
|
bear |
|
||
Профиль Репутация: нет |
|||
|
Fedor |
|
||
Днепрянин Профиль Репутация: нет |
|||
|
[/B], ‘); return false;» title=»Вставить ник в поле ввода»> |
|
||
Око кары:) Профиль Репутация: 44 |
|||
|
Illusion Dolphin |
|
||
Эксперт Профиль Репутация: 36
Если бы только тогда . ПО своему опыту знаю, что эту ошибку получить можно различными путями, и она иногда чем-то схожа по характеру с Acces violation. Morpheus прав — это или ты неправильно где-то с классами работаешь, или что-то с памятью делаешь не очень верное, однозначно тут сказать нельзя, т.к. кода нет. kostya04, так что борись с этой проблемой внимательным анализом всего кода, особенно где создаёшьразрушаештиспользуешь динамически классы и юзаешь память. |
|||
|
Guest |
|
||
|
Rennigth |
|
||||
Эксперт Профиль Репутация: 49
1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.
[ Время генерации скрипта: 0.1034 ] [ Использовано запросов: 21 ] [ GZIP включён ] Источник Читайте также: Prology mpa 700 прошивка Adblock |
Этот java.lang.AbstractMethodError обычно генерируется, когда мы пытаемся вызвать абстрактный метод. Обычно эта ошибка выявляется во время компиляции, если эта ошибка генерируется во время выполнения, класс должен быть несовместим (несовместим с существующими классами). ) Изменено. Но это подкласс ошибки IncompatibleClassChange.
Мы знаем, что абстрактный метод не может быть вызван, и если мы попытаемся это сделать, вы получите ошибку во время компиляции. Так что вы можете подумать, как эта ошибка генерируется во время выполнения ?.
Причина – двоичная несовместимость – что это значит?
Всякий раз, когда класс изменяется, другие классы, которые ссылаются на этот (измененный) класс, не будут знать об изменениях, сделанных в нем. Поэтому все классы должны быть скомпилированы как единое целое. Если нет, то вы можете столкнуться с одним из подклассов несовместимой ошибки изменения класса.
« Эта ошибка указывает на то, что вызываемый вами метод теперь преобразуется в абстрактный метод».
см. следующий пример, чтобы иметь представление об этой ошибке
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 |
|
Выход:
1 2 3 4 |
|
Теперь я собираюсь преобразовать метод display () как абстрактный метод и скомпилировать его самостоятельно.
1 2 3 4 |
|
Выход:
01 02 03 04 05 06 07 08 09 10 11 |
|
Как видите, причина того, что это исключение выдается во время выполнения, состоит в том, что я не скомпилировал классы в целом. Поэтому, когда вы вносите изменения в существующие классы, убедитесь, что вы скомпилировали классы в целом.
Следовательно, не рекомендуется преобразовывать метод в абстрактный метод в классах, которые распространяются. Чаще всего такого рода ошибки возникают, когда вы используете стороннюю библиотеку в своем приложении.
Если эта ошибка не отображается во время компиляции, даже если вы компилируете ее как целый пакет, вам необходимо проверить настройки библиотеки и пути к классам.
Поскольку компилятор обычно ищет классы в системных библиотеках, таких как библиотеки начальной загрузки и библиотеки расширений, также в текущем каталоге, но JVM ищет классы в указанном пути к классам.
Если вы случайно поместили старую версию в системные библиотеки, а новую версию – в путь к классам, вы не будете уведомлены об этой ошибке, даже если вы скомпилируете ее как целый пакет.
Поэтому убедитесь, что настройки, относящиеся к старому пакету, были удалены.
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan |
Поиск: |
|
Опции темы |
kostya04 |
|
||
Unregistered
|
Помогите при закрытия приложения выскакивает Abstract Error, не могу понять почему. И вообще, что такое Abstract Error и как с ним бороться. Может подскажите где по этому вопросу взять литературу. |
||
|
|||
bear |
|
||
Новичок Профиль Репутация: нет
|
Посмотрел Делфийский хелп что-то нет такого сообщения об ошибке. |
||
|
|||
Fedor |
|
||
Днепрянин Профиль
Репутация: нет
|
Может ты какие-нибудь ручками созданные компоненты не освобождаешь… Или там например базу не закрываешь… В общем, не подчищаешь в памяти следы своей работы… ——————— Мы — Днепряне. Мы всех сильней. |
||
|
|||
<Spawn> |
|
||
Око кары:) Профиль
Репутация: 44
|
Это сообщение генериться, насколько я знаю, при попытке использовать абстракный метод класса(с директивой abstract). Так делать нельзя — нужно создать наследника класса и реализовать в нем этот абстрактный метод. Смотри реализацию своих классов. ——————— «Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать» — Николай Безруков. |
||
|
|||
Illusion Dolphin |
|
||
Эксперт Профиль Репутация: 36
|
Если бы только тогда ——————— В мире всего две бесконечности: вселенная и человеческая глупость… На счёт вселенной я не уверен. |
||
|
|||
Guest |
|
||
Unregistered
|
Сию ошибку можно получить при работе с TStings, TStringList и т.д. |
||
|
|||
Rennigth |
|
||
Эксперт Профиль
Репутация: 49
|
Я такую ошибку получал когда удалял компонент из егоже обработчика , т.е. например на клик label1 ->> label1.free; обойти можно, например удалять в postmessage. ——————— (* Honesta mors turpi vita potior *) |
||
|
|||
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
Ошибка ‘Abstract Error’
, Возникает при пересылке
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Подскажите, плиз, в чем проблема. Вываливается «Абстрактная ошибка»… procedure ListFileDir(Path: string; FileList: TStrings); var SR: TSearchRec; begin if FindFirst(Path + ‘*.*’, faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin if (sr.Attr and faDirectory)<>0 then FileList.Add(‘+ папка ‘+SR.Name) else if (sr.Attr and faHidden)<>0 then FileList.Add(‘ — файл ‘+SR.Name+’ размер: ‘+inttostr(SR.Size)+’байт — скрытый’) else if (sr.Attr and faSysFile)<>0 then FileList.Add(‘ — файл ‘+SR.Name+’ размер: ‘+inttostr(SR.Size)+’байт — системный’) else FileList.Add(‘ — файл ‘+SR.Name+’ — ‘+inttostr(SR.Size)); end; until FindNext(SR) <> 0; FindClose(SR); end; end; var subdirs: TStrings; separ: ‘#10’; if copy(sub_str,1,i-1)=’dirlist’ then begin sub_str:=copy(s,i+3,length(s)-i+3); // здесь идет значение, например ‘C:’ subdirs:= TStrings.Create; ListFileDir(sub_str, subdirs); subdirs.Insert(0,’dirlist’+separ); // #10 — разделитель в строке memStr:= TMemoryStream.Create; memStr.Position:=0; subdirs.SaveToStream(memStr); memStr.Position:=0; Socket.SendStream(memStr); // здесь отправляется на клиент … end … но почему то происходит ошибка ‘Abstract Error’ на стороне сервера. |
Яичница |
|
Full Member Рейтинг (т): 43 |
Замените TStrings на TStringList. var subdirs: TStringList; …………………… subdirs:= TStringList.Create; …………………………… end Цитата … но почему то происходит ошибка ‘Abstract Error’ на стороне сервера. …. дык…» TStrings contains abstract methods and should not be directly instantiated.»(с) Сообщение отредактировано: Тестировщица — 13.12.05, 05:38 |
Rouse_ |
|
Moderator Рейтинг (т): 320 |
Достаточно вот этой строчки: subdirs:= TStringList.Create; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Сетевое программирование
- Следующая тема
[ Script execution time: 0,0260 ] [ 16 queries used ] [ Generated: 12.02.23, 22:01 GMT ]