Вверх ↑
Этот топик читают: Гость
Главный модератор
Ответов: 2741
Рейтинг: 358
#226: 2019-01-19 21:59:54 ЛС | профиль | цитата
brown-aleks писал(а):
посвятите нас в уже имеющиеся отличия RTCG.NET от RTCG

Основные принципы работы кодогенератора были перенесены из оригинальной версии RTCG и даже названия большинства лексем были сохранены для простоты переноса ранее сделанных наработок. Поэтому частично описание оригинальной версии RTCG подходит для кодогенератора RTCG.NET. Есть некоторые отличия в синтаксисе, например, лексема event заменена лексемой @event. Это связано с тем, что в языке C# это ключевое слово и его невозможно использовать в качестве имени метода или класса. Также изменения коснулись API кодогенератора, но они обратно-совместимы с оригиналом, так как только расширяют количество методов.

В RTCG.NET не реализована лексема gvar, поэтому глобальные переменные надо объявлять в классе sys. Лексема var также не реализована, но ключевое слово var языка C# почти совпадает по функционалу.

Работа с динамическими переменными реализована своеобразно через класс @this. Например:
@this.test = "Text";
sys.blk.println(@this.test);
Область видимости этих переменных ограничена классом элемента. По сути это и есть аналог лексемы var оригинального RTCG. Тогда как и полагается переменная, которая объявлена при помощи ключевого слова var подчиняется правилам C#.

Нет реализации лексемы method. Вместо неё используются штатные в C# делегаты. Например:
@this.Result = (Func<TArgs, TValue>)((data) =>
{
return TValue.empty;
});
Такое объявление метода соответствует созданию следующего кода:
TValue Result(TArgs data)
{
return TValue.empty;
}
В RTCG в классе sys контекст каждого элемента доступен через лексему объекта this. В RTCG.NET это не реализовано, поэтому при вызове методов этого класса приходится передавать ссылку на элемент в качестве аргумента метода:
// initialize widget
@this.obj = sys.add_widget(this);
При работе с блоками необходимо всегда указывать имя класса sys. В оригинальном RTCG допускалось его не указывать.

Естественно, что при написании кода надо соблюдать правила синтаксиса языка C# версии 5.0

Поэтому это лучше всего делать сразу в Visual Studio или хотя бы в Visual Studio Code.

Если хотите подробнее ознакомиться с синтаксисом RTCG.NET, то посмотрите коды некоторых элементов в папке \_base\code

Редактировалось 13 раз(а), последний 2019-01-20 05:08:42
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Ответов: 54
Рейтинг: 1
#227: 2019-01-20 14:32:58 ЛС | профиль | цитата
Так-то, по большому счёту... отличия уже довольно существенные. Как минимум код из RTCG в чистом виде, в RTCG.NET точно работать не будет. Пробовал читать руководство по языку C# от microsoft.com, мой мозг более чем на 1/10 не осиляет от всего что там написано. Признаюсь честно. Понятны только общие базовые принципы.

Для чего код RTCG.NET делать в Visual Studio? Что бы в синтаксисе не запутаться? И всё таки код RTCG.NET элементов будет компилироваться средствами HiAsm.NET или Visual Studio?

Nic писал(а):
например, лексема event заменена лексемой @event. Это связано с тем, что в языке C# это ключевое слово и его невозможно использовать в качестве имени метода или класса.


Правильно ли я понимаю? Что для генерации целевого кода из схем, компилятором будет, компилятор из C#?
карма: 0

0
Главный модератор
Ответов: 2741
Рейтинг: 358
#228: 2019-01-20 14:55:28 ЛС | профиль | цитата
brown-aleks писал(а):
Пробовал читать руководство по языку C# от microsoft.com

Можно попробовать что-нибудь другое
brown-aleks писал(а):
Для чего код RTCG.NET делать в Visual Studio? Что бы в синтаксисе не запутаться?

Прежде всего да - среда помогает и подсказывает правильный синтаксис, но можно и отладкой скриптов заниматься:
Script debugging


