Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как делать разработку более глобально?

Вот читаешь форумы, люди занимаются разработкой.
недовольны средой разработки, делают свою, недовольны системой разработки отчетов - делают свою.
Как так получается?
Вот используешь какой-то язык и среду разработки, что-то пишешь. Кристал репортс есть, всех вроде все устраивает.
Как люди приходят к мысли, что надо затеять что-то более глобальное?
Я просто не представляю как можно делать свою систему отчетности, с чего начать и так далее.
Ответ:
scf
1. если отчеты делают программисты: переводят .doc в rtf, заворачивают в шаблонизатор и выдают в виде pdf. В этом случае задача решается за минимальное время, но это время тратят высокооплачиваемые программисты.
2. если отчеты делают девочки: они долго изучают систему генерации отчетов, потом долго учатся верстать в ней формы так, чтобы результат совпал попиксельно с требованиями. Но это может быть выгодно, т.к. девочки лучше масштабируются и требуют меньше зп.

Программисты делают свой шаблонизатор, учат девочку им пользоваться -- девочка нормально рисует отчеты в Word'е
При необходимости поправить одну/две буквы, сменить шрифт - даже и сами пользователи, при желании, могут

Профит.

IMHO Что бы править разметку в средства наподобие RTF-шаблонов в Oracle XML Publisher'а - много знаний не нужно.
Вопрос: 1С на C# - система разработки бизнес-приложений

Доброго времени суток.
Для тех кто создает бизнес-приложения, кто когда-то писал на 1С8, но хочет это делать в .Net примерно так же легко и быстро.
Предлагаю рассмотреть библиотеку разработки бизнес-приложений АэроСофт. Написана исключительно на C# и представляет из себя обычную сборку подключаемую к проекту.

Какие цели преследую...
1. Будет ли полезно то, что сделал
2. Если полезно, то насколько это Вам поможет в вашей работе
3. Это не шутка - чуть меняем главную точку входа в приложение и ...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Reflection;
using AirSoft.Prime;
 
namespace AirSoft.Shop
{
  static class Program
  {
    /// <summary>
    /// Главная точка входа для приложения.
    /// </summary>
    [STAThread]
    static void Main()
    {
      GlobalContext.Initialize(Assembly.GetExecutingAssembly());
    }
  }
}
Если интересно, пишите. Буду рад.
Ответ: интересно!
Вопрос: Литература: файловые системы

Не нашел в какой раздел написать, написал сюда.
Собственно интересует литература по файловым системам. То есть как они устроены на низком уровне, где и какие таблицы располагаются на винчестере и т.п. Например чтобы я смог написать программу выводящую список файлов используя только функцию чтения устройства по секторам.
Ответ: Есть книга "Practical File System Design" Доминика Гиампаоло, в которой строение файловой системы описывается на примере малопопулярной ныне BFS. Эта книга распространяется бесплатно:

Также смотрите главу "Файловые системы" в книге "Операционные системы. Разработка и реализация" Таненбаума
Вопрос: Столько разделов в Java, расскажите разницу между ними. Кроссплатформенная разработка приложений + 3D Графика

Столько разделов в Java, расскажите разницу между ними.
Интересует кроссплатформенная разработка приложений + 3D Графика.

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

Какие языки предложите для кроссплатформенности?
Какую среду для разработки приложения?
Какой язык? Предполагается понять на что способна Java? И почему так много разделов в Java.

Необходимо создавать приложение для операционной системы: Windows, Mac, Linux и другие. Также не плохо бы приложения под андроид рассмотреть.

При этом должна быть реализована трехмерная графика.

Про Unity 3D, unreal engine 4, QT, знаком, может есть еще что-то другое?
Ответ: infobos, Фреймворк - это каркас заточенный специально для создания чего либо на этом языке. Фреймворки есть под разные языки. Например, для Java популярный Spring Framework - который упрощает разработку сложных бизнес-приложений вне тяжеловесных программных моделей, как например принято в Java Enterprise.
Или другой пример популярный фреймворк для PHP Yii, который позволяет применить концепцию повторного использования кода и может существенно ускорить процесс веб-разработки. Название Yii (произносится как Yee или [ji:]) означает простой (easy), эффективный (efficient) и расширяемый (extensible).

Что бы еще было понятнее вот из Википедии отличие от библиотеки: «Фреймворк» отличается от понятия библиотеки тем, что библиотека может быть использована в программном продукте просто как набор подпрограмм близкой функциональности, не влияя на архитектуру программного продукта и не накладывая на неё никаких ограничений. В то время как «фреймворк» диктует правила построения архитектуры приложения, задавая на начальном этапе разработки поведение по умолчанию — «каркас», который нужно будет расширять и изменять, согласно указанным требованиям.

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

Всем привет, ситуация такая:
Сейчас появилось время и решил снова заняться разработкой САПР для машиностроения.
Для чего? Считаю КОМПАС 3д недоработанным и отсталым проектом лет этак на 10. Зарубежные аналоги не особо вписываются в стандарты ГОСТ и пр. Кроме прочего - основная часть этих САПР проприетарные и закрытые, что исключает возможность добавления нужных фич. Порой инженеру-конструктору это мешает. Мешает неразбериха с форматами, полезно было бы добавить расчетные утилиты, дабы ускорить и упростить разработку проектируемой конструкции. На мой взгляд стоит проектировать именно универсальный комбайн. Кроме того - есть мнение, что закрытые САПР могут воровать информацию о разработке, так же платформа windows сама по себе уязвимая, из-за кучи способов ее заражения, по этому целевой платформой вижу debian.

