Вверх ↑
Этот топик читают: Гость
Ответов: 17
Рейтинг: 0
#1: 2018-10-26 23:07:11 ЛС | профиль | цитата
[блин, разделом ошибся]
Есть ли причины отсутствия этого компонента? Очень не хватает же!
И вообще надо дорабатывать этот инструмент, очень уж быстро работает.

А для чего нужен компонент StringBuilder? Ни описания ни справки.
Кажется, понял.


Так, опять с ошибкой столкнулся. Предлагаю тему переименовать в FTCG.)

Add(MainForm,2953706,35,105)
{
}
Add(FTCG_Tools,13869804,105,119)
{
}
BEGIN_SDK
Add(EditMultiEx,1900384,48,48)
{
WorkCount=#9:doCompare|
EventCount=#6:onTrue|7:onTrue1|7:onTrue2|
DataCount=#4:Data|5:Data1|
Width=363
Height=109
VOffset=36
HOffset=128
link(doCompare,12615173:doCompare,[])
}
Add(FT_DoData,4468722,176,84)
{
link(onEventData,8300942:doCompare,[])
link(Data,1900384:Data,[])
}
Add(GetDataEx,6082607,217,70)
{
link(Data,1900384:Data1,[(223,59)(189,59)])
}
Add(GetDataEx,15015375,259,70)
{
Angle=3
link(Data,6082607:Var3,[])
}
Add(FT_If_else,8300942,217,84)
{
Op2=Integer(0)
link(onTrue,1900384:onTrue,[])
link(onFalse,14658956:doCompare,[])
link(Op1,6082607:Var2,[])
}
Add(FT_If_else,14658956,259,91)
{
Op2=Integer(1)
link(onTrue,1900384:onTrue1,[])
link(onFalse,13772012:doCompare,[])
link(Op1,15015375:Var2,[])
}
Add(FT_If_else,13772012,301,98)
{
Op2=Integer(2)
link(onTrue,1900384:onTrue2,[])
link(Op1,15015375:Var3,[(307,75)])
}
Add(FT_If_else,12615173,98,84)
{
Op2=Integer(-1)
link(onTrue,4468722:doData,[])
}
END_SDK


Как насчёт добавить doDefault to FT_Math?

Редактировалось 7 раз(а), последний 2018-10-28 19:14:45
карма: 0

0
Ответов: 9906
Рейтинг: 351
#2: 2018-10-27 21:24:11 ЛС | профиль | цитата
Prodigy писал(а):
Так, опять с ошибкой столкнулся

Попробуй http://forum.hiasm.com/getfile/38495


--- Добавлено в 2018-10-27 21:30:15

Prodigy писал(а):
Очень не хватает же!
И вообще надо дорабатывать этот инструмент, очень уж быстро работает

Prodigy писал(а):
Как насчёт добавить doDefault to FT_Math?

Спасение утопающих, дело рук самих утопающих
Ошибка - это одно (хотя и очень не хочется чужое разгребать)
Фенички - это совсем другое.

Вот тебе и весь сказ

Редактировалось 5 раз(а), последний 2018-10-27 22:02:27
карма: 9

0
файлы: 1FTCG_1.rar [2.2KB] [643]
Ответов: 17
Рейтинг: 0
#3: 2018-10-28 18:43:51 ЛС | профиль | цитата
Galkov, Как всегда, работает.

Galkov писал(а):

Спасение утопающих, дело рук самих утопающих
Ошибка - это одно (хотя и очень не хочется чужое разгребать)
Фенички - это совсем другое.

Вот тебе и весь сказ


Ну я согласен, конечно. Доделываю сам, где могу разобраться. К For onBreak прикрутил, например. (Но одно дело дописывать код будучи уже "в теме", и совсем другое с нуля разбираться, хотя и полезно в чём-то)
Однако я ж стараюсь базовые вещи предлагать, а не "фенички".
Без сброса Math во многих случаях неприменим... учитывая, что и у Memory этого нет.
А с разделителем строк я, например, смог бы много всякого матана ускорить, но сам разбираться я слишком долго буду.
Вот и предлагаю вам на будущее)
карма: 0

