Перейти к содержанию
Fire Monkey от А до Я

Камышев Александр

Пользователи
  • Постов

    235
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные Камышев Александр

  1. в главной форме объявить 

    void __fastcall OnOptFormReady(TObject *Sender);

    в вызываемой форме 

    private:	// User declarations
    	TNotifyEvent FOnReady;
    public:		// User declarations
    	__property TNotifyEvent OnReady = { read = FOnReady, write = FOnReady };

    показать форму

    if ( !fmLogin ) fmLogin = new TfmLogin(this);
    fmLogin->OnReady = OnOptFormReady;
    #ifdef WIN32
    fmLogin->ShowModal();
    #else
    fmLogin->ShowFullScreenIcon = true;
    fmLogin->Show();
    #endif

    по кнопкам в "модальном" окне вызвать событие:

    Close();
    ModalResult = mrOk; // если ок
    if ( FOnReady ) FOnReady( (TObject*)this );

    и обработка callback:

    void __fastcall TForm1::OnOptFormReady(TObject *Sender)
    {
    if ( Sender == fmLogin )
        {
            if ( fmLogin->ModalResult != mrOk ) return;
            ApplySettings();
        }

    код получается кроссплатформенный

  2. 1 час назад, Mikhail Tchervonenko сказал:

    Единственное по уму организовать систему подпапок дабы не миллион файлов в одной папке, например название папки это последние 3 цифры

    Файлам при загрузке присваивать идентификатор, лучше первичный ключ, можно просто уникальный.

    Далее получить путь:

    String SUFileName( unsigned int id )
    {
    unsigned int d1, d2;
    d1 = id / 0x3fffff;
    d2 = ( id - ( 0x3fffff * d1 ) ) / 0xfff;
    return "su_files\\" + (String)d1 + "\\" + (String)d2 + "\\" + (String)id + ".file";
    }

    не забывать создавать подпапки:

    void CreateWarehouse( String path, unsigned int id )
    {
    CreateDirectory( ( path + "\\su_files" ).c_str(), NULL );
    unsigned int d1, d2;
    d1 = id / 0x3fffff;
    d2 = ( id - ( 0x3fffff * d1 ) ) / 0xfff;
    CreateDirectory( ( path + "\\su_files\\" + (String)d1 ).c_str(), NULL );
    CreateDirectory( ( path + "\\su_files\\" + (String)d1 + "\\" + (String)d2 ).c_str(), NULL );
    }

    Глубину вложения можно изменить в зависимости от ситуации.

  3. 21 минуту назад, Евгений Корепов сказал:

    Почему? Для некоторых нужд очень даже. К примеру регулярно пользуюсь ftp-сервером на телефоне - намного удобнее заливать/сливать (по wifi) книги, музыку и прочее, сидя за компьютером в Far manager, чем перетаскивая мышкой в убогих индусских синхронизаторах или пользоваться облачными решениями (залить 30 гигов в dropbox с компьютера (тут нет проблем, инет 450 мегабит), а потом их выкачивать из инета на телефон даже по wifi ac то еще удовольствие).

    и возразить то нечего, да так удобно, файловые менеджеры есть с такой возможностью, открывают порт и пишут по какому адресу ftp доступен

  4. 8 минут назад, ZuBy сказал:

    такой продукт это не калькулятор и в него нужно войти с головой чтобы понять всю архитектуру и количество качеством не покрывается

    Менеджер отправился к Великому Программисту и показал ему техзадание для новой программы. Менеджер спросил Мастера: «Сколько времени займёт у вас разработка этой системы, если я назначу вам пять программистов?»
    «Один год» — быстро ответил Мастер.
    «Но нам она нужна вчера! Как долго вы будете её разрабатывать, если я вам дам десять программистов?»
    Мастер нахмурился, и сказал: «тогда два года».
    «А если я назначу вам сотню программистов?»
    Мастер пожал плечами: «В таком случае, она никогда не будет завершена» :D

  5. Зачем это все в потоке? FireDac компоненты могут работать в асинхронном режиме, не нужно их в поток засовывать. 

    Вроде обсуждали что FireDac не работает на андроид... Этот код рабочий? т.е. Вы работали с устройства с базой данных?

  6. В 18.11.2016 в 21:18, krapotkin сказал:

    открываем, читаем

    "Работа с данными организована следующим образом – есть сервер БД (MS SQL Server), есть сервер Data Snap, через него работает с данными клиент на Android."
    один, два, три.

    запрос - это как бы сказать - обыденное мероприятие. а подключение к БД - вовсе нет. поэтому при каждом падении-поднятии сети нужно заново переподключаться

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

    так что не согласен. совсем. Устойчивость при плохой связи как раз и есть принцип. HTTP весь построен на запросах ответах, поэтому отсутствие постоянного соединения вполне отвечает архитектуре системы.

    А то, что обмен при установленном соединении может идти в бинарном виде - это, конечно, выигрыш, но уж больно дорогой  ценой.

    http - надстройка над TCP, всего лишь крайний, прикладной уровень в OSI, при каждом запросе так же точно как в случае с субд ждать таймаута и переподключаться,(если нет способа определить разрыв сразу), в каждом пакете слать регистрацию. Запрос к БД и запрос к серверу приложений - это в обоих случаях сессия TCP и обмен массивами, только в http еще добавляются строковые заголовки, которые надо парсить.  Устойчивость здесь и близко не лежала. Те же яйца, только в профиль. И нет там никакой дорогой цены, отсутствие родных компонентов для прямого подключения - минус FMX.

    Я сторонник трехзвенки, она позволяет реализовать правила работы с данными и корректно работать с СУБД, но и только.

  7. Трехзвенная архитектура имеет много плюсов, однако устойчивости при плохой связи среди этих плюсов нет.

    И в трехзвенке и в прямом доступе сеанс TCP и обмен массивами, размеры массивов также примерно одинаковые. Правильно построенный запрос к напрямую к БД пройдет быстрее чем через сервер приложений. Для простых приложений pourquoi бы и не pas.

    Упавшая БД - ночной кошмар it-шников, ее стараются всячески оберегать и работать с ней трепетно. Трехзвенка как раз такой случай.

  8. Клади на форму TFDConnection, TFDQuery и TFDPhysMySQLDriverLink,

    Connection автоматом пропишется в Query, в Connection прописывай настройки соединения, там все просто, дальше Connection->Open(); - если настройки годные будет коннект.

    В Query->SQL->Text пишешь sql запрос, и Query->Open() - Query->Close()  либо Query->ExecSQL() в зависимости от запроса

    Смотреть события AfterConnect, AfterDisconnect, ConnectionError, AfterOpen, AfterExecute, QueryError; 

  9. 3 часа назад, Kitty сказал:

    WelcomeINI->SaveToFile(path);

    закрыть в try-catch, и обработать исключение

    3 часа назад, Kitty сказал:

    if(FileExists(path))

    зачем его проверять? если WelcomeINI->Size != 0 и SaveToFile прошел без исключений - можно смело открывать инишник.

  10. Порты закрываются наружу в настройках СУБД, и/или пользователя. Оставляют доступ с localhost либо конкретному ip.

    Архитектура - это вопрос религии. Если брать релятивистские СУБД, то архитектура клиент-сервер проще и требует меньше ресурсов. Трехзвенная более устойчивая, сложнее в реализации.

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

    REST не предполагает свободы выбора, плати за гигибайты и флопсы в облаке и не парься архитектурой.

  11. Делал на виндовс, в настройках url входа в систему по умолчанию, т.е. url сервера, который раздает линки по настройкам профиля. Профиль в хедерах http указывается.

    По линку(тоже url) движок приложения получает конфигурацию и доп. файлы.

    Сложно и оправдано только для больших проектов.

  12. tcp_client->Socket->Write( data_out, false );

    data_out - TMemoryStream размером около 1,5 Мб, если использовать wifi все ок, в OnWork исправно AWorkCount по 96 байт шлет.

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

    Впихиваю 1,5 метра - AWorkCount показывает какие-то либо терабайты либо отрицательные значения.

    Ошибки нет, тупо висит. Что ему не так то? help

×
×
  • Создать...