-
Kerk © (25.04.17 17:47) [20]А можно сделать чтобы .dproj/.dpr можно было открывать?
-
Можно, если ктонибудь сделает чето аналогичное http://svn.shamangrad.net/zcad/trunk/other/pudgb/ulpiimporter.pas для .dproj/.dpr
только у меня дельфи нет)) -
Kerk © (25.04.17 18:37) [22]
> zamtmn © (25.04.17 18:05) [21]
DelphiAST умеет превращать вот такой DPR:program DelphiASTDemo;
uses
// FastMM4,
Forms,
uMainForm in 'uMainForm.pas' {MainForm},
StringUsageLogging in 'StringUsageLogging.pas';
//...
end.
вот в такой XML:<?xml version="1.0"?>
<UNIT line="1" col="1" name="DelphiASTDemo">
<USES begin_line="3" begin_col="1" end_line="11" end_col="1">
<UNIT line="5" col="3" name="Forms"/>
<UNIT line="6" col="3" name="uMainForm" path="uMainForm.pas"/>
<UNIT line="7" col="3" name="StringUsageLogging" path="StringUsageLogging.pas"/>
</USES>
...
</UNIT>
https://github.com/RomanYankovsky/DelphiAST
Под FPC должно скомпилироваться без проблем. -
Kerk © (25.04.17 18:50) [23]С dproj я пожалуй погорячился. Я как-то пытался с ними работать, но они отличаются от версии к версии. Геморрой, в общем :) Без особой надобности туда лучше не лезть.
-
Игорь Шевченко © (25.04.17 19:03) [24]Kerk © (25.04.17 18:50) [23]
А DProj для анализа и не нужен -
Kerk © (25.04.17 18:37) [22]
ниче там такова страшного ненадо, просто прописать главный файл, пути к остальным файлам и инклудам.
Сделал совсем простецкий вариант:
http://svn.shamangrad.net/zcad/trunk/other/pudgb/udpropener.pas
Бинарник перевыложил.
После открытия dpr параметры "опции компилятора" становятся
>>-Sd -Sc -dWINDOWS -dMSWINDOWS -dWIN32 -dLCLWIN32 -dFPC -dCPU32 -dLCLWIN32
-Sd - совместимость с делфи
-Sc - С style operators
-d - разные предефайны, их надо привести в соответствие с делфи
также возможно придется добавить ручками в опции компилятора пути к инклудам в виде -FiК:\инклудам\путь\пиши\сюда
>>Игорь Шевченко © (25.04.17 19:03) [24]
надо для автоматической настройки путей. но всё можно и руками -
Игорь Шевченко © (25.04.17 21:58) [26]
> надо для автоматической настройки путей. но всё можно и
> руками
DCC_UnitSearchPath, DCC_IncludePath -
>>DCC_UnitSearchPath, DCC_IncludePath
да, прочитать пару элементов, разматать пару макросов. Для лазаруса у меня это сделано, для Delphi нет возможности сделать -
Kerk © (25.04.17 18:37) [22]
>>DelphiAST умеет превращать вот такой DPR:
Посмотрел AST - это парсер, а не средство чтения DProj. Я использую парсер из поставки fpc, так что не подойдет -
Добавил возможность "кластеризации" графа. Юниты расположенные по одному пути находятся внутри кластера, название кластера это путь к этим юнитам (слэши заменены на нижний прочерк изза особенностей языка графвиза) то что было на скрине [19] в "кластерном" варианте выглядит так http://imgur.com/a/Ijz08
-
Если сравнить "кластеризированую" картинку из [29] (можно и без кластеров, но это не так наглядно) c деревом наследования классов http://imgur.com/a/mzKBb то видно основную "нитку" (красная почеркушка) и понятно что от остальных связей лучше постараться избавится. От всех избавится не получится, но от помеченых 1 и 2 вполне можно.
1 - связь образована изза одной единственной глобальной переменной в модуле uzglviewareageneral и приносит столько мусора. Переместил переменную в другой модуль и готово.
2 - для избавления нужны более глобальные изменения, оставлю это на потом))
В результате без 1 получилась более-менее годная картинка http://imgur.com/a/Ggz67 -
Pavia © (05.05.17 12:21) [31]zamtmn не пойму откуда у вас циклические зависимости. Можете приложить простой пример с 2-3 циклами.
-
Pavia © (05.05.17 12:21) [31]
В [30] циклов нет, это просто структура модулей проекта.
Циклы есть в [14] Самый простой пример это 2 модуля uses друг друга в секции implementation.
Или например:unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Unit2;
type
TForm1 = class(TForm)
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
end.unit Unit2;
{$mode objfpc}{$H+}
interface
uses
Unit3, Unit4;
implementation
end.
unit Unit3;
{$mode objfpc}{$H+}
interface
implementation
uses
unit1;
end.
unit Unit4;
{$mode objfpc}{$H+}
interface
implementation
uses
unit1;
end.
Дает вот такоеDiGraph Classes {
edge [style=solid]
Unit1_1_0 -> Unit2_2_0
edge [style=solid]
Unit2_2_0 -> Unit3_1_1
edge [style=solid]
Unit2_2_0 -> Unit4_1_1
edge [style=dotted]
Unit3_1_1 -> Unit1_1_0
edge [style=dotted]
Unit4_1_1 -> Unit1_1_0
} -
Ну и еще один довольно забавный пример использования.
Я в качестве хобби делаю векторный редактор, когдато давно он для рисования использовал только opengl, потом со временем научился использовать gdi. Но остался "пропитан" opengl кодом, который я постепенно "вычщал" До недавнего времени думал что вычистил всё и остались только "неустранимые" зависимости)) Но глянув зависимости получил такой ужас:
http://imgur.com/a/MpHDD красное пятно сверху - главный файл программы, красное пятно снизу справа - gl.pas посередине "пути" по которым главный файл подключает gl.pas
После нескольких исправлений всё встало на свои места http://imgur.com/a/e6syA
Только 4 "неустранимых" на данный момент "зависимости":
uzcreginterface - показывает в интерфейсе программы версию gl и glu
uzeffttf - использует glu для триангуляции ttf символов
uzeentspline - использует glu для тесселяции сплайнов
uzglviewareaogl - вариант opengl рендера картинки -
Попытался сделать самостоятельную отрисовку графа http://imgur.com/a/yQ0tl
Сделал вывод что svg отстойный формат(( -
Pavia © (23.05.17 00:09) [35]А как граф строили? Ручками или хитрым алгоритмом?
Да я тоже от SVG не в восторге, а есть чем заменить? -
svg файл с графом получен от графвиза.
В общем случае - хз. Конкретно в данном случае все альтернативы тут http://www.graphviz.org/doc/info/output.html