brown-aleks писал(а):
И всё таки код RTCG.NET элементов будет компилироваться средствами HiAsm.NET или Visual Studio?

Для компиляции используется специальная библиотека
brown-aleks писал(а):
Правильно ли я понимаю? Что для генерации целевого кода из схем, компилятором будет, компилятор из C#?

Процесс генерации целевого языка из схемы сложен. Сначала работает кодогенератор RTCG.NET, затем среда делает файлы ресурсов, файл инициализации дизайнера формы, если надо файл манифеста и последним файл проекта, который можно компилировать или открывать в Visual Studio. Это всё для проекта Windows Forms. В других проектах может оказаться достаточным только работы RTCG.NET.

Редактировалось 5 раз(а), последний 2019-01-21 08:43:10
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Ответов: 4423
Рейтинг: 472
#229: 2019-01-20 16:00:31 ЛС | профиль | цитата
brown-aleks, ну и http://forum.hiasm.com/topic/66245/1 Прошло два года с тех пор как Вы на пару с Dilma надомной постебались И А чукча не дурак, чукча умный, и совет тебе правильный дал . Но что делать, против авторитета не попрёшь
карма: 4

0
Ответов: 1416
Рейтинг: 98
#230: 2019-01-20 17:51:17 ЛС | профиль | цитата
Чукча не дурак, чукча Козьма Прутков - Зрит в корень.
Я конечно не читал этой http://forum.hiasm.com/topic/66245/1 литературы, но выводы уже давно сделал абсолютно такие-же.
Я вообще делал, но так не надо делать, GUI на Hiasm, а всё остальное на каком-нибудь другом языке в виде COM. Т.е. компиляция именно на этом языке.
Добавлял дополнительную секцию к exe (пересчёт relocation, ...).
Переадресация EP на регистрацию COM, а потом передача на старую EP.
На программке сделанной на Hiasm(IC) это занимает доли секунды.
Всё работает со свистом. Во всяком случае, сбоев связанных с такой технологией пока не наблюдал.

Мне нравится, что делает Nic Николс.
Но иногда задаюсь вопросом, а разве нельзя всё сделать без Hiasm на этом-же языке?
И не надо перегонять OBJ coff в OBJ omf и делать остальные телодвижения.
Если добавлять не в виде секции, а как obj.
Шучу я, но как известно - в каждой шутке лишь доля шутки.

Делать OBJ тоже вариант...

Редактировалось 6 раз(а), последний 2019-01-20 18:14:24
карма: 3

0
Ответов: 1416
Рейтинг: 98
#231: 2019-01-20 20:04:16 ЛС | профиль | цитата
Надеюсь, что Nic не будет сильно ругаться, что отошли от темы.
Пример
Вот сделал примерчик на скорую руку http://forum.hiasm.com/getfile/38572 .
В папках архива показаны этапы и результаты, что делает DLL2Obj-delph.exe.
Папка 1 к теме не относится и как получить Lib вариантов масса, мы-же говорим о OBJ сделанных на "левых" языках.
В папке 5-DEMO-BassTest-static собственно сама компиляция с obj.
Жмём на BassTest.dpr, у кого Delphi-7 установлен.

Редактировалось 1 раз(а), последний 2019-01-20 20:07:36
карма: 3

0
Ответов: 54
Рейтинг: 1
#232: 2019-01-20 20:55:40 ЛС | профиль | цитата
Nic, спасибо за отзывчивость и полезные ссылки.
Резюмируя выше сказанное... у Вас огромный опыт в программировании, и с этим не поспоришь. Я вот уже более 10-ти лет пытаюсь применить HiAsm (в различных вариантах) в своём деле... И если честно успехи очень скромные. Не ужели пользоваться этой чудесной программой есть возможность только у опытных программистов?

Nic писал(а):
Маркетолог из меня никакой, поэтому "идём на ощупь", но "опираемся на плечи гигантов".