В общем нужен хороший совет, какую архитектуру разработки приложения использовать?
Каким образом мне разделить части моего проекта по библиотекам so/dll ?
Таскать все в одном бинарнике не хорошо, да и куча проблем наверное появится с совместимостью. А так по идее, если кусок кода не критичен, то прога сможет работать и без него. (что важно)
Каким образом связать все элементы находящиеся в библиотеках? (через фактории или еще как?)
Желательно разделить всю программу на потоки, чтобы если вдруг какая то расчетная тулза упадет, то приложение не крашилось.

Каким я вижу этот проект:
- gui удобное и практичное , на подобие blender / возможность локализовать под любой язык с минимумом изврата
- Платформа linux/windows (если понадобится)
- Моделирование детали / сборки
- Анимация сборки, для визуализации работы узла
- Встроенный аналог ansys
- базы данных материалов черные металлы/цветные металлы/ пластики и тд
- lua script для автоматизации (определенных видов работ) и расширения программы помимо плагинов
- система плагинов
и тд.
Собственно я не гений, и все сам не реализую, однако приложу столько сил сколько смогу. Проект задуман как свободный, думаю заинтересованные лица помогут, но для этого нужно начать ( прошлый проект выбросил из-за плохой архитектуры и костылей) .
В общем прошу СПЕЦИАЛИСТОВ помочь.
Всем заранее спасибо.
Ответ: Прошу прощения, не было возможности зайти на форум.
Mr.X, В принципе у меня в голове есть примерное представление того, что я хочу написать.
Да и существующие САПР дают ориентир в этом плане. Можно (у краткой) пореверсить тот же КОМПАС 3Д, подсмотреть некоторые моменты и все такое...
Дело в другом. Я хочу грамотно оформить код, чтобы энтузиастам и мне было:
1) просто дополнять это дело, развивать проект (дополнения нужны как в сам код САПР, так и плагины и скрипты)
2) чтобы система была устойчива, во всех планах (оградите от лишних граблей пожалуйста)
Есть же какие то подходящие готовые решения?
И еще.
К примеру я выделил базовые классы, функции и определил как части Render, Core, N.. и хочу их вынести их
из основного приложения в библиотеки. Вот здесь меня особо интересуют современные и проверенные решения.

Я прошу прощения, конечно, наверное все никак не могу выразить свою мысль правильно.
это всё работа делает мозги набекрень , да я и самоучка к тому же)
П.С. если у вас есть хрустальный шар и вы догадываетесь о чем я, скажите - для моих целей фабрика классов будет вменяемым решением?
Вопрос: Разработка собственного провайдера для БД. Делюсь опытом и прошу критики

Здравствуйте, коллеги.

В своих разработках мы придерживаемся принципа разделения приложения на слои:

1. Слой доступа к данным - DAL
2. Слой бизнес-логики - BL
3. Слой представления - UI

В связи с этим большую часть модулей приложений мы разрабатываем вручную, не прибегая к использованию визуальных компонентов. Все визуальные компоненты (кнопки, гриды, мемо и т. п.) только в слое UI. Также мы поступили и со слоем DAL, разработав собственный провайдер для доступа к базе данных Oracle. Активно используем его уже лет 5 и пока он покрывает все наши нужды.

Представляю его вашему вниманию и прошу объективной критики по любому поводу.

