Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неиспользуемые модули [D7]


Страницы:   1 2 3 4

Karluha ©   (2005-07-19 14:23:00) 

Суть проблемы такова: я решил удалить из проекта все неиспользуемые модули из uses. Есть множество утилит, позволяющий их определить. Все вроде хорошо, но когда я удаляю некоторые из них, интеллектуальная Delphi IDE сама добавляет некоторые из них, хотя в действительности они в модуле не используются. Вопрос: как сделать Delphi IDE немного глупее?


kull   (2005-07-20 22:56:00) [1]

Да вроде молодой ищо. Старческим маразмом не страдаю. У меня еще усе спереди. :)


Плохиш   (2005-07-20 22:44:00) [2]


> kull   (20.07.05 22:21) [62]

Мда, детский сад на выезде.


kull   (2005-07-20 22:21:00) [3]


> Плохиш ©   (20.07.05 15:55) [59]

А платформо-зависимый код тут ни при чем. Если читал внимательно -

> (С линуксом это для примера, может быть просто вариант с
> версией Delphi или просто с директивами условной компиляции)

иначе совет тот же: "..до прояснения".

PS.
Хотя, если с этой точки здрения подойти - та же малина...

Код Unit1.pas с использованием CompUnit.pas - не платформо-зависимый, Но стоило IDE поумничать, и он таковым стал. Или ты хочешь ловить IFDEF-ами автоматически вставляемые юниты, неблагодарное енто дело :)


Юрий Зотов   (2005-07-20 20:33:00) [4]

> DiamondShark ©   (20.07.05 17:17) [60]

> А StripHotK -- это член? Или, всё-таки, глобальная функция?

В слова захотелось поиграть? Ню-ню.

> Откуда оно узнало, если этот метод описан в Unit1, а мы его
> не включали?

Ответ - получено парсингом. Поскольку другого способа нет.


DiamondShark   (2005-07-20 17:17:00) [5]


> Юрий Зотов ©   (19.07.05 19:19) [49]


> > А code completion прекрасно работает для всех членов.
> > Даже без включения модулей.
>
> Убираем ссылку на Menus. Пишем StripHotK и жмем Ctrl+Space.
> Опа! Не работает Сode Сompletion.

А StripHotK -- это член? Или, всё-таки, глобальная функция?
А читать цитируемое не обязательно?

Вот другой пример.

Unit1.pas
type
 TClass1 = class
   constructor Create(A,B,C: Integer);
 end

Unit2.pas
uses
 Unit1;
type
 TClass1_1 = class(TClass1);

Unit3.pas
uses
 Unit2;
type
 TClass1_2 = class(TClass1_1)
   constructor Create;
 end;
implementation
constructor TClass1_2.Create;
begin
 inherited Create(| <= Тут жмём Ctrl+Shift+Space или просто ждём
end;
Всплывает подсказка A,B,C: Integer
Откуда оно узнало, если этот метод описан в Unit1, а мы его не включали?


> Пишем в проекте какой-то метод класса (функцию, переменную,
> константу...). И проект НЕ компилируем. Жмем Ctrl+Space.
> Опа! В окне Code Completion появилось то, что мы только
> что написали и еще НЕ компилировали. Откуда же, спрашивается,
> она взялась?
>
> Ответ - получена парсингом. Поскольку другого способа нет.

В слова захотелось поиграть? Ню-ню.


Плохиш   (2005-07-20 15:55:00) [6]


> kull   (20.07.05 15:44) [58]

Если ты создаёшь платформо-зависимый код, то это не должно вызывать головную боль у создателей компилятора, это только твои проблемы.

PS. Читай [55] до прояснения.


kull   (2005-07-20 15:44:00) [7]

Есть один тонкий момент.

Компонент реализован в CompUnit.pas, он наследуется и требует в uses WinParentUnit.pas.

Если мне надо использовать компонент из CompUnit в Unit1, то IDE прописывает в его(Unit1) uses CompUnit и WinParentUnit. Вроде чего тут страшного все равно так и так WinParentUnit будет включен в проект.

А теперь представим, что под Linux у меня компонент наследуется с использованием  LnxParentUnit.pas.

(С линуксом это для примера, может быть просто вариант с версией Delphi или просто с директивами условной компиляции)

Таким образом при перенесении кода Unit1 под Linux, он не скомпилится, WinParentUnit то здесь нет.

Вот и получается, что вредно думать за пользователя.


Юрий Зотов   (2005-07-20 05:05:00) [8]

> Karluha   (19.07.05 19:41) [52]

Сравните два своих же высказывания (нумерация и выделения - мои):

1. Нужными модули являются для бинарника, но не для того модуля, в который их включила IDE и соответственно Code Completion не нуждается в нем(в случае этого модуля)
(c) [52]

2. Это коворит о том что в Code Completion показыватся только то, что в uses.
(c) [47]

И теперь скажите - так нужно или не нужно включение в uses ссылки на модуль для работы Code Completion ?

Все-таки. А то я так и не понял. Сорри.


ЮЮ   (2005-07-20 03:19:00) [9]

Не кидай компоненты в Дизайне, а создавай их РанТime - и тогда IDE "не навяжет" ни одного "лишнего" иодуля в uses, правда и нужные придется прописывать самому :)