У меня есть существенный опыт в организации бизнес процессов и реализации подобных проектов. Несколько советов по доброте душевной услышьте пожалуйста: Концепция "Создать программу в HiAsm так же просто, как собрать фигурку из деталей лего" по своей сути гениальна! Но вот уже в который раз Вы и предыдущие разработчики пытаетесь идти на ощупь, и до конца всю мощь потенциала, никто так и не раскрыл. Реализовано несколько пакетов, которыми активно пользуется несколько десятков, и без того хороших программистов. Программа не пошла в широкие массы. И очень жаль! А всё по тому, что первым делом нужно спросить у этой широкой аудитории: В каком виде им представляется заявленная концепция? После этого, обратным ответом все представления аккумулируются, опционально фрагментируются и расставляются в приоритетном порядке. Далее коллегиально, среди группы специалистов обсуждается каким образом оптимально возможно реализовать проект. Когда есть чёткое представление, о способах реализации, составляется план и график. (это, очень у прощеный сценарий)
До тех пор пока не будет проделана выше описная работа, все последующие шаги бессмысленны.

На сколько я понял HiAsm.NET и RTCG.NET до коробочной версии v1.0 ещё далеко... придётся пока ковырять RTCG

andrestudio писал(а):
лучше сделать упор для кодо-генератора целевого языка, т.е написать свою CodeGen.dll. Время конечно много уйдёт, но я думаю оно с лихвой окупится при написании компонентов на целевом языке а не при симбиозе как предлагается. По мне так это только и убило многие пакеты, т.к поддерживать их кому то ещё "это секс ещё тот"...


andrestudio, мои вам аплодисменты!
карма: 0

0
Главный модератор
Ответов: 2741
Рейтинг: 358
#233: 2019-01-20 21:32:12 ЛС | профиль | цитата
brown-aleks писал(а):
Не ужели пользоваться этой чудесной программой есть возможность только у опытных программистов?

Всё зависит от того, что Вы вкладываете в понятие пользоваться. Если речь идёт о создании своего пакета и наполнении его элементами, то да. Так как кроме знания целевого языка надо быть ещё способным построить инфраструктуру пакета с папками, файлами, библиотеками, скриптами инсталляции. На Вашем примере я видел сколько усилий Вы и автор приложили, чтобы сдвинуть процесс с мёртвой точки и это для версии HiAsm 4, в которой есть описание этого процесса. Если Вы сейчас будете делать это для HiAsm.NET усилий придётся затратить ещё больше, так как описания практически нет, до релиза ещё далёко и RTCG.NET пока заточен только под базовый пакет.
brown-aleks писал(а):
У меня есть существенный опыт в организации бизнес процессов и реализации подобных проектов.

Так применили бы этот опыт самостоятельно - не мне Вас учить как.
brown-aleks писал(а):
...придётся пока ковырять RTCG


brown-aleks писал(а):
andrestudio, мои вам аплодисменты!

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

Редактировалось 4 раз(а), последний 2019-01-21 08:41:49
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Ответов: 4423
Рейтинг: 472
#234: 2019-01-21 09:36:00 ЛС | профиль | цитата
Nic, спорить не буду но есть ФАКТ. Когда Dilma предложил нашему уважаемому коллеге tsdima пилить пакет FASM на FTCG то он тонко намекнул что ему такое "кунг-фу" не надо и просто написал свою CodeGen.dll. Вот такой прагматичный и элегантный подход...
карма: 4

0
Главный модератор
Ответов: 2741
Рейтинг: 358
#235: 2019-01-21 10:21:55 ЛС | профиль | цитата
andrestudio писал(а):
ему такое "кунг-фу" не надо и просто написал свою CodeGen.dll

"Самая короткая дорога это та, которую ты знаешь".
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Главный модератор
Ответов: 2741
Рейтинг: 358
#236: 2019-01-30 10:44:02 ЛС | профиль | цитата
  Опубликовано обновление программы. Сделаны элементы базового пакета HCTplListView и HCImageList. Для их реализации пришлось сделать новый редактор формы, так как использование старого редактора сильно урезало функционал этих элементов. В общей сложности их разработка заняла несколько месяцев и не всё пока гладко, но в процессе использования, надеюсь, доработаем их:
Demo