Интерфейс провайдера:
+
    unit OracleProviderInterface;
     
    interface
     
    uses
          Ora, DB, Variants, SysUtils, Classes, Contnrs,
     
          Spring.Collections
          ;
     
    /// <summary>
    ///   Parameters data type enumeration
    /// </summary>
    type
          TParamDataType = ( pdtDefault = 1, pdtBlob = 2, pdtTable = 3, pdtClob = 4 );
     
    /// <summary>
    ///   Class for CDB database parameter
    /// </summary>
    type
          TCDBOraParam = Class ( TOraParam )
     
          public
     
                {$REGION 'Fields'}
     
                /// <summary>
                /// Gets or sets parameter data type
                /// </summary>
                ParamDataType : TParamDataType;
     
                {$ENDREGION}
     
                {$REGION 'Constructors'}
     
                /// <summary>
                ///   Creates TCDBOraParam instance
                /// </summary>
                constructor Create ();
     
                {$ENDREGION}
     
    end;
     
    /// <summary>
    /// Interface for database provider
    /// </summary>
    type
     
          IDatabaseProvider = interface ( IInterface )
          ['{BF277F9C-D046-4015-8E17-6B4C67CC021B}']
     
          {$REGION 'Methods'}
     
          /// <summary>
          ///   Executes SQL query passed with parameters
          /// </summary>
          /// <param name="query">SQL query text</param>
          /// <param name="parameters">Binded query parameters</param>
          /// <returns>Query execution results</returns>
          function ExecuteQuery ( query : String; const parameters : IList<TCDBOraParam> = nil ) : TDataSet;
     
          /// <summary>
          ///   Executes non-selective (insert, update, delete) SQL passed with parameters
          /// </summary>
          /// <param name="query">SQL query text</param>
          /// <param name="parameters">Binded query parameters</param>
          /// <returns>Number of rows affected</returns>
          function ExecuteNonQuery ( query : String; const parameters : IList<TCDBOraParam> = nil ) : Integer;
     
          /// <summary>
          ///   Executes stored procedure with particular parameters
          /// </summary>
          /// <param name="procedureName">Stored procedure name</param>
          /// <param name="parameters">Binded query parameters</param>
          /// <returns>Execution results</returns>
          function ExecuteProcedure ( procedureName : String; const parameters : IList<TCDBOraParam> = nil ) : TOraParams;
     
          /// <summary>
          ///   Begins session transaction
          /// </summary>
          procedure BeginTransaction ();
     
          /// <summary>
          ///   Commits current session transaction
          /// </summary>
          procedure CommitTransaction ();
     
          /// <summary>
          ///   Rollbacks current session transaction
          /// </summary>
          procedure RollbackTransaction ();
     
          /// <summary>
          /// Creates parameter
          /// </summary>
          /// <param name="name">Parameter name</param>
          /// <param name="value">Parameter value</param>
          /// <param name="paramType">Parameter type (e.g. input or output)</param>
          /// <param name="paramDataType">Parameter data type (e.g. default or BLOB)</param>
          /// <returns>Binded parameter</returns>
          function CreateParameter ( name : String; value : Variant; paramType : TParamType = ptInput; paramDataType : TParamDataType = pdtDefault ) : TCDBOraParam; overload;
     
          /// <summary>
          ///   Connects to the server
          /// </summary>
          procedure OpenSession ();
     
          /// <summary>
          ///   Disconnects from the server
          /// </summary>
          procedure CloseSession ();
     
          /// <summary>
          /// Gets session
          /// </summary>
          /// <returns>Connection session</returns>
          function GetSession () : TOraSession;
     
          {$ENDREGION}
     
          {$REGION 'Properties'}
     
          /// <summary>
          ///   Connection session
          /// </summary>
          property Session : TOraSession read GetSession;
     
          {$ENDREGION}
     
    end;
     
    implementation
     
    { TCDBOraParam }
     
    /// <summary>
    ///   Creates TCDBOraParam instance
    /// </summary>
    constructor TCDBOraParam.Create ();
    begin
     
          inherited Create ( nil );
     
          ParamDataType := pdtDefault;
     
    end;
     
    end.

Реализация:

+
    unit OracleProvider;
     
    interface
     
    uses
          Ora, DB, Variants, SysUtils, Classes, Contnrs, MemData, DBAccess,
     
          Spring.Container,
          Spring.Collections,
     
          //BL
          OracleProviderInterface
          ;
     
    /// <summary>
    ///   Data provider to Oracle database
    /// </summary>
    type
          TOracleProvider = class ( TInterfacedObject, IDatabaseProvider )
     
          private
     
                {$REGION 'Fields'}
     
                /// <summary>
                ///   Database session
                /// </summary>
                _session : TOraSession;
     
                /// <summary>
                ///   Query
                /// </summary>
                _query : TOraQuery;
     
                /// <summary>
                ///   SQL-expression
                /// </summary>
                _sql : TOraSQL;
     
                /// <summary>
                ///   Stored procedure
                /// </summary>
                _storedProcedure : TOraStoredProc;
     
                /// <summary>
                ///   Flag to understand who owns session
                /// </summary>
                _isOwnSession : Boolean;
     
                /// <summary>
                ///   Connection string
                /// </summary>
                _connectionString : String;
     
                {$ENDREGION}
     
                {$REGION 'Methods'}
     
                /// <summary>
                /// Gets parameter's field type by Variant value
                /// </summary>
                /// <param name="value">value</param>
                /// <returns>Field type for TOraParam</returns>
                function GetFieldType ( value : Variant ) : TFieldType;
     
                /// <summary>
                ///   Initializes class inner objects
                /// </summary>
                /// <param name="isOwnSession">Flag to understand who owns session</param>
                procedure Initialize ( isOwnSession : Boolean );
     
                /// <summary>
                /// Gets session
                /// </summary>
                /// <returns>Connection session</returns>
                function GetSession () : TOraSession;
     
                {$ENDREGION}
     
          public
     
                {$REGION 'Methods'}
     
                /// <summary>
                ///   Executes SQL query passed with parameters
                /// </summary>
                /// <param name="query">SQL query text</param>
                /// <param name="parameters">Binded query parameters</param>
                /// <returns>Query execution results</returns>
                function ExecuteQuery ( query : String; const parameters : IList<TCDBOraParam> = nil ) : TDataSet;
     
                /// <summary>
                ///   Executes non-selective (insert, update, delete) SQL passed with parameters
                /// </summary>
                /// <param name="query">SQL query text</param>
                /// <param name="parameters">Binded query parameters</param>
                /// <returns>Number of rows affected</returns>
                function ExecuteNonQuery ( query : String; const parameters : IList<TCDBOraParam> = nil ) : Integer;
     
                /// <summary>
                ///   Executes stored procedure with particular parameters
                /// </summary>
                /// <param name="procedureName">Stored procedure name</param>
                /// <param name="parameters">Binded query parameters</param>
                /// <returns>Execution results</returns>
                function ExecuteProcedure ( procedureName : String; const parameters : IList<TCDBOraParam> = nil ) : TOraParams;
     
                /// <summary>
                ///   Begins session transaction
                /// </summary>
                procedure BeginTransaction ();
     
                /// <summary>
                ///   Commits current session transaction
                /// </summary>
                procedure CommitTransaction ();
     
                /// <summary>
                ///   Rollbacks current session transaction
                /// </summary>
                procedure RollbackTransaction ();
     
                /// <summary>
                /// Creates parameter
                /// </summary>
                /// <param name="name">Parameter name</param>
                /// <param name="value">Parameter value</param>
                /// <param name="paramType">Parameter type (e.g. input or output)</param>
                /// <param name="paramDataType">Parameter data type (e.g. default or BLOB)</param>
                /// <returns>Binded parameter</returns>
                function CreateParameter ( name : String; value : Variant; paramType : TParamType = ptInput; paramDataType : TParamDataType = pdtDefault ) : TCDBOraParam; overload;
     
                /// <summary>
                ///   Connects to the server
                /// </summary>
                procedure OpenSession ();
     
                /// <summary>
                ///   Disconnects from the server
                /// </summary>
                procedure CloseSession ();
     
                {$ENDREGION}
     
                {$REGION 'Constructors'}
     
                /// <summary>
                ///   Creates TOracleProvider instance with particular connection string
                /// </summary>
                /// <param name="connectionString">Connection string</param>
                constructor Create ( const connectionString : String ); overload;
     
                /// <summary>
                ///   Creates TOracleProvider instance with particular session
                /// </summary>
                /// <param name="oracleSession">Connection session</param>
                constructor Create ( const oracleSession : TOraSession ); overload;
     
                {$ENDREGION}
     
                {$REGION 'Destructors'}
     
                /// <summary>
                ///   Safely destroys TOracleProvider instance
                /// </summary>
                destructor Destroy (); override;
     
                {$ENDREGION}
     
                {$REGION 'Properties'}
     
                /// <summary>
                ///   Connection session
                /// </summary>
                property Session : TOraSession read GetSession;
     
                {$ENDREGION}
     
    end;
     
    implementation
     
    {TOracleProvider}
     
    /// <summary>
    ///   Creates TOracleProvider instance with particular connection string
    /// </summary>
    /// <param name="connectionString">Connection string</param>
    constructor TOracleProvider.Create ( const connectionString : String );
    begin
     
          _connectionString := connectionString;
     
          Initialize ( true );
     
    end;
     
    /// <summary>
    ///   Creates TOracleProvider instance with particular session
    /// </summary>
    /// <param name="oracleSession">Connection session</param>
    constructor TOracleProvider.Create ( const oracleSession : TOraSession );
    begin
     
          _session := oracleSession;
     
          Initialize ( false );
     
    end;
     
    /// <summary>
    ///   Initializes class inner objects
    /// </summary>
    /// <param name="isOwnSession">Flag to understand who owns session</param>
    procedure TOracleProvider.Initialize ( isOwnSession : Boolean );
    begin
     
          if isOwnSession then begin
                _session := TOraSession.Create ( nil );
                _session.ConnectString  := _connectionString;
                _session.Connected := false;
                _session.LoginPrompt := false;
                _session.Options.Direct := true;
                _session.AutoCommit := false;
                _session.Options.NeverConnect := true;
                _session.Pooling := true;
          end;
     
          _query := TOraQuery.Create ( nil );
          _query.Session := _session;
          _query.AutoCommit := false;
          _query.FetchAll := true;
     
          _sql := TOraSQL.Create ( nil );
          _sql.Session := _session;
          _sql.AutoCommit := false;
     
          _storedProcedure := TOraStoredProc.Create ( nil );
          _storedProcedure.Session := _session;
          _storedProcedure.AutoCommit := false;
          _storedProcedure.FetchAll := true;
     
          _isOwnSession := isOwnSession;
     
    end;
     
    /// <summary>
    ///   Safely destroys TOracleProvider instance
    /// </summary>
    destructor TOracleProvider.Destroy ();
    begin
     
          if _query.Active then begin
                _query.Close ();
          end;
     
          _query.Free ();
     
          if _storedProcedure.Active then begin
                _storedProcedure.Close ();
          end;
     
          _storedProcedure.Free ();
     
          if _isOwnSession then begin
                if _session.Connected then begin
                      _session.Close ();
                end;
     
                _session.Free ();
          end;
     
          inherited;
     
    end;
     
    /// <summary>
    ///   Connects to the server
    /// </summary>
    procedure TOracleProvider.OpenSession ();
    begin
     
          if _session <> nil then begin
                try
                      _session.Open ();
                except
                      on e : Exception do begin
                            raise Exception.Create ( e.Message );
                      end;
                end;
          end;
     
    end;
     
    /// <summary>
    ///   Disconnects from the server
    /// </summary>
    procedure TOracleProvider.CloseSession ();
    begin
     
          if _isOwnSession then begin
                if ( _session <> nil ) AND ( _session.Connected ) then begin
                      try
                            _session.Close ();
                      except
                            on e : Exception do begin
                                  raise Exception.Create ( e.Message );
                            end;
                      end;
                end;
          end;
     
    end;
     
    /// <summary>
    ///   Begins session transaction
    /// </summary>
    procedure TOracleProvider.BeginTransaction ();
    begin
     
          try
                _session.StartTransaction ();
          except
                on e : Exception do begin
                      raise Exception.Create ( e.Message );
                end;
          end;
     
    end;
     
    /// <summary>
    ///   Commits current session transaction
    /// </summary>
    procedure TOracleProvider.CommitTransaction ();
    begin
     
          if _session.InTransaction then begin
                try
                      _session.Commit ();
                except
                      on e : Exception do begin
                            raise Exception.Create ( e.Message );
                      end;
                end;
          end;
     
    end;
     
    /// <summary>
    ///   Rollbacks current session transaction
    /// </summary>
    procedure TOracleProvider.RollbackTransaction ();
    begin
     
          if _session.InTransaction then begin
                try
                      _session.Rollback ();
                except
                      on e : Exception do begin
                            raise Exception.Create ( e.Message );
                      end;
                end;
          end;
     
    end;
     
    /// <summary>
    ///   Executes SQL query passed with parameters
    /// </summary>
    /// <param name="query">SQL query text</param>
    /// <param name="parameters">Binded query parameters</param>
    /// <returns>Query execution results</returns>
    function TOracleProvider.ExecuteQuery ( query : String; const parameters : IList<TCDBOraParam> = nil ) : TDataSet;
     
          var
                i : Integer;
                param : TOraParam;
                dataSet : TDataSet;
     
    begin
     
          dataSet := TDataSet.Create ( nil );
     
          _query.Close ();
          _query.SQL.Text := query;
     
          if Assigned ( parameters ) then begin
                _query.Params.Clear ();
     
                for i := 0 to parameters.Count - 1 do begin
                      param := TOraParam.Create ( nil );
                      param.Name := TOraParam ( parameters[i] ).Name;
                      param.Value := TOraParam ( parameters[i] ).Value;
                      param.ParamType := TOraParam ( parameters[i] ).ParamType;
     
                      _query.Params.AddParam ( param );
                end;
          end;
     
          try
                if _session.Connected then begin
                      _query.Execute ();
     
                      dataSet := _query.Fields.DataSet;
                      dataSet.Active := true;
                end;
          except
                on e : Exception do begin
                      raise Exception.Create ( e.Message );
                end;
          end;
     
          Result := dataSet;
     
    end;
     
    /// <summary>
    ///   Executes stored procedure with particular parameters
    /// </summary>
    /// <param name="procedureName">Stored procedure name</param>
    /// <param name="parameters">Binded query parameters</param>
    /// <returns>Execution results</returns>
    function TOracleProvider.ExecuteProcedure ( procedureName : String; const parameters : IList<TCDBOraParam> = nil ) : TOraParams;
     
          var
                i : Integer;
                j : Integer;
     
    begin
     
          _storedProcedure.Close ();
          _storedProcedure.StoredProcName := procedureName;
          _storedProcedure.Prepare ();
     
          if Assigned ( parameters ) then begin
                for i := 0 to parameters.Count - 1 do begin
                      for j := 0 to _storedProcedure.Params.Count - 1 do begin
                            if _storedProcedure.Params[j].Name = TOraParam ( parameters[i] ).Name then begin
                                  _storedProcedure.Params[j] := TOraParam ( parameters[i] );
     
                                  if TCDBOraParam ( parameters[i] ).ParamDataType = pdtBlob then begin
                                        if ( ( TOraParam ( parameters[i] ).Value <> Null ) AND ( TOraParam ( parameters[i] ).Value <> '') ) then begin
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).DataType := ftOraBlob;
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).ParamType := TOraParam ( parameters[i] ).ParamType;
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).AsOraBlob.LoadFromFile ( TOraParam ( parameters[i] ).Value );
                                        end
                                        else begin
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).DataType := ftOraBlob;
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).ParamType := TOraParam ( parameters[i] ).ParamType;
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).AsOraBlob.FreeBlob ();
                                        end;
                                  end;
     
                                  if TCDBOraParam ( parameters[i] ).ParamDataType = pdtClob then begin
                                        if ( ( TOraParam ( parameters[i] ).Value <> Null ) AND ( TOraParam ( parameters[i] ).Value <> '') ) then begin
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).DataType := ftOraClob;
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).ParamType := TOraParam ( parameters[i] ).ParamType;
                                              _storedProcedure.ParamByName ( TOraParam ( parameters[i] ).Name ).Value := TOraParam ( parameters[i] ).Value;
                                        end;
                                  end;
                            end;
                      end;
                end;
          end;
     
          if _session.Connected then begin
                try
                      _storedProcedure.Execute ();
                      Result := _storedProcedure.Params;
                except
                      on e : Exception do begin
                            raise Exception.Create ( e.Message );
                      end;
                end;
          end
          else begin
                Result := TOraParams.Create ( nil );
          end;
     
    end;
     
    /// <summary>
    ///   Executes non-selective (insert, update, delete) SQL passed with parameters
    /// </summary>
    /// <param name="query">SQL query text</param>
    /// <param name="parameters">Binded query parameters</param>
    /// <returns>Number of rows affected</returns>
    function TOracleProvider.ExecuteNonQuery ( query : String; const parameters : IList<TCDBOraParam> = nil ) : Integer;
     
          var
                i : Integer;
     
    begin
     
          _query.Close ();
          _query.SQL.Clear ();
          _query.SQL.Text := query;
     
          if Assigned ( parameters ) then begin
                _query.Params.Clear ();
     
                for i := 0 to parameters.Count - 1 do begin
                      _query.Params.AddParam ( TOraParam ( parameters[i] ) );
                end;
          end;
     
          if _session.Connected then begin
                _query.ExecSQL ();
                Result := _query.RowsAffected;
          end
          else begin
                Result := 0;
          end;
     
    end;
     
    /// <summary>
    /// Creates parameter
    /// </summary>
    /// <param name="name">Parameter name</param>
    /// <param name="value">Parameter value</param>
    /// <param name="paramType">Parameter type (e.g. input or output)</param>
    /// <param name="paramDataType">Parameter data type (e.g. default or BLOB)</param>
    /// <returns>Binded parameter</returns>
    function TOracleProvider.CreateParameter ( name : String; value : Variant; paramType : TParamType = ptInput; paramDataType : TParamDataType = pdtDefault ) : TCDBOraParam;
     
          var
                parameter : TCDBOraParam;
     
    begin
     
          parameter := TCDBOraParam.Create ();
          parameter.Name := UpperCase ( name );
          parameter.ParamType := paramType;
          parameter.DataType := GetFieldType ( value );
     
          case paramDataType of
                pdtDefault: 
                      begin
                            parameter.Value := value;
                      end;
     
                pdtBlob:
                      begin
                            parameter.Value := value;
                      end;
     
                pdtClob:
                      begin
                            parameter.Value := value;
                      end;
     
                pdtTable:
                      begin
                            parameter.Table := true;
                            parameter.DataType := ftFloat;
                            parameter.Value := value;
                      end;
          end;
     
          parameter.ParamDataType := paramDataType;
     
          Result := parameter;
     
    end;
     
    /// <summary>
    /// Gets parameter's field type by Variant value
    /// </summary>
    /// <param name="value">value</param>
    /// <returns>Field type for TOraParam</returns>
    function TOracleProvider.GetFieldType ( value : Variant ) : TFieldType;
     
          var
                fieldType : TFieldType;
     
    begin
     
          case VarType ( value ) AND VarTypeMask of
                varString : fieldType := TFieldType.ftWideString;
                varUString : fieldType := TFieldType.ftWideString;
                varInteger : fieldType := TFieldType.ftInteger;
                varByte : fieldType := TFieldType.ftInteger;
                varDate : fieldType := TFieldType.ftDate;
          else
                fieldType := TFieldType.ftUnknown;
          end;
     
          Result := fieldType;
     
    end;
     
    /// <summary>
    /// Gets session
    /// </summary>
    /// <returns>Connection session</returns>
    function TOracleProvider.GetSession () : TOraSession;
    begin
     
          Result := _session;
     
    end;
     
    initialization
     
          GlobalContainer.RegisterType<TOracleProvider>.Implements<IDatabaseProvider> ( 'Oracle' );
     
    end.