Defunct   (2005-07-20 02:14:00) [10]

> Karluha  
А вот и камень в твой огород.

Редко встретишь столько бреда в одной ветке (Karluha это именно к твоим постам относится). Советую начать изучение программирования не с Delphi, а с TP7, еще лучше Tasm, который здорово прополощит твои мозги.


> то не утверждали бы, что разработчики IDE знают хоть что то об ООП.

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

> прошу не оскорблять и мое Я.
извини, не получилось.


Юрий К   (2005-07-19 21:21:00) [11]

А есть ещё и КОЛ, можно и его использовать.


Anatoly Podgoretsky   (2005-07-19 19:59:00) [12]

Это просто конкретный случай, ты не все использовал, вот поэтому и можно удалить, как только начнешь использовать шире так и почуствуешь, что удалять нельзя.
Подход Борланда мне кажется правильным.
Не нравится поведение ИДЕ, не используй, компилируй консольным компилятором. Только это ничего не дает, эти исключеные модули будут все равно включены из потомков.


Karluha   (2005-07-19 19:41:00) [13]

> прошу не оскорблять и мое Я.
Не относится конкретно к вам. Если чем обидел, прошу прощения.

> И не говорить о том, как они ОБЯЗАНЫ были сделать.
Нигде не писал, что они ОБЯЗАНЫ были это сделать.

> Мне, например, удобнее, когда Code Completion показывает все.
Тогда что же означает сдесь слово ВСЕ? Если:
>> в Code Completion показыватся только то, что в uses.
>Совершенно верно. И об этом же самом я и твержу

Нужными модули являются для бинарника, но не для того модуля, в который их включила IDE и соответственно Code Completion не нуждается в нем (в случае этого модуля)


Юрий Зотов   (2005-07-19 19:31:00) [14]

> Karluha   (19.07.05 19:08) [47]

> На вкус и цвет...

Вот именно. Разработчики Delphi сделали по СВОЕМУ вкусу. Если Вы считаете, что они сделали неправильно, то, как минимум, должны хотя бы признавать, что они имели на это полное право. И не говорить о том, как они ОБЯЗАНЫ были сделать.

> Так же прошу заметить, что слово ВСЕ очень пугающее.

Это тоже на вкус и цвет. Меня оно не пугает.

> в Code Completion показыватся только то, что в uses.

Совершенно верно. И об этом же самом я и твержу.

> Очевидно что линкуются

Значит, они необходимы . И указаны ли они только в одном uses, или в десятке - неважно. А Вы почему-то считаете их ненужными . Как же так? Вы же сами говорите, что для бинарника они нужны, для Code Completion - тоже нужны. Как же так - не нужны?


Юрий Зотов   (2005-07-19 19:22:00) [15]

> Karluha   (19.07.05 19:08) [47]

> прошу не оскорблять и мое Я.

Плз, перечитайте все мои постинги в этой ветке, и укажите пальцем, где конкретно я оскорбил Ваше Я.

Найдете - я извинюсь. Не найдете - стоит задуматься. ИМХО.


Юрий Зотов   (2005-07-19 19:19:00) [16]

> DiamondShark ©   (19.07.05 18:06) [30]

> Кроме Ваших, тут никаких фантазий больше нет.

Ой ли? Читаем дальше.

> Зависимости для включения модулей определяются только по
> published членам использованных компонентов.

Предки - побоку? Типы, константы, переменные, функции - тоже побоку? Для них включать ссылку на модуль не требуется?

Эксперимент показывает обратное.

> А code completion прекрасно работает для всех членов.
> Даже без включения модулей.

Убираем ссылку на Menus. Пишем StripHotK и жмем Ctrl+Space. Опа! Не работает Сode Сompletion.