Редактировалось 5 раз(а), последний 2019-01-30 12:07:27
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Главный модератор
Ответов: 2741
Рейтинг: 358
#237: 2019-01-30 12:06:23 ЛС | профиль | цитата
Использование элемента HCTplListView в проекте Core и проекте Windows Forms.

Редактировалось 2 раз(а), последний 2019-01-30 12:12:58
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
файлы: 2Core_ListView.sha.zip [12.4KB] [81], WF_ListView.sha.zip [12.4KB] [85]
Главный модератор
Ответов: 2741
Рейтинг: 358
#238: 2019-02-04 12:01:01 ЛС | профиль | цитата
  Опубликовано обновление программы. Сделан элемент базового пакета HCSpeech. Предоставляет доступ к функциям установленного модуля синтеза речи. В частности, позволяет сохранять текст в wave file с заданными установками звука (частота дискретизации, разрядность, количество каналов):
Examples

Проект Core:
Add(hcTplForm,2953706,224,70)
{
StartPosition=4
link(onCreate,5:doInline,[])
Point(doCaption)
}
Add(hcTplButton,2,322,70)
{
Left=16
Top=45
Caption="Speech"
link(onClick,6:doInline,[])
AddHint(-2,36,40,13,Caption)
}
Add(hcTplEdit,3,378,21)
{
Left=77
Top=46
Width=188
Anchor=13
Text="ahoj"
}
Add(hcTplComboBox,4,322,21)
{
Left=77
Top=19
Width=188
Anchor=13
Point(doSelectedIndex)
Point(Items)
Point(SelectedItem)
}
Add(hcInline,5,273,70)
{
Code=#58:// Сигнатура метода: public object doInline(object[] args)|0:|65:var items = (args[0] as TData).data as ComboBox.ObjectCollection;|0:|46:SpeechSynthesizer s = new SpeechSynthesizer();|0:|52:foreach (InstalledVoice v in s.GetInstalledVoices())|32: items.Add(v.VoiceInfo.Name);|0:|9:return 0;|
Arguments=1
ReferencedAssemblies=#10:System.dll|24:System.Windows.Forms.dll|105:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Speech\v4.0_4.0.0.0__31bf3856ad364e35\System.Speech.dll|21:C:\HiAsm.NET\MSDK.dll|
Imports=#6:System|20:System.Windows.Forms|23:System.Speech.Synthesis|5:HiAsm|
DebugInfo=0
link(onResult,4:doSelectedIndex,[(316,76)(316,34)])
link(onError,11:doWork2,[(316,83)(316,125)])
link(Arg1,4:Items,[(279,65)(328,65)])
}
Add(hcInline,6,371,70)
{
Code=#58:// Сигнатура метода: public object doInline(object[] args)|0:|46:SpeechSynthesizer s = new SpeechSynthesizer();|49:string voicename = (args[0] as TData).toStr();|49:string text = (args[1] as TData).toStr();|34:s.SetOutputToDefaultAudioDevice();|25:s.SelectVoice(voicename);|19:s.SpeakAsync(text);|0:|12:return null;|
Arguments=2
ReferencedAssemblies=#10:System.dll|105:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Speech\v4.0_4.0.0.0__31bf3856ad364e35\System.Speech.dll|21:C:\HiAsm.NET\MSDK.dll|
Imports=#6:System|23:System.Speech.Synthesis|5:HiAsm|
DebugInfo=0
link(onError,11:doWork1,[(417,83)])
link(Arg1,4:SelectedItem,[(377,66)(335,66)])
link(Arg2,20:Var2,[])
}
Add(hcMessage,7,434,119)
{
Caption="Error"
Icon=1
}
Add(HubEx,11,413,119)
{
link(onEvent,7:doMessage,[])
}
Add(hcSpeech,8,119,84)
{
link(onSpeakStarted,18:doWork2,[])
link(onSpeakCompleted,18:doWork3,[(163,104)])
link(Text,13:Text,[])
Point(doSpeakAsync)
Point(doPause)
Point(doResume)
Point(State)
}
Add(hcTplButton,9,63,63)
{
Left=16
Top=231
Anchor=6
Caption="Speech"
link(onClick,8:doSpeakAsync,[(107,69)(107,97)])
AddHint(-50,6,40,13,Caption)
}
Add(hcTplButton,10,63,98)
{
Left=77
Top=231
Anchor=6
Caption="Pause"
link(onClick,8:doPause,[])
AddHint(-43,6,34,13,Caption)
}
Add(hcTplButton,12,63,133)
{
Left=138
Top=231
Anchor=6
Caption="Resume"
link(onClick,8:doResume,[(108,139)(108,111)])
AddHint(-54,5,44,13,Caption)
}
Add(hcTplEdit,13,119,35)
{
Left=16
Top=97
Width=249
Height=122
Anchor=15
Text="Конструктор программ позволяет каждому пользователю ПК начать программировать без знания каких бы то ни было языков высокого уровня сразу же после установки среды. Создать программу в HiAsm так же просто, как собрать фигурку из деталей лего - достаточно выбрать необходимый набор компонентов и соединить их друг с другом в цельную конструкцию.\r\n"
Multiline=0
}
Add(hcTplLabel,14,273,21)
{
Left=21
Top=21
Caption="Voice:"
Alignment=5
}
Add(hcSpeech,15,476,70)
{
Output=1
SampleRate=8000
link(Text,20:Var3,[(482,61)])
link(Filename,19:Text,[])
}
Add(hcTplButton,16,434,70)
{
Left=16
Top=71
Caption="Save"
link(onClick,15:doSpeak,[])
AddHint(-2,-30,28,13,Caption)
}
Add(hcTplEdit,19,483,21)
{
Left=77
Top=72
Width=188
Anchor=13
Text="c:\test.wav"
}
Add(GetDataEx,20,378,56)
{
link(Data,3:Text,[])
}
Add(DoData,17,175,84)
{
link(onEventData,2953706:doCaption,[])
link(Data,8:State,[(181,70)(168,70)(168,126)(132,126)])
}
Add(HubEx,18,159,84)
{
link(onEvent,17:doData,[])
}
Проект Windows Forms:
Add(EntryPoint,2953706,231,91)
{
StartPosition=1
link(onCreate,5:doInline,[])
Point(doText)
}
Add(hcTplButton,2,329,91)
{
Left=16
Top=45
Caption="Speech"
link(onClick,6:doInline,[])
AddHint(-2,36,40,13,Caption)
}
Add(hcTplEdit,3,385,42)
{
Left=77
Top=46
Width=188
Anchor=13
Text="ahoj"
Multiline=0
}
Add(hcTplComboBox,4,329,42)
{
Left=77
Top=19
Width=188
Anchor=13
Point(doSelectedIndex)
Point(Items)
Point(SelectedItem)
}
Add(hcInline,5,280,91)
{
Code=#58:// Сигнатура метода: public object doInline(object[] args)|0:|49:var items = args[0] as ComboBox.ObjectCollection;|0:|46:SpeechSynthesizer s = new SpeechSynthesizer();|0:|52:foreach (InstalledVoice v in s.GetInstalledVoices())|32: items.Add(v.VoiceInfo.Name);|0:|9:return 0;|
Arguments=1
ReferencedAssemblies=#10:System.dll|24:System.Windows.Forms.dll|105:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Speech\v4.0_4.0.0.0__31bf3856ad364e35\System.Speech.dll|21:C:\HiAsm.NET\MSDK.dll|
Imports=#6:System|20:System.Windows.Forms|23:System.Speech.Synthesis|5:HiAsm|
DebugInfo=0
link(onResult,4:doSelectedIndex,[(323,97)(323,55)])
link(onError,11:doWork2,[(323,104)(323,146)])
link(Arg1,4:Items,[(286,86)(335,86)])
}
Add(hcInline,6,378,91)
{
Code=#58:// Сигнатура метода: public object doInline(object[] args)|0:|46:SpeechSynthesizer s = new SpeechSynthesizer();|40:string voicename = args[0] as string;|40:string text = args[1] as string;|34:s.SetOutputToDefaultAudioDevice();|25:s.SelectVoice(voicename);|19:s.SpeakAsync(text);|0:|12:return null;|
Arguments=2
ReferencedAssemblies=#10:System.dll|105:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Speech\v4.0_4.0.0.0__31bf3856ad364e35\System.Speech.dll|21:C:\HiAsm.NET\MSDK.dll|
Imports=#6:System|23:System.Speech.Synthesis|5:HiAsm|
DebugInfo=0
link(onError,11:doWork1,[(424,104)])
link(Arg1,4:SelectedItem,[(384,87)(342,87)])
link(Arg2,20:Var2,[])
}
Add(hcMessage,7,441,140)
{
Caption="Error"
Icon=1
}
Add(HubEx,11,420,140)
{
link(onEvent,7:doMessage,[])
}
Add(hcSpeech,8,119,91)
{
link(onSpeakStarted,22:doWork2,[])
link(onSpeakCompleted,22:doWork3,[(165,111)])
link(Text,13:Text,[])
Point(doSpeakAsync)
Point(doPause)
Point(doResume)
Point(State)
}
Add(hcTplButton,9,63,70)
{
Left=16
Top=231
Anchor=6
Caption="Speech"
link(onClick,8:doSpeakAsync,[(107,76)(107,104)])
AddHint(-50,6,40,13,Caption)
}
Add(hcTplButton,10,63,105)
{
Left=77
Top=231
Anchor=6
Caption="Pause"
link(onClick,8:doPause,[])
AddHint(-43,6,34,13,Caption)
}
Add(hcTplButton,12,63,140)
{
Left=138
Top=231
Anchor=6
Caption="Resume"
link(onClick,8:doResume,[(108,146)(108,118)])
AddHint(-54,5,44,13,Caption)
}
Add(hcTplEdit,13,119,42)
{
Left=16
Top=97
Width=249
Height=122
Anchor=15
Text="Конструктор программ позволяет каждому пользователю ПК начать программировать без знания каких бы то ни было языков высокого уровня сразу же после установки среды. Создать программу в HiAsm так же просто, как собрать фигурку из деталей лего - достаточно выбрать необходимый набор компонентов и соединить их друг с другом в цельную конструкцию.\r\n"
Multiline=0
}
Add(hcTplLabel,14,280,42)
{
Left=21
Top=21
Caption="Voice:"
Alignment=5
}
Add(hcSpeech,15,483,91)
{
Output=1
SampleRate=8000
link(Text,20:Var3,[(489,82)])
link(Filename,19:Text,[])
}
Add(hcTplButton,16,441,91)
{
Left=16
Top=71
Caption="Save"
link(onClick,15:doSpeak,[])
AddHint(-2,-30,28,13,Caption)
}
Add(hcTplEdit,19,490,42)
{
Left=77
Top=72
Width=188
Anchor=13
Text="c:\test.wav"
}
Add(GetDataEx,20,385,77)
{
link(Data,3:Text,[])
}
Add(DoData,18,182,91)
{
link(onEventData,2953706:doText,[])
link(Data,8:State,[(188,77)(172,77)(172,133)(132,133)])
}
Add(HubEx,22,161,91)
{
link(onEvent,18:doData,[])
}

Редактировалось 1 раз(а), последний 2019-07-21 18:31:38
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Главный модератор
Ответов: 2741
Рейтинг: 358
#239: 2019-02-07 12:23:05 ЛС | профиль | цитата
В связи с ремонтом электросети доступ к ресурсам программы будет ограничен до вечера 8 февраля 2019 года. Просим прощения за возможное неудобство
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Главный модератор
Ответов: 2741
Рейтинг: 358
#240: 2019-02-10 05:14:12 ЛС | профиль | цитата
  Опубликовано обновление программы. Сделан элемент базового пакета HCVBJScript. Позволяет выполнять сценарии на языках VBScript и JScript. По возможностям близок к элементу VBJScript пакета Windows.
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
файлы: 1HiAsmNET_VBJScript.sha.zip [2.3KB] [77]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)