Использование:

1. Объявляем:

var _provider : IDatabaseProvider;


2. Инициализируем:

var _connectionString := login + '/' + password + '@' + HostName + ':' + Port + ':' + SID;
 
_provider := GlobalContainer.Resolve<IDatabaseProvider> ( 'Oracle', [connectionString] );
_provider.OpenSession ();


3. Собственно использование:

3.1 Получаем выборку (SELECT):

+
function TVSPHelper.GetVSPListByWellId ( wellId : Integer ) : IList<IVSP>;
 
      var
            list : IList<IVSP>;
            item : IVSP;
            query : String;
            dataSet : TDataSet;
            i : Integer;
            j : Integer;
            parameters: IList<TCDBOraParam>;
            report : IReport;
 
begin
 
      query := 'SELECT ' +
                     'id, ' +
                     'comments, ' +
                     'wellbore_id, ' +
                     'wellbore_name, ' +
                     'wellbore_comments, ' +
                     'wellbore_depth, ' +
                     'begin_date, ' +
                     'end_date, ' +
                     'expedition_id, ' +
                     'expedition_name, ' +
                     'organization_id, ' +
                     'organization_name, ' +
                     'subject_id, ' +
                     'subject_name, ' +
                     'well_id, ' +
                     'well_name, ' +
                     'well_comments, ' +
                     'well_x, ' +
                     'well_y, ' +
                     'well_altitude, ' +
                     'well_rotary_table_elevation ' +
               ' FROM ' +
                     'seis.v_vsp ' +
               ' WHERE ' +
                     'well_id = :ID ';
 
      parameters := TCollections.CreateList<TCDBOraParam> ( true );
      parameters.Add ( _provider.CreateParameter ( 'ID', wellId ) );
 
      dataSet := _provider.ExecuteQuery ( query, parameters );
 
      list := TCollections.CreateList<IVSP>;
 
      dataSet.First ();
 
      for i := 0 to dataSet.RecordCount - 1 do begin
            item := GlobalContainer.Resolve<IVSP>;
 
            item.Id := dataSet.FieldByName ( 'id' ).AsInteger;
            item.Comments := dataSet.FieldByName ( 'comments' ).AsString;
            item.BeginDate := dataSet.FieldByName ( 'begin_date' ).AsDateTime;
            item.EndDate := dataSet.FieldByName ( 'end_date' ).AsDateTime;
            item.Wellbore.Id := dataSet.FieldByName ( 'wellbore_id' ).AsInteger;
            item.Wellbore.Name := dataSet.FieldByName ( 'wellbore_name' ).AsString;
            item.Wellbore.Comments := dataSet.FieldByName ( 'wellbore_comments' ).AsString;
            item.Wellbore.Depth := dataSet.FieldByName ( 'wellbore_depth' ).AsFloat;
            item.Expedition.Id := dataSet.FieldByName ( 'expedition_id' ).AsInteger;
            item.Expedition.Name := dataSet.FieldByName ( 'expedition_name' ).AsString;
            item.Organization.Id := dataSet.FieldByName ( 'organization_id' ).AsInteger;
            item.Organization.Name := dataSet.FieldByName ( 'organization_name' ).AsString;
            item.Wellbore.Well.Subject.Id := dataSet.FieldByName ( 'subject_id' ).AsInteger;
            item.Wellbore.Well.Subject.Name := dataSet.FieldByName ( 'subject_name' ).AsString;
            item.Wellbore.Well.Id := dataSet.FieldByName ( 'well_id' ).AsInteger;
            item.Wellbore.Well.Name := dataSet.FieldByName ( 'well_name' ).AsString;
            item.Wellbore.Well.Comments := dataSet.FieldByName ( 'well_comments' ).AsString;
            item.Wellbore.Well.X := dataSet.FieldByName ( 'well_x' ).AsFloat;
            item.Wellbore.Well.Y := dataSet.FieldByName ( 'well_y' ).AsFloat;
            item.Wellbore.Well.Altitude := dataSet.FieldByName ( 'well_altitude' ).AsFloat;
            item.Wellbore.Well.RotaryTableElevation := dataSet.FieldByName ( 'well_rotary_table_elevation' ).AsFloat;
 
            list.Add ( item );
 
            dataSet.Next ();
      end;
 
      Result := list;
 
end;

3.2 Вызов хранимой процедуры:

+
    function TVSPHelper.GetShotpointMap ( shotpoint : IVSPShotpoint ) : String;
     
          var
                procedureName : String;
                parameters: IList<TCDBOraParam>;
                returnParameters : TOraParams;
                imageURL : String;
                errorCode : Integer;
                errorMessage : String;
     
    begin
     
          procedureName := 'seis.geometric_functions.p_get_shotpoint_map';
     
          parameters := TCollections.CreateList<TCDBOraParam> ( true );
          parameters.Add ( _provider.CreateParameter ( 'operation', 0 ) );
          parameters.Add ( _provider.CreateParameter ( 'shotpoint_id_in', shotpoint.Id ) );
     
          parameters.Add ( _provider.CreateParameter ( 'image_url', '', ptOutput ) );
          parameters.Add ( _provider.CreateParameter ( 'error_code', 0, ptOutput ) );
          parameters.Add ( _provider.CreateParameter ( 'error_message', '', ptOutput ) );
     
          try
                _provider.BeginTransaction ();
     
                returnParameters := _provider.ExecuteProcedure ( procedureName, parameters );
     
                imageURL := returnParameters.ParamByName ( 'image_url' ).AsString;
                errorCode := returnParameters.ParamByName ( 'error_code' ).AsInteger;
                errorMessage := returnParameters.ParamByName ( 'error_message' ).AsString;
     
                if errorCode = 0 then begin
                      _provider.CommitTransaction ();
                end
                else begin
                      _provider.RollbackTransaction ();
                end;
          except
                _provider.RollbackTransaction ();
                raise;
          end;
     
          imageURL := AnsiReplaceStr ( imageURL, 'https', 'http' );
     
          Result := imageURL;
     
    end;

3.3 Выполнение операций CRUD:

+
procedure TAdministrationUserHelper.SetUserStatus ( userId : Integer; status : Integer );
 
      var
            query : String;
 
begin
 
      query := 'UPDATE seis.users SET status_id = ' + IntToStr ( status );
 
      try
            Provider.BeginTransaction ();
            Provider.ExecuteNonQuery ( query );
            Provider.CommitTransaction ();
      except
            Provider.RollbackTransaction ();
            raise;
      end;
 
end;

Стоит заметить, что данный провайдер прекрасно подходит как для десктоп-приложений, так и для мобильных приложений. Конечно с небольшими изменениями, но принцип и структура не меняются. Кому будет интересно, могу выложить код провайдера для работы с БД SQLite, который я использовал для приложений под iOS.
Ответ: Можно еще по поводу повсеместного использования исключений пояснить?

Например. Есть обычное приложение. В процессе работы приложения вставлены дополнительные проверки вида Assert, чтобы во время разработки уведить возможные проблемы. Для случаев, когда что-то может возникнуть в продакшене, ассерты заменены на raise exception -- для того, что у пользователя вылезла ошибка, и он смог бы отправить отчет об этом.

Создание классов для каждого рода ошибок или даже разделов приложения выглядит накладно в этом случае. Неужели вы и здесь свои собственные исключения создаете? В чем выигрышь?
Вопрос: Разработка игры - уперся в очередную стену

Asciidunge - .
(система сборки CMake, изначально проект пишется и собирается под linux, сборка под Win теоретически возможна, но большого смысла на данном этапе не имеет)

Предыстория:
Некоторое время назад я начал учить С++ и решил, что попробую написать игру. Я не был уверен, насколько далеко я продвинусь и получу ли хоть сколько работающий прототип, а основной задачей разработки ставилось освоение ООП, о котором я не знал ровным счётом ничего. В качестве идеи для игры я взял копирование уже существующего проекта - игры Desktop Dungeons, старую версию которой можно бесплатно скачать на . Суть игры: генерируется карта (в идеале - лабиринт) фиксированного размера с монстрами разных уровней и одним боссом 10го уровня, которого надо победить. Монстры просто стоят и никуда не двигаются, при попытке переместиться на клетку с монстром происходит обмен ударами.

План разработки был такой:
- я делаю "основу", необходимый минимум игровой механики: карту, монстров, перемещение игрока, битву с монстрами, условия победы и поражения
- в прототипе графика отрисовывается текстом в консоли (через ncurses, потому что linux)
- если у меня хватит сил и умений довести геймплей до играбельного состояния, то переписать класс вывода графики на SDL2 и реализовать недостающие части: меню, таблицу рекордов, звук

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

Подскажите ресурсы или литературу об основах игровых движков, без привязки к ОС и к графическим API.
Ответ:
Сообщение от jnarical
"снизу вверх"
Я думаю, нужно одновременно и "снизу вверх" в "сверху вниз"

Сообщение от jnarical
Как мне сделать так, чтобы моя игра в процессе разработки не разрасталась в макаронное месиво, а код оставался управляемым и легко читаемым?
Изучать и использовать паттерны:

Добавлено через 1 минуту
Сообщение от jnarical
Оказалось, что в сети есть переведённая на русский версия найденной мной книги
Я последовательно читал, поэтому привёл ссылку, а потом увидел, что вы уже её привели.

Добавлено через 16 часов 50 минут
Сообщение от jnarical
речь о книге, с которой надо начинать свой путь в разработку игр
Добавлю к этой книге ещё три:

Добавлено через 1 минуту
До кучи, ещё список книг.
Вопрос: генератор отчетов для ASP.Net MVC

Доброго времени суток. В одной, уже довольно старой системе есть встроенный репортер, он основан на взаимодействии шаблонов экселя и акцесса. версии старые, много ограничений и костылей. Отчеты состоят из нескольких листов и огроменные по объему. Есть желание перевести это все в вэб клиент. Помню еще в Winformd мне удавалось неплохо подгонять отчетные формы Crystal Reports для выгрузки довольно сложных отчетов в эксель. А что сейчас актуально и применимо из отчетных систем именно для вэба ?
Ответ: Изопропил,
love_bach,
Ну, у нас тут много максималистов)
Хорошо. Скажу что отчеты и информационные системы на веб отличаются от десктопа.
Например отчета на эксель 500 на 500 десктопе который делал я сам.
Желаете спорить?
Сильверайт где веб и десктоп одинаков помер!
Вопрос: Пожалуйста напишите отчет "кому не трудно" для моей игры!

В файле word написаны вопросы описание отчета нужно только расписать вопросы..
В файле rar сама программа с исходником..
Ответ: Проект смотрел только ради интереса.
Составлять мануал и описывать функциональность программы это не тема данной ветки имхо. Даже не имея больших знаний в программировании можно составить отчет по программе, чисто на уровне пользователя что реализует программа. В коде тем более есть немного комментариев около ключевых процедур, исходя их этого пишите например процедура movebullet() класса TZV реализует движение 'пуль самолетика'.
Цель: Создать игру с графическим интерфейсом.
Для достижения цели были поставлены следующие задачи:
1) Изучить среду разработки Delphi
2) Применить на практике методы работы с мышью
3) Подобрать оптимальный набор стандартных компонент для реализации игры
...
ну и в таком духе.
Вопрос: Выбор отчетной системы для web-приложения на Java EE

Добрый день!

Люди, пишется приложение на Java в среде NetBeans, небольшая БД имеется .
Встал вопрос : заказчик хочет иметь возможность создавать отчеты по результатам работы программы, ему нужен дизайнер отчетов интегрированный в систему.

Вопросы:
Насколько реально реализовать дизайнер отчетов в "пределах браузера" ? кому известны готовые варианты решения ?
какие варианты существуют , кто какие продукты знает ?

Многие при услышании "отчеты - Java" отвечают : JasperReports .....интерестно услышать коментарии, мнения, советы.

Спасибо!
Ответ: May12,
форум - Отчётные системы