Снова добавляем ссылку на Menus. Снова жмем Ctrl+Space в той же позиции курсора. Опа! Заработал Сode Сompletion.

Не было модуля - не работал. Добавили - заработал. Вот ведь как.

> Для ускорения code completion используется не "парсение
> кучи юзесов", а кэшированная метаинформация, полученная при
> компиляции всех связанных модулей.

Пишем в проекте какой-то метод класса (функцию, переменную, константу...). И проект НЕ компилируем. Жмем Ctrl+Space. Опа! В окне Code Completion появилось то, что мы только что написали и еще НЕ компилировали. Откуда же, спрашивается, она взялась?

Ответ - получена парсингом. Поскольку другого способа нет.


Юрий К   (2005-07-19 19:19:00) [17]

А можно взять и написать некую прогу, которая исследует перед окончательной сборкой сорсы (проекта, используемых модулей VCL с использованием RTTI информации) и на их основе создаст новый проект с новыми сорсами, убрав всё ненужное из всех используемых в проекте модулей). А новые модули VCL с удалёнными ненужными местами поместит в директорию нового проекта.
Желающих нет?


Karluha   (2005-07-19 19:08:00) [18]

На счет поспокойнее я согласен, но прошу не оскорблять и мое Я.

Почему Вы так решили - непонятно. Мне, например, удобнее, когда Code Completion показывает все.
На вкус и цвет... Так же прошу заметить, что слово ВСЕ очень пугающее. Так же для проверки, просто создайте пустую форму, удалите из uses модуль Windows и посмотрите, будут ли в Code Completion ф-ии и типы из него. Я попробовал. Нет не будут. Хотя в модуль Forms модуль Windows включен. Это коворит о том что в Code Completion показыватся только то, что в uses.

По поводу того что невключенные модули не линкуются к бинарнику я ничего и не говорил. Очевидно что линкуются и размер естесственно не изменится. Но вопрос то был не о размере...


Юрий Зотов   (2005-07-19 18:53:00) [19]

> Karluha   (19.07.05 17:58) [27]

> Ну я могу дать пример элементарного проекта с элементарными
> компонентами, из которых исключены, добавленные IDE модули из
> одной из форм


И что? Разве это значит, что этих модулей не будет в бинарнике?

Они там будут, потому что они ему небходимы, иначе он не сможет работать. А что Вы там поисключали из uses - пофиг.

> и все работает отлично.

Это и означает, якобы "исключенные" Вами модули в бинарнике все равно есть, иначе бы он просто не работал. Так что ничего Вы на самом деле не исключили.

> Можно узнать, каким образом Юрий Зотов неоднократно
> убеждался в том, что все модули необходимы?


Можно. Переименуйте файлы якобы "ненужного" модуля и попробуйте скомпилировать программу. Другой вариант - просмотреть бинарник, там названия модулей тоже есть.

Karluha   (19.07.05 18:00) [29]

> Code Completion должен показать мне все, что есть в моих
> uses и ничего более.


Почему Вы так решили - непонятно. Мне, например, удобнее, когда Code Completion показывает все.

> Прошу заметить, что если я добавлю к классу свойство с
> типом из модуля Dialogs, то этот самы модуль не добавляется к
> uses. Куда же смотрит Code Completion?


Это только подтверждает мое предположение. Поскольку Code Completion, очевидно, смотрит на дерево наследования, RTTI и интерфейсные функции/константы/переменные. Типы же, как самостоятельные единицы, ему, собственно, не нужны.

===================================

P.S.
Поспокойнее, плз, мы не на базаре. Если я тоже начну язвить - мало не покажется, гарантирую.


DiamondShark   (2005-07-19 18:41:00) [20]


> jack128 ©   (19.07.05 18:32) [43]

(да, описка)


> ???

Что непонятно?
На самом деле, нужни не модули предка, а модули, содержащие описания всего, что использовано в published.
IDE вставляет модули, содержащие предков, видимо из предположения, что эти описания скорее всего будут там. Для включения модулей просматривает цепочку наследования, а не всю метаинформацию, видимо, от того, что это проще.
Хотя по-уму должна была бы просматривать всю.
Судя по тому, что ты пишешь дальше, ты этот момент тоже заметил.


> Хотя если ты знаешь, как заставить IDE автоматом включать
> в uses не только модули предков компонентов, и какие нить
> другие, то я бы с удовольствием послушал, иногда нужно бывает..

Как уже имеющуюся IDE заставить, я не знаю. Наверное, никак.
Как это в принципе могло бы быть устроено, я представляю.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо