![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интерпритатор языка или что-то в этом роде. [D5, D6, D7]
S0N1K © (2004-10-08 21:00:00)Как бы объяснить то, что я хочу сделать?... Надо сделать интерпритатор нес-ких стандартных команд(такой маленький язык).
Пишем (на русском) текст, а прога берёт из него команды и т.п.
и выполняет.
Например пишем:
объект перемещение на 2 вверх
объект перемещение на 3 влево
объект перемещение на 2 вправо
А в рез-те на клеточном поле показано куда переместился наш объект.
При этом могут быть и циклы, условия...
Если меня кто-то понял, то подскажите с какой стороны подступиться к решению.
Юрий Зотов (2004-10-16 17:47:00) [1]> programania [60]
Итак, расширяем мою программу так, чтобы она содержала:
объекты - <круг> <квадрат> <текстовое поле>
команды - <создать> <переместить> <скрыть> <показать> <удалить> <изменить радиус> <изменить ширину> <изменить текст>
Сразу скажу, что на этом примере я намерен продемонстрировать, что программа именно расширяемая - то есть, что новые объекты и команды вводятся в нее без изменения алгоритма и УЖЕ существующего кода, а ТОЛЬКО добавлением нового.
Поскольку объект <текстовое поле> в программе уже есть (это РЕДАКТОР), добавляем объекты ПРЯМОУГОЛЬНИК (это КВАДРАТ в общем виде) и ЭЛЛИПС (это КРУГ в общем виде). Сначала вводим в проект еще один модуль, в котором определяем сами эти объекты (чтобы было что добавлять):
unit Unit2;
interface
uses
Windows, Messages, Classes, Controls, ExtCtrls;
type
TRectangle = class(TShape)
private
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
protected
procedure Paint; override;
end;
TEllipse = class(TRectangle)
public
constructor Create(AOwner: TComponent); override;
published
property Shape default stEllipse;
end;
implementation
{ TRectangle }
procedure TRectangle.CMTextChanged(var Message: TMessage);
begin
inherited;
Invalidate
end;
procedure TRectangle.Paint;
const
Flags = DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS or DT_END_ELLIPSIS;
var
R: TRect;
begin
inherited;
with Canvas do
begin
R := ClientRect;
DrawText(Handle, PChar(Caption), Length(Caption), R, Flags)
end
end;
{ TEllipse }
constructor TEllipse.Create(AOwner: TComponent);
begin
inherited;
Shape := stEllipse
end;
end.
Теперь вводим эти новые объекты в саму программу. Для этого их нужно только внести в таблицы классов:
ClassCount = 6;
ClassTable: packed array[0..(ClassCount - 1)] of string =
('КНОПКА', 'МЕТКА', 'ПАНЕЛЬ', 'ПРЯМОУГОЛЬНИК', 'РЕДАКТОР', 'ЭЛЛИПС'); // upper case, sorted
DelphiClassTable: packed array[0..(ClassCount - 1)] of TControlClass =
(TButton, TLabel, TPanel, TRectangle, TEdit, TEllipse);
Это все. Можно запустить программу и убедиться, что ее старые команды "создать", "переместить" и "удалить" УЖЕ работают с новыми объектами. Как видите, в СТАРОМ коде программы абсолютно ничего не изменилось - был ДОБАВЛЕН код новых объектов, а сами новые объекты были ТОЛЬКО внесены в таблицы.
Теперь вводим новые команды СКРЫТЬ, ПОКАЗАТЬ, РАЗМЕР (это <изменить радиус> и <изменить ширину> в общем виде) и ТЕКСТ (остальные команды в программе уже есть). Это делается в 2 шага.
Шаг 1. Вносим новые команды в тип TToken и в таблицы команд:
type
TToken = (tkNone, tkClassName, tkObjectName,
tkMove, tkShow, tkSize, tkHide, tkCreate, tkText, tkDelete, tkParam, tkEoF);
CommandCount = 7;
CommandTable: packed array[0..(CommandCount - 1)] of string =
('ПЕРЕМЕСТИТЬ', 'ПОКАЗАТЬ', 'РАЗМЕР', 'СКРЫТЬ', 'СОЗДАТЬ', 'ТЕКСТ', 'УДАЛИТЬ'); // upper case, sorted
CommandTokenTable: packed array[0..(CommandCount - 1)] of TToken =
(tkMove, tkShow, tkSize, tkHide, tkCreate, tkText, tkDelete);
ValidCommandTable: packed array[tkClassName..tkObjectName, tkMove..tkDelete] of boolean =
((False, False, False, False, True, False, False), (True, True, True, True, False, True, True));
Шаг 2. Для каждой новой команды пишем обрабатывающую ее процедуру и вносим ее в таблицу процедур:
procedure ShowObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
if Length(IntParams) <> 1 then
InvalidParamCount(0);
ObjectTable.GetObject(StrParam, IntParams[0]).Visible := True
end;
procedure SizeObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
if Length(IntParams) <> 3 then
InvalidParamCount(2);
if (IntParams[1] < 0) or (IntParams[2] < 0) then
raise EStatementSyntaxError.Create('Размер объекта не может быть отрицательным');
with ObjectTable.GetObject(StrParam, IntParams[0]) do
SetBounds(Left, Top, IntParams[1], IntParams[2])
end;
procedure HideObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
if Length(IntParams) <> 1 then
InvalidParamCount(0);
ObjectTable.GetObject(StrParam, IntParams[0]).Visible := False
end;
procedure TextObjectProc(const StrParam: string; const IntParams: TIntegerArray);
var
i: integer;
begin
if Length(IntParams) <> 2 then
InvalidParamCount(1);
try
i := ObjectTable.FindObject(StrParam, IntParams[1])
except
on E: EStatementSyntaxError do
i := -1
else
raise
end;
if i >= 0 then
raise EStatementSyntaxError.CreateFmt('Объект "%s%d" уже существует', [StrParam, IntParams[1]]);
with ObjectTable, Items[FindObject(StrParam, IntParams[0])]^ do
begin
ObjectID := IntParams[1];
TFriendControl(ObjectRef).Text := GetObjectName(StrParam, ObjectID)
end
end;
var
CommandProcTable: array[tkMove..tkDelete] of pointer =
(@MoveObjectProc, @ShowObjectProc, @SizeObjectProc, @HideObjectProc,
@CreateObjectProc, @TextObjectProc, @DeleteObjectProc);
Это все. Можно запустить программу и убедиться, что теперь ВСЕ ее команды (и старые, и новые) УЖЕ работают со ВСЕМИ ее объектами (и старыми, и новыми). Как видите, в СТАРОМ коде снова абсолютно ничего не изменилось - были ДОБАВЛЕНЫ процедуры для новых команд, а сами новые команды были ТОЛЬКО внесены в таблицы.
Вот так пишутся РАСШИРЯЕМЫЕ (а не ПЕРЕДЕЛЫВАЕМЫЕ) программы. Которые легко сопровождать и поддерживать. Что стало возможным как раз благодаря тому, что сам код интерпретатора (а это процедура ExecuteStatement со всеми ее внутренними процедурами) ИЗНАЧАЛЬНО был написан по ТЕОРИИ. И заметьте, что в ЭТОМ коде ВООБЩЕ ничего не менялось. К нему даже ничего и не ДОБАВЛЯЛОСЬ - поскольку благодаря теории этот код стал ОБЩИМ. Универсальным. Ему абсолютно без разницы, сколько и каких объектов и команд надо обрабатывать. Сколько угодно и каких угодно. Он работает по набору БНФ, в котором определены понятия ЛЮБОЙ объект и ЛЮБАЯ команда - а какой КОНКРЕТНЫЙ объект или команда встретились в тексте - безразлично, лишь бы этот объект или команда присутствовали в таблицах. Вот почему при добавлении новых объектов и команд модифицируются таблицы, а не интерпретирующий код.
Теперь допустим, что таблицы объектов и команд сидят не в программе, а в БД. Тогда вообще начинаются чудеса - код будет способен обрабатывать ЛЮБЫЕ объекты и команды ДАЖЕ БЕЗ ПЕРЕКОМПИЛЯЦИИ. Поскольку таблица DelphiClassTable может быть текстовой и тоже сидеть в БД (класс Delphi находится через GetClass), как и таблица обрабатывающих процедур CommandProcTable (сами процедуры могут сидеть в библиотеке UDF и определяться через GetProcAddress). ТАКУЮ программу надо только отладить, а все модификации могут вносится в БД и UDF самими юзерами - и получаем "язык, определяемый пользователем".
Неплохо, да? И, между прочим, благодаря теории.
===========================
P.S.
О том, что же сделали Вы (РАСШИРИЛИ свою программу или ПЕРЕДЕЛАЛИ ее) - позже. wnew © Юрий Зотов, если бы Вы писали книги по программированию, то думаю, многим бы они были очень интересны и полезны. Я бы с удовольствием изучал бы их содержимое, даже просто так, для себя.
Почему бы Вам не заняться писательством? Наверное, от этого занятия тоже есть какая-то материальная выгода. GanibalLector © 2 Юрий Зотов [84]
Да,чудеса!!!
Полностью согласен с wnew [85].Может начнем инвестировать в Вас? Defunct © programania © (16.10.04 03:24) [82]
>> Ваш код (до запутывания) - полный абсурд:
> Сожалею что вы стали анализировать бессмысленный код
> о чем было ясно написано:
Я стал его анализировать, после того как прочитал это:
> приведу пример работы интерпритатора Pascalя
> сделанного на днях для запутывания кода
Мне просто стало интересно, где же там интерпретатор.
Мельников Г.П. «Системология и языковыe аспекты кибернетики», М. 1978 г.
http://www.philol.msu.ru/~lex/melnikov/meln_r/glava_2_2-4.htm:
Поскольку дальше речь пойдет о различных аспектах проблемы отражения, которая подразумевает обязательное наличие отражающего объекта и отражаемых объектов, то условимся называть отражающий объект более кратко, одним словом: интерпретатор.
Следовательно, интерпретатор – это объект, отражающий поведение каких-то объектов отражения.
>> причем тут интерпретатор паскаля
> Чтобы сделать такой выходной код нужно выделить из текста паскаля
> операторы, коментарии, константы, элементы оператора FOR,
> begin, end, а разбор входного текста на составные части
> это и есть начальная стадия интерпретатора.
Смотрим определение интерпретатора. Где же тут отражение чего-либо?
Интерпретатор паскаля в вашем случае должен был бы выполнить (интерпретировать) приведенный код, или попытаться выполнить, и на основе результата выполнения, прийти к такому же выводу, к какому пришел я в [80] – код бессмысленный.
> "Генератор полиморфного кода" здесь не причем.
> код изменяется каждый раз одинаково,
Тем не менее, ваша программа, это хоть и неумелый, но все же именно «генератор полиморфного кода». Поясню:
В результате выполнения вашей программы:
1. мы получаем штамм, выполняющий те же действия, что и исходный код;
2. новый штамм не совпадает по размеру с изначальным кодом;
3. новый штамм не совпадает ни в одном байте с исходным кодом.
(хотя второе у вас получилось исключительно из-за смещения, так что нормальный анализатор кода, к примеру, эвристический анализатор из DrWeb все же найдет совпадения)
Таким образом, ваша программа попадает под определение генератора полиморфного кода [81].
> цель не вирус а создание исходного кода,
> который нормально работает, но который невозможно
> понять или восстановить, например,
> для защиты от взлома или незаконного использования.
А кто говорит, что генератор полиморфного кода (ГПК) применяется только в вирусах? Я же в [81] указал область применения ГПК: широко применяется в вирусологии и в теории защиты информации. Вирусология, кстати, занята проблемами обнаружения и удаления вирусов.
> Было интересно узнать удалось ли это сделать или
> надо путать сильнее.
Как для запутывания человека – не удалось, человек может интерпретировать (выполнить) ваш код, понять что он делает и выбросить все лишнее.
Как для запутывания автоматических анализаторов кода – тоже не удалось, см. выше. (к примеру, эвристический анализатор из DrWeb все же найдет совпадения)
> О своих программах я могу писать без конца
Программу я посмотрю чуть позже, надеюсь, вы ее привели к нормальному виду. Sphinx > Юрий Зотов © (16.10.04 17:47) [84]
А есть возможность экспортировать нововведения из DLL?
Вроде бы описания объектов TRectangle TEllipse должно быть определено в основной программе? То есть расширить интерпретатор таким образом не получится? Или я ошибаюсь? Palladin ©
> [88] Sphinx (17.10.04 17:12)
для DLL в этот штук придется вводить интерфейсы, что в принципе очень не долго... или же использовать BPL...
имхо, лучше интерфейсы :) Sphinx > Palladin © (17.10.04 17:26) [89]
С интерфейсами на сталкивался...в плане их самостоятельного описания. Может ссылочка есть где можно почитать? Или литература? Хотя Инет предпочтительней...чуть-чуть :) programania © >Юрий Зотов
>Как видите, в СТАРОМ коде снова абсолютно ничего не изменилось - были ДОБАВЛЕНЫ процедуры для новых команд, а сами новые команды были ТОЛЬКО внесены в таблицы.
А куда девалась передвижная панель?
Я обработку команд добавляю в оператор IF там где они получаются
вы в процедуры и в массив указателей на них. И чем это лучше?
По моему это самообман. Ничего не дает, а только усложняет.
А при любой потребности не учтенной в теории все придется делать заново.
Вы сами говорили что все должно быть учтено заранее.
А я уверен что могу добавлять все что угодно не заботясь ни о каких
теориях и так и сделал все свои программы.
Все они когда то выглядели как мой пример в форуме.
>а все модификации могут вносится в БД и UDF самими юзерами - и получаем "язык, определяемый пользователем".
и получаем еще один бейсик: тоже самими юзерами могут писаться любые процедуры или программы.
>Defunct
>«Системология и языковыe аспекты кибернетики», М. 1978 г.
>интерпретатор – это объект, отражающий поведение каких-то объектов отражения.
>Смотрим определение интерпретатора. Где же тут отражение чего-либо?
Это в 1978 можно было процитировать Ленина и спросить почему не отражено в программе.
>должен был бы выполнить (интерпретировать) приведенный код
под выполнением здесь понимается создание другого кода что и было сделано.
>Тем не менее, ваша программа, это хоть и неумелый, но все же именно «генератор полиморфного кода».
Называйте как хотите но лучше давать названия чтоб было сразу
понятно назначение программы например: запутыватель или mixer.
>Как для запутывания человека – не удалось, человек может интерпретировать
>(выполнить) ваш код, понять что он делает и выбросить все лишнее.
После интерпритации человек получит цепочку из миллионов
операторов присвоения, проверки, а чаще GOTO разбросанных по всей программе.
И что дальше?
Программу с GOTO невозможно понять даже не запутывая ее специально,
и это давно все поняли.
Сложность кода и многократность его выполнения единственное средство
для защиты программы от анализа.
А этой программой можно достичь любой сложности просто повторяя ее. KSergey © > [91] programania © (18.10.04 02:13)
С вами не интересно разговаривать. Вы не видите того, что вам пишут, смотрите на это лишь через узкую дырку своего понимания. Даже к словам придираться не буду - не интересно.
Елинственное, за что можно выразить вам благодарность - так это за посты Юрия Зотова в этой ветке. Только не приписывайте эту заслугу себе. Лучше просто почитайте, что он говорит, 5 раз, подумайте. Юрий Зотов © > programania
Вот теперь о том, что же сделали Вы - РАСШИРИЛИ свою программу, или ПЕРЕДЕЛАЛИ ее.
Я загрузил оба варианта в сравнивалку текстов и та расцвела всеми цветами радуги (а цветами она помечает отличия) - причем практически по всему тексту (а вовсе не в одном месте, как Вы утверждали). Итак, в новом варианте Вы сделали следующее.
1. Добавили глобальные переменные i, pNA, d, txt, stop, error, est, hide и wo. Если алгоритм не менялся, то зачем понадобились новые переменные?
2. Добавили функции C, SSP и E. Если алгоритм не менялся, то зачем понадобились новые функции? Ведь это совсем не те новые функции, которые я ввожу у себя для новых команд - мои новые функции в анализе текста никак не участвуют, а Ваши - участвуют. Вводя такие функции, Вы меняете алгоритм работы интерпретатора.
3. Изменили код процедуры SS. Если алгоритм не менялся, то зачем это потребовалось?
4. Изменили код обработки команды "переместить" - привязались к ключевому слову "на". Во-первых, код все же изменился. Во-вторых - что Вы будете делать, если потребуется ввести еще какую-то команду и в ней тоже будет присутствовать слово "на"? Ответ очевиден - Вы будете снова менять алгоритм . То есть, снова переделывать программу.
5. Добавили код обработки новых команд и объектов. Вот только это Вы и должны были бы сделать, если Ваша программа была действительно расширяемой .
Вывод напрашивается сам собой - чтобы ввести в Вашу программу новые команды и объекты, Вам потребовалось ее переписать . С изменением и старого кода и самого алгоритма. Фактически - написать новую, потому что другой алгоритм - это уже другая программа. И, как всякая новая программа, она снова требует полной отладки и т.д. Все заново, с нуля. Что не просто усложняет поддержку, а делает программу практически неподдерживаемой - потому что трудозатраты на поддержку такой программы слишком велики. И вот поэтому-то Ваш подход годится только для написания простых и маленьких программулек, но совершенно неприемлем для больших и сложных продуктов. И не надо обманывать - Ваш код более чем красноречиво говорит, что нет у Вас никакого опыта разработки и поддержки таких продуктов. Потому что и по идеологии, и по качеству это код студента, а не опытного программиста.
> programania © (14.10.04 19:24) [77]
> у меня чтоб добавить новую команду нужно добавить строку IF по
> ключевому слову и делать тамчто угодно совершенно независимо
> от обработки других команд.
Но продемонстрировали Вы почему-то прямо противоположное. Новые переменные, новые функции, измение старого кода и алгоритма. Говорить можно что угодно, но фактами Ваши слова почему-то не подтверждаются. А совсем наоборот - опровергаются.
> у вас все команды и их обработка сделаны по одному типу Cmds
> Dirs поэтому при изменении одной или добавлении новых
> конструкций придется затрагивать и старые и значит заново все
> отлаживать.
Но почему-то я тоже продемонстрировал прямо противоположное. Никаких изменений, только добавление нового. Соответственно, только это новое и требует отладки. И это тоже факты, а не слова.
> Еще, сами ключевые слова, действия и их обработка разбросаны
> по программе, а это не так наглядно.
И снова - продемонстрировал я прямо противоположное. Новые команды и объекты вносятся в таблицы - и все. И это снова не слова, а факты.
> Главное при изменении программы не навредить.
Вот это верно. Но с Вашей программой не имеет ничего общего. Поскольку Вы ее переписали - то есть, возможности навредить имели предостаточно.
> Представьте что вашу программу собрался изменить незнакомый
> человек. В моей он сразу найдет ключевое слово по ctrl+F
> и изменит в одном месте только что относится к этой команде,
Насчет "в одном месте" - это мы уже видели. Если бы... Факты, сударь, факты. Они не на Вашей стороне.
> а вашу программу я вообще побоялся бы трогать.
Тем не менее, модифицируется она очень просто. Как именно - я уже показывал. И это тоже факты, а не слова.
> Делите программу на независимые куски: не пожалеете.
Спасибо, но Ваш совет запоздал лет эдак на 30. Программистский букварь я читал именно тогда.
> Никто не может предвидеть будущее.
> А значит при необходимости непредвиденных измененй
> вашу программу придется выкинуть.
Логика железная - раз никто не может предвидеть будущее, значит мою программу придется выкинуть. Ох, что-то тут не так с причинно-следственными связями...
Ну так вот - предвидеть будущее не просто можно, а очень даже легко. Надо просто сразу считать, что расширения понадобятся и сразу их предусмотреть. Это первое. И второе: чью программу пришлось выкинуть - это мы уже видели. Снова факты.
>> малого опыта работы с отладчиком в действительно сложном коде.
> Когда я работаю с отладчиком то могу исковырять код до
> неузнаваемости. Как вы отлаживаетесь не меняя кода?
Елы-палы! Вы даже не поняли, о чем я говорил. Почему опытные программеры оператор после then пишут на следующей строке, как Вы думаете?
> Совет:
> Не бойтесь переделывать и содержание и форму.
Благодарю. Я, в общем-то и не боюсь. Но это и не требуется - обычно я просто сразу пишу так, чтобы потом уже не переделывать. Ни содержание, ни форму. Расширять, наращивать возможности - это да. Но не переделывать. Пример был дан выше.
> Нет ничего застывшего. Все в вашей власти.
Красивые слова, и ничего больше. Я же просил Вас - не надо демагогии. Лучше факты, плз, это гораздо убедительнее.
>>зачем для форума "сжимать" код?
> Не у всех же бесплатная выделенка.
А как Вы считаете, сколько весит Ваш код в "сжатом" и в нормальном виде? Разница-то ведь копеечная, вряд ли и сотня байт наберется. Может, уважение к читателям дороже этой сотни байт?
> О программе лучше самому судить
> а Defunct похоже ее и не видел в нормальном виде
Не "похоже", а так и есть. Он сам об этом сказал - что увидеть программу ему так и не удалось, несмотря на все его старания. И мне тоже вряд ли удастся, так что "самому судить" - не получится.
> programania © (18.10.04 02:13) [91]
> А куда девалась передвижная панель?
Никуда не девалась.
> Я обработку команд добавляю в оператор IF там где они
> получаются вы в процедуры и в массив указателей на них. И чем
> это лучше? По моему это самообман. Ничего не дает, а только
> усложняет.
Гм... помнится, кто-то совсем недавно советовал делить программу на независмые куски... А теперь говорит, что это "ничего не дает, а только усложняет".
> А при любой потребности не учтенной в теории
Не будет такой потребности. Потому что теория позволяет программе работать с ЛЮБЫМ объектом и с ЛЮБОЙ командой. А шире, чем "любой" ничего не бывает. Некуда уже шире.
> все придется делать заново.
Но факты почему-то говорят об обратном.
> Вы сами говорили что все должно быть учтено заранее.
Что и продемонстрировал. На деле. Palladin ©
> [90] Sphinx (17.10.04 22:17)
Ссылочка на деле очень простая :)
www.podgoretsky.com
а там DDP, использование Com или что то на подобие...
точно название не помню... ну оно и к лучшему... пока ищешь... найдешь много интересного для себя... Rouse_ © > programania © (18.10.04 02:13) [91]
- Эх, кабы не старость постылая, - заговорил старик после недолгого молчания, - плюнул бы на все и увел тебя на Вятшую реку.
ЗЫ: Сдавайся Леопольд ;) programania © >Юрий Зотов
Спасибо за анализ моей простой программы я даже не ожидал.
А изменения делал как и говорил в 1-ом сообщении:
если вижу что что-то повторяется выношу в процедуры или функции
при этом совершенно не заботит что меняю программу а не расширяю
однако конечно этого можно и не делать.
>Елы-палы! Вы даже не поняли, о чем я говорил.
вы говорили об отладке, в основном это поиск ошибок.
Тут следует как можно больше переложить на программу
чтоб она сама все показала и как работает и где ошибается
для этого все средства хороши: проверки,сообщения,имитаторы нажатия,
выкидывание лишнего кода для прояснения, написание дополнительного и т.п.
После такой войны с ошибкой вся программа в руинах,
а вы говорите then на отдельной строке: смешно.
о структуре программы:
можно вообще все операторы вынести в процедуры
оставить только цикл их вызова из массива указателей
и радоваться что этот цикл не нужно изменять.
По моему пока программа не подавляет своей сложностью
структура должна быть как можно проще
и если почуствуете что теряете контроль, тогда
всегда можно упорядочить до полного понимания:
перемещение готового кода не требует больших усилий.
>Потому что теория позволяет программе работать с ЛЮБЫМ объектом
>и с ЛЮБОЙ командой. А шире, чем "любой" ничего не бывает. Некуда уже шире.
о настройке:
Во всех больших программах заметны попытки вынести переменные
части для доступа пользователя это ini файлы, pluginы, macro и т.п.
вы тоже предлагаете что-то подобное в своем формате,
чтоб пользователи сами изобретали себе язык по вашим правилам.
Может лучше попытаться обработать любую команду
привычную пользователю без всяких БНФ,
например, путем последовательного
выбора пользователем из предлагаемых ему альтернатив
интерпретировать его команду
в команды доступные программе и запомнить.
Наверно тут еще потребуется пошаговый отладчик,
чтоб пользователь мог видеть что собирается делать
программа и поправлять ее.
Предусматривает ли это ваша теория? Юрий Зотов © > programania © (19.10.04 19:51) [96]
И снова слова... слова... слова... одни лишь слова. А как только доходит до конкретики - почему оператор после then пишут на новой строке) - так снова слова... слова... слова... одни лишь слова. Я Вас дважды спрашивал, спрошу и в третий раз - ПОЧЕМУ ? Не надо многословия, ответьте конкретно. Иначе получается, что ответа Вы просто не знаете - а значит, никогда не ходили отладчиком по действительно непростому коду. Вообще ни разу. А в таком случае спорить с Вами просто не о чем, понимаете?
Сначала Вы говорите об опыте разработки и сопровождения, потом приводите код, который ни к тому, ни к другому опыту даже близко не лежит. Получается жонглирование словами, типа - "слышал звон, да не знает, где он".
Сначала Вы говорите, что при модификации главное - не навредить, потом заявляете, что Вас совершенно не волнует, переделывете Вы программу или расширяете ее. А одно с другим не вяжется. И снова получается жонглирование словами, снова "слышал звон".
Сначала Вы говорите о структурировании программы, о ее разбиении на независимые куски - но почему-то игнорируете вопрос о восходящем и нисходящем проектировании (видимо, потому что Вы просто не знаете, что это такое?). А потом вообще заявляете что все это - ненужные усложнения. А потом произносите много-много слов по этому поводу, которые в итоге сводятся к "перемещение готового кода не требует больших усилий". Батенька, да такой подход как раз и показывает, что и о проектировании программ Вы не имеете ни малейшего понятия. Снова - всего лишь "слышал звон".
В [84] я Вам говорю: "получаем язык, определяемый пользователем, причем именно благодаря теории". И конкретно показываю, как именно мы его получаем. Вплоть до указания имен функций, с помощью которых разрешаются текстовые ссылки на классы и процедуры. После чего реализовать все это становится легче легкого.
А в [96] Вы предлагаете то же самое (только в каком-то кастрированном, извините, виде) и спрашиваете - предусматривает ли это ваша теория?
Повторяю еще раз (третий уже - чтобы Вы больше уже никогда не задавали таких вопросов ни мне, ни кому-либо другому) - теория предусматривает все . Работу с любыми командами и любыми объектами. На то она и теория и есть. Общая она, понимаете?
И, несмотря на все эти "слышал звон", Вы еще и беретесь спорить, притом с каким-то совершенно непонятным упорством. Приводя в качестве "аргументов" красивые и умные слова , но не приводя подтверждений этим словам (зато приводя их собственноручные опровержения).
По-видимому, Вы сказали правду - разговаривать о программировании Вы готовы бесконечно. Но пока что всего лишь разговаривать (очень надеюсь, что именно "пока").
Что же касается меня, то извините, но я к бесконечным разговорам не готов и временем для них не располагаю. Все, что я хотел Вам сказать, уже сказано - так что читайте и думайте, как сказал KSergey. А еще - читайте все же книжки (если конечно, в будущем хотите не только слышать звон, но еще и знать, где он). И никогда не спорьте о том, в чем как следует не разбираетесь (если, конечно, не хотите рано или поздно услышать-таки в свой адрес знаменитую аббревиатуру из 3-х английских букв).
До свидания. Искренне желаю Вам успехов. Серьезно. Aldor © Юрий, спасибо большое за Ваши посты в этой ветке. Действительно очень интересно и полезно.
P.S. И ламера бывают косвенно полезны :))) Sphinx > Palladin © (18.10.04 22:51) [94]
Может я не совсем вник в интерфейсы, но я все равно не понял как передать к примеру тип TEllipse из dll в программу.
Нашел вот еще что:
"DLL не в состоянии поставлять в программу переменные, константы и типы. В результате DLL не могут экспортировать в программу столь необходимые программисту классы - для этого используются пакеты." Фаронов Delphi 6 Учебный курс
Что это за пакеты ? Владислав © Да... цитата просто супер...
Интересно, а у него дальше написано, что такое пакеты?..
А ведь главное, что понятным языком! ;о) Sphinx > Интересно, а у него дальше написано, что такое пакеты?..
А дальше про пакеты ни слова... Palladin © Пакеты это и есть то что я сказал - BPL Webgirl NAROD mne nujen BNF opisanie paskalya...POMOGITEeee
VMcL (2004-10-16 14:08:00) [2]>> programania © (16.10.04 03:24) [82]
> А я писал о разработчиках 1C т.е. того языка
на котором вы программировали 1C.
Откуда дровишки? ОГГ?
programania (2004-10-16 03:24:00) [3]>Defunct
Ваш код (до запутывания) - полный абсурд:
Сожалею что вы стали анализировать бессмысленный код
о чем было ясно написано:
Вот исходный бессмысленныйкод для запутывания:
>причем тут интерпретатор паскаля
Чтобы сделать такой выходной код нужно выделить из текста паскаля
операторы, коментарии, константы, элементы оператора FOR,
begin, end, а разбор входного текста на составные части
это и есть начальная стадия интерпретатора.
"Генератор полиморфного кода" здесь не причем.
код изменяется каждый раз одинаково,
цель не вирус а создание исходного кода,
который нормально работает, но который невозможно
понять или восстановить, например,
для защиты от взлома или незаконного использования.
Было интересно узнать удалось ли это сделать или
надо путать сильнее.
>Опишите хотя бы чего ждать от программы?
О своих программах я могу писать без конца, но боюсь всем надоем
поэтому извините что не на все отвечаю.
После download и распаковки programania.com/ENLIS.ZIP
Нужно ждать появления файлов:
Enlis.exe от 11.10.04, z.men от 15.10.03, oan.ini от 15.10.03
и нескольких других не обязательных.
После запуска Enlis.exe любым способом
следует ждать появления меню из 3 пунктов: "Возможности","Настройка","Выход"
c подменю без всяких сообщений.
От меню нужно ждать вызова описания возможностей в htm, настройки вида
и запуск редактора табличных файлов.
От редактора следует ждать стандартного меню и панели с кнопками
При выборе создать и вводе любого имени следует ждать
появления типовой формы документа, который можно заполнять
и испытывать все возможности.
Или распаковать KADR.EXE с заменой, чтоб сразу их увидеть
после запуска той же самой Enlis.exe
Для чего программа написано в enlis.htm, а если коротко
то для создания АРМов бухгалтерских и т.п.
>Rar есть у всех а вот sfx никому не нужен.
За всех лучше не говорить: я не раз скачивал
rar и не мог распаковать потому что у меня старый rar
или вы думаете кто-то ради вашей программы будет
искать rar? Поэтому self надежней.
>Если программа заслуживает внимания, тогда пользователям не важно сколько занимает инсталляшка 800kb или 10Mb.
Чтобы узнать программу лучше всего ее скачать.
Или вы думаете что все уже знают ваши программы.
>Зато сервис выше, программу можно будет хоть нормально анинсталлить.
Это средство разработки, не для дилетантов и не требует установки,
специалисту смешно предлагать весь этот "сервис",
а чтобы хоть нормально анинсталлить достаточно все удалить.
Для дилетантов есть ENJOL.ZIP с установкой как принято.
>VMcL
>Ещё больше крепчал (это я как экс-1С-программист пишу).
А я писал о разработчиках1C т.е. того языка
на котором вы программировали 1C.
Defunct (2004-10-14 21:39:00) [4]> приведу пример работы интерпритатора Pascalя
> А вот что после запутывания:
Вдогонку, то что вы пытались преподать всем как интерпретатор Паскаля, теории известно и называется "Генератор полиморфного кода". Широко применяется в вирусологии и в теории защиты информации.
Определение:
Генератор полиморфного кода - программа способная создавать штаммы, выполняющие одно и то же действие, которые не совпадают ни по размеру коду и ни в одином байте кода.
Defunct (2004-10-14 21:24:00) [5]> Я согласен и чтоб быть полезным и интересным
> приведу пример работы интерпритатора Pascalя
> сделанного на днях для запутывания кода
> Вот исходный бессмысленный код для запутывания:
К чему это относилось совсем не понятно.
Ваш код (до запутывания) - полный абсурд:
procedure test;
var
rrr:integer; <-- лишнее, потому что не несет смысловой нагрузки
i:integer; <-- лишнее, т.к. можно обойтись без цикла
s:string; <-- лишнее, т.к. нигде не используется
begin
{Коментарий}
for i:=1 to 2 do begin <--- лишнее потому что в цикле ничего не делается
inc(rrr); <--- лишнее потому что rrr устанавливается в 2 после цикла
end;
form1.timer1.enabled:=false;
rrr:=2; <--- лишнее потому что потом идет проверка на > 0
if rrr>0 then begin <--- лишнее потому что rrr всегда больше нуля
assignFile(tf,'test.pas'); <-- лишнее потому что из файла ничего не читается
end;
reset(tf); <-- ошибка, потому что файловая переменная может быть не назначена
closeFile(tf) <-- ошибка, потому что файл может быть не открыт
end;
Если убрать все лишнее получится:
procedure test;
begin
Form1.Timer1.Enabled:=false;
end;
Ну и что же этот код делает, причем тут интерпретатор паскаля?
Если вы действительно хотите кого-то запутать, тогда надо применять перекресные ссылки (crosslinked code). Вот пример (уже приводил его однажды):
Db 0B8H
SubEnable:
Db 2dH
Db 3eH
Db 0EBH
Db 0FCH
Здесь AH=52h и ни один анализатор кода (без интерпретации) не сможет установить вызов вирусоопасной функции получения списка списков.
VMcL (2004-10-14 21:07:00) [6]>> programania © (14.10.04 19:24) [77]
>>зачем для форума "сжимать" код?
>Не у всех же бесплатная выделенка.
Маразм крепчал.
> спросите у разработчика 1С сколько пользователей
он поддерживает? да он их вообще не видел.
Ещё больше крепчал (это я как экс-1С-программист пишу).
Defunct (2004-10-14 20:59:00) [7]> programania
> О программе лучше самому судить
Вот потому я и решил на нее посмотреть сам, а не свято верить вашему описанию.
> а Defunct похоже ее и не видел в нормальном виде
Вы не удосужились довести ее до нормального вида, даже с учетом замечаний [40] и [43]. На вопрос, для чего предназначена ваша программа, вы не ответили. [50] вы полностью проигнорировали.
Еще раз повторю [43]:
Опишите хотя бы чего ждать от программы?
Скриншот выложите.
programania (2004-10-14 19:24:00) [8]>Юрий Зотов
О примере:
у меня чтоб добавить новую команду нужно добавить
строку IF по ключевому слову и делать там
что угодно совершенно независимо от обработки других команд.
у вас все команды и их обработка сделаны по одному типу Cmds Dirs
поэтому при изменении одной или добавлении новых конструкций
придется затрагивать и старые и значит заново все отлаживать.
Еще, сами ключевые слова, действия и их обработка
разбросаны по программе, а это не так наглядно.
Поясняю:
Главное при изменении программы не навредить.
Представьте что вашу программу собрался изменить незнакомый человек.
В моей он сразу найдет ключевое слово по ctrl+F
и изменит в одном месте только что относится к этой команде,
а вашу программу я вообще побоялся бы трогать.
Совет всем:
Делите программу на независимые куски: не пожалеете.
>потому что это должно быть сделано СРАЗУ
Никто не может предвидеть будущее.
А значит при необходимости непредвиденных измененй
вашу программу придется выкинуть.
>малого опыта работы с отладчиком в действительно сложном коде.
Когда я работаю с отладчиком то могу исковырять код до неузнаваемости.
Как вы отлаживаетесь не меняя кода?
Совет:
Не бойтесь переделывать и содержание и форму.
Нет ничего застывшего. Все в вашей власти.
>зачем для форума "сжимать" код?
Не у всех же бесплатная выделенка.
>Судя по сообщениям Defunct'а,
О программе лучше самому судить
а Defunct похоже ее и не видел в нормальном виде
>я срочно бросился бы ее переделывать
Я это и сделал: исправил замечания о чем сообщил
и проверил во всех доступных местах скачивание и
запуск всеми мыслимыми способами.
Что еще сделать? тут же сделаю.
>Цитаты привести, или сами знаете?
Я не пишу плохо о людях, только об их делах.
А резкие формулировки применяю чтоб
было интересней всем читать.
Извините еще раз.
>При том, что 1000/15 = 67.
К чему эти подсчеты? Я же говорю о средстве разработки
и могу вообще поддерживать 1 разработчика, а он 100.
А спросите у разработчика 1С сколько пользователей
он поддерживает? да он их вообще не видел.
А мне сейчас в 19.10 форму новой ведомости принесли
>TRyaSS
>ветка постепенно переходила в абсурд...
Я согласен и чтоб быть полезным и интересным
приведу пример работы интерпритатора Pascalя
сделанного на днях для запутывания кода
Вот исходный бессмысленный код для запутывания:
procedure test;
var
rrr:integer;
i:integer;
s:string;
begin
{Коментарий}
for i:=1 to 2 do begin //Другой коментарий
inc(rrr);
end;
form1.timer1.enabled:=false;
rrr:=2;
if rrr>0 then begin
assignFile(tf,'test.pas');
end;
reset(tf);
closeFile(tf)
end;
А вот что после запутывания:
procedure test; var rrr:integer; i:integer;
s:string;
label l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,
l14,l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,
l25,l26,l27,l28,l29,l30,l31,l32,l33,l34,l35,
l36,l37,l38,l39,l40,l41,l42,l43,l44,l45,l46,
l47,l48,l49,l50,l51,l52;
procedure p_; begin application.processmessages end;
begin goto l39;l40: goto l34;l35: l1:if i<=2 then begin goto l44;
l45:;goto l52;l48:goto l19;l20:;goto l32;
l28:goto l24;l25:;goto l31;l32:;goto l51;
l52: goto l18;l19:closefile(tf);goto l20;
l21:;goto l37;l33:goto l14;l15:;goto l36;
l37: goto l23;l24:goto l1;goto l17;l13:inc(rrr);
goto l16;l17:;goto l25;l26: goto l28;l29:assignfile(tf, 'test.pas' );
goto l12;l8:i:=1;goto l11;l12:;goto l30;l31:;
goto l42;l38:goto l29;l30:;goto l41;l42:;
goto l47;l43:reset(tf);goto l46;l47: goto l33;
l34:goto l8;l9:end else goto l2;goto l10;
l11:;goto l35;l36: if rrr>0 then begin goto l38;
l39:goto l3;l4:inc(i);goto l5;l6:;goto l22;
l18:goto l9;l10:;goto l21;l22:;goto l40;l41: end;
goto l49;l50: goto l48;l49:goto l43;l44:goto l13;
l14:l2: form1.timer1.enabled:=false;goto l7;
l3:rrr:=0;goto l6;l7:;goto l15;l16:;goto l27;
l23:goto l4;l5:;goto l26;l27:;goto l45;l46:;
goto l50;l51: end;
Даже отладчик запутывается и не проходит его весь пока
не выделить операторы по строкам.
А можно ли его распутать программой?
VMcL (2004-10-14 07:56:00) [9]>> П7 (13.10.04 12:50) [62]
> Да это именно бессилие сказать по теме. Ибо я не хочу говорить что-либо о том, в чём не совсем разбираюсь. Я лучше послушаю.
"И это правильно." © М. Горбачёв.
Babay (2004-10-14 05:20:00) [10]To Юрий Зотов ©
>> Немудрено - мало кто из частных лиц использует ERP-системы. А кому надо - те знают.- это точно.
>> Во всяком случае, в различные обзоры ERP-рынка мы попадали не раз, включая и буржуйские.- А немогли бы Вы дать ссылочки очень охота прочитать про наши (в смыле российские) ERP системы. Интереисуюсь не просто так, а потому что живу практически с этого :-) (я инженер по автоматизации).
Defunct (2004-10-14 04:28:00) [11]GanibalLector © (14.10.04 01:54) [73]
Открыл первую попавшуюся ссылку и сразу на первой же странице пример:
http://mexmatkz.narod.ru/rus/lec.tyap.index.htm
Запишем БНФ формы для языка чисел.
<число>::=<число без знака>|+<число без знака>|-<число без знака>
<число без знака>::=<десятичное число>|<порядок>|<десятичное число><порядок>
<десятичное число>::=<число без знака>|<правильная дробь>|<целое без знака><правильная дробь>
<порядок>::=e<целое>
<правильная дробь>::=.<целое без знака>
<целое>::=<целое без знака>|+<целое без знака>|-<целое без знака>
<целое без знака>::=<цифра>|+<целое без знака>|-<целое без знака>
Левая часть определяется через правую, содержащую левую. Это называется "рекурсивное определение"
<цифра>::={0|1|2|3|4|5|6|7|8|9}
GanibalLector (2004-10-14 01:54:00) [12]2 Defunct © (14.10.04 01:39) [72]
Дык,были мы и там(и в google и прочих),но реальных примеров нет(вернее я их не нашел).Открыл ~ около 50 сайтов,эффект=0.
Defunct (2004-10-14 01:39:00) [13]> GanibalLector © (14.10.04 00:43) [71]
Yandex.ru
строка поиска: БНФ формы
Результат поиска: страниц — 392, сайтов — не менее 158
GanibalLector (2004-10-14 00:43:00) [14]2 Юрий Зотов ©
Ответьте пожалуйста на [59]
П7 (2004-10-13 23:01:00) [15]
> Я с Вами говорю строго по теме. Более ни за кого не отвечаю.
> Поэтому не понимаю, почему свои претензии Вы адресуете именно
> мне и не принимаю их.
Ну вот, похоже я всех запутал. Или сам запутался... (:
А вот код, это интересно... (:
TRyaSS (2004-10-13 22:56:00) [16]...ветка постепенно переходила в абсурд...
дочитал не до конца,терпения не хватило.
Поэтому если кого то задели мои слова,прошу прощения.
Юрий Зотов (2004-10-13 21:47:00) [17]> programania © (13.10.04 11:29) [60]
>программа при трансляции не нашла TryStrToInt наверно от
> того что у меня D5, буду искать D8 как у вас.
Можно вставить заменитель:
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
> Как и ожидал: около часа тупой долбежки по клавишам.
Неважно - час или минута. Важно, сохранились ли старые алгоритм и код, или они были изменены. В первом случае имеем расширение, во втором - переделку.
> А вам предлагаю смотреть на вещи шире
Вы показывате узкозаточенную программу и предлагаете мне смотреть на вещи шире? LOL.
> интерпретатор находит в тексте знакомые слова а незнакомые
> считает параметрами и использует их при выполнении
Сорри, но это Вы велосипед изобрели (и как раз от незнания теории). Незнакомые слова интерпретатор считает идентификаторами и в зависимости от своего текущего состояния и самого идентификатора либо отвергает его, либо заносит в таблицу, либо использует при выполнении программы. Известно это уже примерно полвека и проверено на огромном числе интерпретаторов и компиляторов. Работает.
> Что вы будете делать для этого расширять или переделывать?
Ни то, ни другое. Для этого вообще ничего не надо делать, потому что это должно быть сделано СРАЗУ (см. предыдущий абзац).
> А если альтернативное выполнение одной из команд
> в зависимости от применения многих запомненных отличий.
> А построить дерево... с альтернативами для входа и выхода
> А связать альтернативы а потом еще все это перестраивать
> при поступлении новых команд, и ведь это не теория, это жизнь.
Вот это как раз и есть самая натуральная теория синтаксического разбора. Поступление нового идентификатора создает новую альтернативу. При анализе кода строится именно дерево. Какие в нем будут входы, узлы и пр. - это зависит и от самого кода, и от текущих альтернатив, и от текущего состояния. То есть, строится оно именно гибко. Так что - сорри, но Вы снова изобрели велосипед и снова от незнания теории.
> добавление почти одинаковых строк: это переделка
> или расширение
Еще раз (пятый?): если меняется АЛГОРИТМ- это переделка. Если добавляется НОВЫЙкод, без смены алгоритма - это расширение.
> Нельзя так тупо подходить к оформлению кода.
> ...оформление должно помогать понимать, дать возможность
> обозреть программу.
Вот именно. Только обозреть Ваш код в [18] более чем непросто. Обозреваемым он становится как раз после "тупого" оформления. Как ни странно.
> Для этого вспомогательные части нужно сжимать
> если можно до 1 строки
Такая мысль обычно проистекает от малого опыта работы с отладчиком в действительно сложном коде.
> а важные выделять, возможно даже в процедуры
Сенкс за просвещение. :о)
Но знаете - это ведь снова теория. Как насчет нисходящего и восходящего проектирования, например?
> A пример сжат для форума...
Непонятно - зачем для форума "сжимать" код? Экономии - мизер, но код становится совершенно нечитаемым.
> Ваши программы я со своим модемом вряд ли когда увижу
Вероятно, да. Частному лицу оно и не надо, а организации обычно имеют выделенку.
> а мои пожалуста... одна и таже ENLIS.exe
> приводит в действие >10 АРМом с сотнями входных и выходных
> форм и при этом никаких изменений в программе вообще не надо
> делать.
Судя по сообщениям Defunct'а, Enlis гораздо ближе к всенародно известной автошеме, чем к тому шедевру, о котором Вы говорите. Кстати, автошема подается ее автором тоже как шедевр, да вот одна лишь беда - не работает. Похоже, и с Enlis та же проблема.
Знаете, если бы подобное написали о моей программе, я срочно бросился бы ее переделывать, а до того постеснялся бы даже упоминать о ней. Чтобы еще больше не позориться.
> Напишите какие интерпритаторы вы сделали, причем лично
> без "команды", как я написал в [32]
Пожалуйста. Лично я, без всякой команды, своей головой и своими руками, с нуля и до полной отладки написал:
1. Интерпретатор подмножества Паскаля.
2. Калькулятор (т.е., интерпретатор арифметических выражений любой сложности). С функциями.
3. Интерпретатор одного специального и довольно объемного языка (язык описания строительных смет - ИБП, насколько помню).
4. Интерпретатор своего собственного языка (сначала, естественно, построив сам язык). Превращает входной текст в выходной текст на практически любом другом языке (Си, Паскаль, SQL и пр., и пр.) - т.е., работает по гибким правилам.
> Или способны только на такое:
>>1. насчет сложных проектов пальцы гнуть.
>>2. детишки из школьного кружка программирования.
>>3. образумить бедного студента,
>>4. ни один человек не может быть таким твердолобым,
>>5. Уймись, дите неразумное. На кого батон крошишь?
П.п. 1 и 2 - мои. Но что Вы в них нашли обидного или неверного? Разве не Вы в [12] начали гнуть пальцы по поводу сложных проектов и их сопровождения? Вы. А разве не Вы привели в [18] примитивный код, который ну никак не вяжется с опытом разработки, отладки и сопровождения сложных проектов? Тоже Вы. Так на кого же обижаться-то нужно? Может, на себя самого?
П.п. 3-5 - не мои. Попрошу чужих слов мне не приписывать.
> До такого я никогда не унижусь.
А вот лукавить - не надо. Вы же сами язвить и начали. Цитаты привести, или сами знаете?
> Для меня это лишь бессилие сказать по теме.
Я с Вами говорю строго по теме. Более ни за кого не отвечаю. Поэтому не понимаю, почему свои претензии Вы адресуете именно мне и не принимаю их.
>> Скриншот могу прислать
> Если он сильно отличается от Delphi и <200k дайте ссылку.
Он вообще почти от нее не отличается. И почти так же работает. И даже из скриншота это видно - вот почему я говорил, что даже из него Вы кое-что поймете.
Объем - где-то 30 Кб. Ссылку не дам, могу прислать по мылу.
>>Так что в рамках тех самых 80-90% задача все же решаемая.
> Согласен. О 100% я как раз и не говорил
Третий раз прошу - читайте внимательнее. О 100% никто вообще не говорил, с самого начала.
> Так может и для переносчика просто выделить все
> переносы из какой-нибудь "библиотеки в кармане" и использовать
> сразу готовые
Сорри, но это очередной велосипед. Неинтересно.
>>Почему бы и Вам не попробовать, раз эта тема Вам интересна?
> Пробовал, пробую и буду пробовать.
В [32] Вы написали прямо противоположное: "я и пытаться не буду". Вы уж как-нибудь определитесь, плз - либо одно, либо другое. А то какое-то пустое словоблудие получается.
> свести сложную обработку к механической работе это искусство.
Это знание теории. Когда точно знаешь, что и как надо сделать, то остается только сделать.
> Примерно 15 человек... Но при чем тут все это?
При том, что 1000/15 = 67. Так что не Вам учить меня поддержке. А судя по Вашему коду - и разработке тоже. Скорее, наоборот.
=======================================
P.S.
По поводу нового варианта программы - позже. Сначала напишу и выложу свой. Вот тогда и сравним.
ЮрийК (2004-10-13 20:09:00) [18]Ещё, наверное нужно завести и-мэйл бокс на Яху, тогда будет и доступно, а не пусто.
ЮрийК (2004-10-13 19:58:00) [19]Попробуй через поиск найти что нужно на :
http://groups.yahoo.com/
Там нужно записаться в группу, неужели где ты был, нет соответствующего линка?
GanibalLector (2004-10-13 19:27:00) [20]>Тем, кто интересуется Delphi Grammar
Дык,я интересуюсь!Но там http://groups.yahoo.com/group/DelphiGrammar/вообще ПУСТО,млин.