0
Ответов: 9906
Рейтинг: 351
#4: 2018-10-28 20:52:29 ЛС | профиль | цитата
А ты сильно-то не обольщайся....
Вот такое, например, уже НЕ компилируется
Add(FTCG_Tools,13869804,476,70)
{
}
BEGIN_SDK
Add(EditMultiEx,1900384,49,49)
{
WorkCount=#9:doCompare|
EventCount=#6:onTrue|
DataCount=#4:Data|5:Data1|
Width=202
Height=109
VOffset=35
HOffset=126
link(doCompare,12615173:doCompare,[])
}
Add(FT_If_else,12615173,70,84)
{
Op2=Integer(-1)
link(onTrue,9057720:doData,[])
link(onFalse,14736535:doWork3,[(165,97)])
}
Add(HubEx,14736535,161,84)
{
link(onEvent,87018:doOperation,[])
}
Add(FT_DoData,9057720,119,84)
{
link(onEventData,14736535:doWork2,[])
link(Data,1900384:Data,[(125,72)(181,72)])
}
Add(FT_Math,87018,182,84)
{
OpType=11
Op2=3
link(onResult,1900384:onTrue,[])
link(Op1,1900384:Data1,[])
}
END_SDK
А вот это, хоть и типа компилируется, но работает неправильно:
Add(FTCG_Tools,13869804,476,70)
{
}
BEGIN_SDK
Add(EditMultiEx,1900384,49,49)
{
WorkCount=#9:doCompare|
EventCount=#6:onTrue|
DataCount=#4:Data|5:Data1|
Width=202
Height=109
VOffset=35
HOffset=126
link(doCompare,12615173:doCompare,[])
}
Add(FT_If_else,12615173,70,84)
{
Op2=Integer(-1)
link(onTrue,9057720:doData,[])
link(onFalse,14736535:doWork3,[(165,97)])
}
Add(HubEx,14736535,161,84)
{
link(onEvent,14505398:doFor,[])
}
Add(FT_DoData,9057720,119,84)
{
link(onEventData,14736535:doWork2,[])
link(Data,1900384:Data,[(125,72)(181,72)])
}
Add(FT_For,14505398,182,84)
{
link(onEvent,1900384:onTrue,[])
link(End,1900384:Data1,[])
}
END_SDK
В принципе, я тоже могу Math поправить, чтобы он типа компилировался (по образцу For)
Вот только смысла в этом нету.

И конца края этому уже сейчас не видать
Не говоря уже о каких-то добавлениях/украшениях.

Я вот тут намедни FTCG-tutorial почитал:
Netspirit писал(а):
В реальных компонентах, конечно, нужно проверять, например, чтобы в разделе uses не прописывался дважды один и тот же модуль или функция не была объявлена дважды в одной и той же области видимости (что может происходить, если в схеме есть два экземпляра одного и того же компонента, которые объявляют функцию с одним и тем же именем). Для этих целей существует достаточное количество команд для работы с блоками (смотрите статью "FTCG -> Описание синтаксиса -> Управление блоками"), в частности, можно получить текст блока в виде строки и произвести в ней поиск на наличие чего-нибудь.

Netspirit, может покажешь на деле
А то, слова есть слова... А дела есть дела.

Редактировалось 3 раз(а), последний 2018-10-28 20:58:30
карма: 9

0
Ответов: 17
Рейтинг: 0
#5: 2018-10-28 23:06:20 ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2018-10-28 23:46:29
карма: 0

0
Ответов: 17
Рейтинг: 0
#6: 2018-10-29 01:29:16 ЛС | профиль | цитата
Galkov писал(а):
Я вот тут намедни FTCG-tutorial почитал:
Netspirit писал(а):
В реальных компонентах, конечно, нужно проверять, например, чтобы в разделе uses не прописывался дважды один и тот же модуль или функция не была объявлена дважды в одной и той же области видимости (что может происходить, если в схеме есть два экземпляра одного и того же компонента, которые объявляют функцию с одним и тем же именем). Для этих целей существует достаточное количество команд для работы с блоками (смотрите статью "FTCG -> Описание синтаксиса -> Управление блоками"), в частности, можно получить текст блока в виде строки и произвести в ней поиск на наличие чего-нибудь.

Netspirit, может покажешь на деле
А то, слова есть слова... А дела есть дела.
Я, наверное, не понимаю чего-то, но разве нельзя тупо удалять повторы в uses автоматически?
А функции(и вызовы ессно) переименовыать добавляя цифру в конец?

Редактировалось 3 раз(а), последний 2018-10-29 02:22:22
карма: 0

0
Ответов: 4630
Рейтинг: 749
#7: 2018-10-29 13:41:58 ЛС | профиль | цитата
Galkov писал(а):
Netspirit, может покажешь на деле?
Смотря что. Как избежать повторения данных в блоке?

