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

Вниз

То ли лыжи не едут...   Найти похожие ветки 

 
Dimka Maslov ©   (2013-01-11 23:21) [40]


> Аббат Пиккола   (11.01.13 23:16) [38]


Ветвлений нету. И если бы разборщик путался, он бы путался независимо от имени, и выдавал ошибку в другом месте. Выбрасывать код я тоже пытался (в разумных пределах), а также двигать объявление и реализацию по тексту. Ошибка всегда в одном и том же месте.


 
Аббат Пиккола   (2013-01-11 23:21) [41]

Хотя вряд ли это зависело бы от имени класса. Скорее важно было бы расположение объявлений в тексте, если бы дело было в этом. Главное непрятно то, что не ясно, как это локализовывать. Не гадать же в самом деле...


 
Аббат Пиккола   (2013-01-11 23:23) [42]

А если метод Proc переименовать? Не нравится мне это имя чем-то... То же самое?


 
Dimka Maslov ©   (2013-01-11 23:26) [43]


> А если метод Proc переименовать? Не нравится мне это имя
> чем-то... То же самое?


Ои имени метода это тоже не зависит. Изначально там было несколько методов с нормальными именами (пустые методы из класса выше на картинке) и на всех их оно ругалось.


 
Аббат Пиккола   (2013-01-11 23:26) [44]

А если и объявление класса сделать в Implementation?


 
Аббат Пиккола   (2013-01-11 23:28) [45]

Переместить объявление класса из interface в implementation.


 
Dimka Maslov ©   (2013-01-11 23:29) [46]


> А если и объявление класса сделать в Implementation?


Тогда компилирует. Бред какой-то получается.


 
Аббат Пиккола   (2013-01-11 23:31) [47]

Ну хоть как-то набрели на след...


 
Аббат Пиккола   (2013-01-11 23:33) [48]

А если оставить все это в implementation, а в interface добавить только предварительное объявление класса:

TBucklingPlateItem = class;


 
Dimka Maslov ©   (2013-01-11 23:34) [49]


> Ну хоть как-то набрели на след...


След чего? В тексте больше нет нигде и ничего с таким именем.


 
Аббат Пиккола   (2013-01-11 23:36) [50]

След в том смысле, что класс с данным именем может компилироваться, если объявлен в другом месте модуля. Попробовал добавит ЕЩЕ И предварительное объявление (абстрактное) в интерфейсе?

TBucklingPlateItem = class;


 
Dimka Maslov ©   (2013-01-11 23:36) [51]


> А если оставить все это в implementation, а в interface
> добавить только предварительное объявление класса:


А разве так вообще можно? Предварительное описание класса не работает даже если находится в разных type

type
 TC1 = class;
type
 TC1 = class (TObject);

Уже несработает.


 
Аббат Пиккола   (2013-01-11 23:40) [52]

Если ошибка вернется, значит модуль НЕ ЛЮБИТ именно это имя в секции intrerface. Это наталкивает на мысль, что причину проблемы нужно искать за пределами этого файла (в других файлах). Так как переменные в части implementation обычно скрыты от остального проекта (если только их не хакнуть специальными приемами с наследованием). И тогда пофиг, как класс там назван.


 
Dimka Maslov ©   (2013-01-11 23:41) [53]


> След в том смысле, что класс с данным именем может компилироваться,
>  если объявлен в другом месте модуля. Попробовал добавит
> ЕЩЕ И предварительное объявление (абстрактное) в интерфейсе?
>
>


Класс именно с таким именем мне не нужен я его и переименовать могу. Просто хочется понять, что же сделано не так... А предварительное описание попробовал. Не помогло. Пойду спать. Утро вечера мудренее.


 
Аббат Пиккола   (2013-01-11 23:44) [54]

2 Dimka Maslov ©   (11.01.13 23:36) [51]

Ты прав. Это работает только в пределах одного объявления type


 
Аббат Пиккола   (2013-01-11 23:45) [55]

Да я понял. Мне и самому интересно. OK


 
Eraser ©   (2013-01-12 13:09) [56]

А если по-новее делфи поставить или же накатить все имеющиеся апдейты на этот? Просто иной раз как посмотришь на список исправлений в каком-нибудь апдейте.


 
TUser ©   (2013-01-12 13:31) [57]

Я бы попробовал dcc32 или как он там называется. Иногда консольный компилятор может больше сказать, чем IDE.


 
Dimka Maslov ©   (2013-01-12 19:19) [58]


> А если по-новее делфи поставить


Не дают, уже давно прошу


> Иногда консольный компилятор может больше сказать, чем IDE.


А IDE не надстройка ли над консольным, которая транслирует его сообщения?


 
Eraser ©   (2013-01-12 19:36) [59]


> Dimka Maslov ©   (12.01.13 19:19) [58]

ну, допустим, новую версию не дают, а ападейты то текущей версии все установлены?


 
Dimka Maslov ©   (2013-01-12 22:24) [60]


> а ападейты то текущей версии все установлены?


Там автообновлятор работает


 
Dimka Maslov ©   (2013-01-14 12:46) [61]

Корень зла найден. Всё заработало после того, как реализация класса была «поднята» выше метода другого класса, внутри которого объявлялся тип.


procedure TSectionProperties.AfterConstruction;
type
 TSectionShapeClass = class of TSectionShape;
const
 Classes: array[Low(FShapes)..High(FShapes)] of TSectionShapeClass =
   (TISection, TIOrthoSection, TUpperOpenBoxSection, TLowerOpenBoxSection, TBoxSection);
var
 i: Integer;
begin
 inherited;
 for i := Low(FShapes) to High(FShapes) do
   FShapes[i] := Classes[i].Create(Self);
 List.TestNameFunc := nil;
end;



После выноса объявления типа за границы метода всё нормально заработало. Остаётся неясно, почему стало глючить только при таком имени нового класса, ибо ниже нормально уживалась реализация нескольких десятков классов.

Но вывод сделан однозначный: вопреки синтаксической правильности, внутри методов не рекомендуется объявлять типы, иначе оно может дико глючить начать.


 
брат Птибурдукова   (2013-01-14 12:49) [62]


> Classes: array[Low(FShapes)..High(FShapes)] of TSectionShapeClass
Вот за такое нас в институте 100% на пересдачу отправляли… %-)


 
картман ©   (2013-01-14 13:02) [63]


>  брат Птибурдукова   (14.01.13 12:49) [62]

а что не так и как надо было сделать на пересдаче?


 
брат Птибурдукова   (2013-01-14 13:08) [64]

надо было
type
 TSectionShapeClass = class of TSectionShape;
 TSectionShapeClassIndex = Low(FShapes)..High(FShapes);
 TSectionShapeClassArray = array [TSectionShapeClassIndex] of TSectionShapeClass;
const
 Classes: TSectionShapeClassArray =
   (TISection, TIOrthoSection, TUpperOpenBoxSection, TLowerOpenBoxSection, TBoxSection);

Впрочем, мы изучали классический виртовский паскаль, кое-как эмулируемый турбо паскалем ;-)


 
RWolf ©   (2013-01-14 13:11) [65]

а если ещё проще?
Classes: array[FShapes] of TSectionShapeClass;


 
Dimka Maslov ©   (2013-01-14 13:16) [66]


> брат Птибурдукова   (14.01.13 13:08) [64]


К чему плодить лишние сущности, используемые к тому же исключительно локально.


>  RWolf ©   (14.01.13 13:11) [65]


Проблема не из-за const была, а из-за type. А FShapes - это вообще массив. Но дело не в этом.


 
брат Птибурдукова   (2013-01-14 13:19) [67]


> К чему плодить лишние сущности
Для виртовского паскаля они не лишние, если верить преподу. Суть в том, что формально type a=1..10; b=1..10; — разные типы, несовместимые...


> Проблема не из-за const была, а из-за type
А вот не факт...


 
Dimka Maslov ©   (2013-01-14 13:21) [68]


> Для виртовского паскаля они не лишние,


Т.н. «стиль» сам по себе излишество.


> А вот не факт...


Факт. После убирания type из метода глючить перестало.


 
брат Птибурдукова   (2013-01-14 13:25) [69]

ок, пусть будет факт. мне за споры денюжку не платят.


 
Dimka Maslov ©   (2013-01-14 13:55) [70]

Главное щас не спорить, а донести информацию до других, что может быть причиной проблем с дельфёю.


 
Игорь Шевченко ©   (2013-01-14 13:56) [71]

Dimka Maslov ©   (14.01.13 12:46) [61]

Я объявляю локально type в методах, с подобной проблемой не сталкивался ни разу.
Возможно, стоит в QC написать

брат Птибурдукова   (14.01.13 13:08) [64]

> надо было
> type
>  TSectionShapeClass = class of TSectionShape;
>  TSectionShapeClassIndex = Low(FShapes)..High(FShapes);
>  TSectionShapeClassArray = array [TSectionShapeClassIndex]
> of TSectionShapeClass;
> const
>  Classes: TSectionShapeClassArray =
>    (TISection, TIOrthoSection, TUpperOpenBoxSection, TLowerOpenBoxSection,
>  TBoxSection);


Жестоко

если мне надо объявить массив array[Boolean] of TFoo
я должен писать
type
 BooleanIndex = Low(Boolean)..High(Boolean)
и
 array[BooleanIndex] of TFoo

?

в VCL пишут просто

 BoolStrs: array [Boolean] of ShortString = ("FALSE", "TRUE");


 
Dimka Maslov ©   (2013-01-14 13:59) [72]


> Я объявляю локально type в методах, с подобной проблемой
> не сталкивался ни разу.
> Возможно, стоит в QC написать


Я тоже объявляю и до этого с проблемами не сталкивался. Тем более с таким их проявлением. А писать в QC всё равно, что в блог Медведева - толку мало будет. Главное знать об ошибке и уметь её обходить.


 
Игорь Шевченко ©   (2013-01-14 14:12) [73]


> толку мало будет


толку будет больше, потому что ты поможешь другим людям. Про delphimaster знает куда как меньшее количество программистов, чем про QC


 
брат Птибурдукова   (2013-01-14 14:23) [74]


> если мне надо объявить массив array[Boolean] of TFooя должен
> писать
Зачем? Есть уже готовый перечислимый тип — Boolean.


 
брат Птибурдукова   (2013-01-14 14:23) [75]

э... не перечислимый, а ordinal. Как это по-русски — упорядоченный?


 
Игорь Шевченко ©   (2013-01-14 16:51) [76]

брат Птибурдукова   (14.01.13 14:23) [75]

Так у TC вроде не менее упорядоченный тип есть :)


 
Аббат Пиккола   (2013-01-14 17:07) [77]

Я никогда не объявлял типы в методах. И не сталкивался в VCL  стакой практикой (возможно проглядел...). А что, есть такая документированная возможность? Можно пример из VCL?


 
Dimka Maslov ©   (2013-01-14 17:14) [78]


> Аббат Пиккола   (14.01.13 17:07) [77]


В VCL может и нет такого примера, но правилами это нигде явно не запрещено (иначе ошибка возникла бы сразу и была бы что-то типа Nested types not allowed)

Смысл такого локального типа только один - чтобы не заполнять лишними сущностями Structure, особенно когда идентификаторов много.


 
Игорь Шевченко ©   (2013-01-14 17:20) [79]


> Смысл такого локального типа только один


Смыслов больше, если тип относится к области действия только одной процедуры, то ему самое место внутри этой процедуры. Это называется инкапсуляция :)


 
Аббат Пиккола   (2013-01-14 17:22) [80]

Возможно этим (объявлениями типов в методах) не так часто пользуются, и тебе удалось обнаружить баг, который раньше просто не выявлялся.

Респект за упорство. :)



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

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

Наверх





Память: 0.61 MB
Время: 0.005 c
15-1358012636
Baks
2013-01-12 21:43
2013.05.19
Сетевая игра в интернет через wifi


2-1351236635
Painter
2012-10-26 11:30
2013.05.19
Как программно различать цвета?


15-1357803286
O'ShinW
2013-01-10 11:34
2013.05.19
GetLastError своими руками.


15-1358368204
Юрий
2013-01-17 00:30
2013.05.19
С днем рождения ! 17 января 2013 четверг


15-1354720674
xayam
2012-12-05 19:17
2013.05.19
Любителям шахмат (и не только) посвящается





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