Вариант 1:
- заводишь в компоненте глобальную переменную по gvar()
- перед внесением данных проверяешь её значение, если не равно 1 - вносишь данные
- как только данные были один раз внесены, ставишь значение переменной равным 1

Вариант 2:
- выполнять поиск требуемого текста в блоке с помощью функции block.intext()
Только учитывать что функция ищет только целую строку. Примерно:
if (block.intext('function SomeFunc(arg1: Integer): Boolean;')) // Найдёт
if (block.intext('SomeFunc')) // Не найдёт
(В пакете Android я это поправил в кодогенераторе)

Вариант 3:
- получить текст блока с помощью block.ascode()
- искать в полученном тексте с помощью функции pos(substr, str)

Редактировалось 4 раз(а), последний 2018-10-29 13:49:46
карма: 26

0
Ответов: 9906
Рейтинг: 351
#8: 2018-10-29 15:12:27 ЛС | профиль | цитата
Netspirit писал(а):
Как избежать повторения данных в блоке?

Угу. Смотри по схеме: два вызова одного метода (которому приспичила локальная переменная) одного и того же элемента.
Начался этот топик с исправлений в hiEditMultiEx.doWork, а он по определению как бы многократно-входимый... ну и наступил на эти грабли.
((глянул бы своим глазом, кстати говоря))

Netspirit писал(а):
- выполнять поиск требуемого текста в блоке с помощью функции block.intext()

И это правильно. Не хватало еще, чтобы заблокировалось i2:integer; после внесения si2:integer;
НО, это надо делать всегда, и внутри реализации lng.decl_loc_var и lng.decl_priv_var
Ибо вышеописанный геморрой с gvar в не очень понятном количестве компонентов - та еще песня, и с неизвестным концом.
Да и нафига тогда вообще заводились пользовательские lng-методы, если их надо безусловно окружать танцами с бубном по вариантам 1, 2, или 3.

Т.е. это надо делать в direct.inc, в терминах языка Delphi, а не FTCG.

Netspirit, это не очень мой огород, и на поднятие этого вопроса у меня уйдет несколько дней (если еще найдутся).
А глюк - реальный.
Если для тебя это быстрее - может покажешь корректировки в direct.inc

Редактировалось 7 раз(а), последний 2018-10-29 15:41:03
карма: 9

0
Ответов: 4630
Рейтинг: 749
#9: 2018-10-29 15:56:46 ЛС | профиль | цитата
А можешь дать схемку, чтобы увидеть проблему?
карма: 26

0
Ответов: 9906
Рейтинг: 351
#10: 2018-10-29 16:02:20 ЛС | профиль | цитата
Дык вот же они, в посте #4 этого топика. После слов "А ты сильно-то не обольщайся"
Первая, правда с исправленным FT_Math (http://forum.hiasm.com/post/299463)
А вот вторая - с боевым FT_For

--- Добавлено в 2018-10-29 16:12:13

А да, я еще hiEditMultiEx.doWork правил. Он в посте #2 этого топика
Кстати говоря, там та же проблема возникала. При попытке введения локальной переменной.

Редактировалось 2 раз(а), последний 2018-10-29 16:12:13
карма: 9

0
Ответов: 4630
Рейтинг: 749
#11: 2018-10-29 16:52:45 ЛС | профиль | цитата
Вот моё решение проверки наличия локальной переменной в lng.decl_loc_var():
direct.inc

...
function BlockContains(Block: TCodeBlock; const S: string): Boolean;
var
I: Integer;
begin
for I := 0 to Block.CurList.Count - 1 do
begin
if S = PScData(Block.CurList.Items[i]).value.sdata then // Ищет только на совпадение целой строки
//if IndexOfStr(PScData(Block.CurList.Items[i]).value.sdata, S) > -1 then // Ищет часть строки
begin
Result := True;
Exit;
end;
end;
Result := False;
end;
...

function lng_proc(parser:TParser; obj:pointer; index:integer; args:TArgs):TScData;
var
dt: PScData;
old, s: string;
t: integer;
begin

...

lng_blk_loc_var:
begin
dt := GVarList.find('loc_vars');
if dt = nil then
parser.debug('LOC_VARS - not found')
else
begin
old := parser.codeb.select(dt.toStr());
s := args.Values[0].toStr + ':' + args.Values[1].toStr + ';';
// Проверяем наличие строки в блоке
if not BlockContains(parser.codeb, s) then
begin
parser.Print(s);
parser.PrintLine;
end;
parser.codeb.select(old);
end;
end;

...

end;

hiFor.hws

func doFor
  fvar(old,step_code,end_num,start_num)
//lang(i:int) // Хоть убей - не понимаю принципа этого. С ним - не работает.

end_num = End
start_num = Start

lng.decl_loc_var(i,'integer')
if(isndef(IncludeEnd))
end_num = end_num && ' - 1'
end

println('for ', i, ' := ', start_num, ' to ', end_num, ' do')
lng.begin()
event(onEvent, i)
lng.end()

event(onStop)
end

Считаю неправильным вынесение в direct.inc того, что можно сделать на чистом FTCG (lng.decl_priv_var/lng.decl_loc_var). Можно было сделать подключаемый общий *.hws файл с требуемыми функциями.

Редактировалось 3 раз(а), последний 2018-10-29 16:56:22
карма: 26

0
Ответов: 9906
Рейтинг: 351
#12: 2018-10-29 17:13:02 ЛС | профиль | цитата
Netspirit писал(а):
Вот моё решение проверки наличия локальной переменной в lng.decl_loc_var()

Славненько. Вроде это то, что нужно. Попробую

Удивительно другое...
В установленных (AltBuild) у меня пакетах я нашел 4 direct.inc с декларацией методов lng.decl_loc_var
Которые как бы работают много лет.
Кино и немцы............
карма: 9

0
Ответов: 9906
Рейтинг: 351
#13: 2018-10-30 00:12:25 ЛС | профиль | цитата
Попробовал, в общем. Почти удовлетворен.



Prodigy, после замены direct.inc необходимо перекомпилировать кодогенератор.
Можно и make.bat запустить, но я запускал (ручками) одну команду из него:
..\..\compiler\delphi\dcc32.exe -U..\..\compiler\delphi FTCG_CodeGen.dpr



nesco, пожалуй можно внести изменения на svn. Рекомендации коллеги Netspirit-а придают некоторую уверенность.



Netspirit писал(а):
Можно было сделать подключаемый общий *.hws файл с требуемыми функциями

Подсмотрел я таки фокус по твоему варианту 1. Там правда var, а не gvar, что после некоторых размышлений становится и понятно.
Это есть в файле hiArrayRead.hws
Не очень как бы получается... надо залезать в каждый Init (у которого и своих дел типа хватает) и объявлять там переменные, по одной на каждую локальную/приватную.
Не пакуется в одну функцию как бы......................

Редактировалось 7 раз(а), последний 2018-10-30 00:32:37
карма: 9

0
файлы: 1FTCG2.rar [4KB] [549]
Ответов: 4630
Рейтинг: 749
#14: 2018-10-30 12:51:17 ЛС | профиль | цитата
Galkov писал(а):
Рекомендации коллеги Netspirit-а придают некоторую уверенность.
Я тут только предложил конкретную реализацию данного решения. А вот как оно стыкуется с остальными компонентами FTCG - я не очень в курсе.

Я понимаю так. Контейнер FTCG_Tools создаёт один модуль с одним классом. В этом классе есть один блок переменных класса (BLK_PRIV_VAR). На каждый входной метод контейнера создаётся один метод в этом классе. В каждом методе делается доступным свой блок локальных переменных (LOC_VARS).
Проблема заключается в следующем. Компонент не может прописать локальную переменную метода во время своего Init(), потому что блок LOC_VARS во время Init() может быть один, а во время выполнения методов компонента - совсем другой.
Значит локальную переменную он должен писать в блок только при выполнении методов компонента, которые эту переменную используют. А раз так, то при вызове такого метода компонента несколько раз он запишет эту переменную столько же раз. Значит, компоненту каждый раз нужно знать писал ли он уже эту переменную в данный конкретный блок LOC_VARS или нет. Тогда предложенное мной решение подходит - функция создания локальной переменной проверяет её наличие. Пока что не вижу каких-то проблем.

Возможным другим способом решения будет необходимость в каждом компоненте для каждой локальной переменной вести массив имен блоков LOC_VARS, в которые он уже записал эту переменную, и искать в этом списке текущий блок LOC_VARS. Это очень накладно.
карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#15: 2018-10-30 14:36:30 ЛС | профиль | цитата
А ничего, что файл FTCG_CodeGen.dpr берется как копия файла CodeGen.dpr из папки FTCG, оттуда же берется и файл error.pas. Если заливать FTCG_CodeGen.dpr в папку delphi, то надо менять make.bat. Заливать FTCG_CodeGen.dpr в папку FTCG я бы не стал, мы не знаем, на что это может повлиять? Или вы знаете?

Редактировалось 2 раз(а), последний 2018-10-30 14:37:35
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)