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

notricky

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

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

  • Посещение

Сообщения, опубликованные notricky

  1. -- 2457390.09 - допустим такое значение в таблице с колонкой yourRealColumn
    
    SELECT 
      datetime(yourRealColumn) as yourColumnNameForDatetime, 
      date(yourRealColumn) as yourColumnNameForDate, 
      time(yourRealColumn) as yourColumnNameForTime
    FROM YourTable

    Соответственно опишите подключаемую колонку, например "yourColumNameForDate" как соответствующий тип данных - date и все должно заработать.

  2. 2 часа назад, enatechno сказал:

    1). Какое значение у qr2.CachedUpdates?

    2). Как используются транзакции?

    1) False. С этим же значением ФайрДАК ругается, если изменять поле, которое есть в запросе, но отсутствует в целевой таблице. Вот вроде как бы кажется что всё делает, но апдейта не дает :(

    2) В неявном виде.

  3. Собственно как это делают люди?

    Речь, конечно, не про выполнение скрипта "update table set...", а про использование Edit/Post с изменением как в Датасете, так и в БД.

    Какие нужны настройки, в частности у TFDQuery.

    // настройки qr.UpdateOptions = [KeyFields = id][UpdateChangedFields = true]
    // при этом селект не смотрит напрямую в theTable, но id - это поле theTable
    qr2.UpdateOptions.UpdateTableName := 'theTable';
    qr2.Edit;
    qr2.FieldByName('Str').Value := Format('%s-%d',[qr2.FieldByName('Str').AsString, Code]);
    qr2.Post;

    В такой форме позволяет менять датасет, но в БД данные не скидываются. БД SQLite.

  4. 12 часов назад, krapotkin сказал:

    это же мобилка. тут все просто. берешь panel или layout и ставишь в любое место экрана

    У меня сразу и мак и мобилка и вин.

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

    Screenshot_2017-02-10-23-56-14[1].png

  5. 13 часов назад, Равиль Зарипов (ZuBy) сказал:

    debug и release сборки скорей всего подписаны разными .keystore файлами

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

  6. При компиляции из среды - все хорошо. Приложение запускается.

    При попытке скопировать из папки Android\Debug\{AppName}\Bin\{AppName}.apk и запустить сначала задается вопрос "установить"?, а потом ошибка "Синтаксическая ошибка - при синтаксическом анализе пакета возникла ошибка".

    Как-то было, правда, что все проходило без ошибок. Куда смотреть? 

  7. Еще один странный баг, если кому интересно и кто знает что то про это.

     

    После того как форма показалась-скрылась, элементы на нижележащей форме перестают быть откликабельными. Например Едиты не получают фокус. Точнее получают, но нет ни каретки, ни клавиатуры на андроиде.

  8. Напрямую нет доступа к сайту. ТОлько через анонимайзеры. Провайдер onlime.

    tracert начинает тупить на 9 шаге после 94.124.181.242. Провайдер говорит, что это не с их оборудованием проблема. Может менялись какие-то настройки? 

  9. 13 часов назад, RoschinSpb сказал:

    Да, действительно всю тему не прочитал, виноват. Вы тогда про 

    
        FOverlayShown := True;
        try
          Sleep(1000);
        finally
          FOverlayShown := False;
        end;
    

    тоже не читайте, ибо малодушный поиск лёгких путей — это не спортивно ;)

    Посыл сообщений физически это просто вызов некоторого метода объекта, только в отличие от обычных методов обработчики сообщений могут существовать, или не существовать. Смысл посыла сообщений в том, чтобы избавится от зависимостей, т.е. отправитель может не знать какие конкретно методы есть у получателя. Все ограничения связанные с многопоточностью остаются в силе. Главное ограничение это то, что нельзя работать с любыми интерфейсными элементами внутри потока без использования Sinchronize. Если с Sinchronize не работает, то надо написать об ошибке в QC, надеяться и ждать.

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

  10. А знаете что я вам скажу?? А вот угадайте, в чем была на самом деле проблема???

    А проблема была как всегда у Эмбаркадеро неявная, а именно в том, что BorderStyle = bsNone не дружит с вызовами вооообще. Ниоткуда. И вызывает вышеобозначенную ошибку в любом из возможных вариантов. И треды тут вообще не при чем. Ну то есть вот совсем не при чем. То есть если правильно задать BorderStyle, то вполне можно обойтись на Android оборачиванием вызовов Show/Hide TThread.Queue(...)

    Часы.... просто часы тестов убиты на такой маразм.

    Друзья, коллеги, если у вас есть последняя версия FMX, пожалуйста, протестируйте этот вариант с Бордером на андроиде. И отпишитесь здесь. И если это баг, то может быть стоит репортнуть. Для теста нужно две формы, одна из которых обычная, вторая borderStyle=None и вызывается кнопкой из первой формы. Обе создаются обычным способом при инициализации приложения.

    Upd2:

    Еще одно замечание.
    Если выставлено bsNone, но при этом FullScreen = True, то другие формы открываются обычным Form.Show ровно до того момента, как было обращение на показ формы с bsNone и FullScreen = True. После этого последняя показывается, а вот все прочие формы, открывающиеся по кнопке обычным образом уже идут с ошибками  CalledFromWrongThreadException: Only the o....

  11. 2 часа назад, kami сказал:

    Я искал (перед тем, как написать предыдущее сообщение) - не нашел.

    Я наткнулся на такую тему:
    Оконные сообщения в FireMonkey

    Правда про потоки там ни слова... Зато в коментах Ярослав Бровин присутствует :)

  12. 13 часов назад, kami сказал:

    SendMessage через механизмы FMX !=SendMessage через механизмы Windows. Да, в Windows получатель обработает сообщение в том потоке, в котором принявшее сообщение окно было создано. Боюсь, что SendMessage из FMX не учитывает это, так что прием сообщения осуществляется в контексте вызывающего потока. Со всеми вытекающими.

    Глупость какая-то. Всмысле реализация - теряется весь смысл сообщений, в особенности если это сообщения на отрисовку. А где-то про это вообще написано?

  13. 1 час назад, RoschinSpb сказал:

    FMX, также как и VCL так же как и вообще все объекты (за исключением некоторых специальных) не потокобезопасны. Т.е. напрямую использовать в потоке что-либо созданное вне этого потока нельзя, потому, что нельзя никогда... Всякие там формы кнопки и пр. взаимодействуют с другими формами кнопками и пр. контролами, так что даже если вы создаете и уничтожаете форму внутри потока (внутри метода Execute), то всё равно не явно Вы обращаетесь к другим объектам системы. Чтобы решить эту проблему все обращения к контролам надо делать в методе  Synchronize По этому ключевому слову ищите информацию в интернете и изучайте многопоточность.

    Но лучше просто не работайте с интерфейсом в потоке. В этом примере можно просто устанавливать и сбрасывать некий флаг FOverlayShown. К нему Вы можете обращаться из основного потока в любой момент (к FErrorMessage только после окончания работы потока). Обрабатывать OverlayShown можно например событии TAction.OnUpdate или хотя бы в TTimer.

    
    procedure TWorkThread.Execute;
    begin
      try
        FOverlayShown := True;
        try
          Sleep(1000);
        finally
          FOverlayShown := False;
        end;
      except
        on e: exception do
        begin
          FErrorMessage := e.Message;
        end;
      end;
    end;

    P.S. А лучше вообще не связывайтесь с потоками.

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

    Ну ладно, не прочитали. Бывает.
    Ответите тогда на вопрос - почему возникает поднятая проблема (да, для этого надо тему почитать) в случае с посылом сообщений классу формы из потока?

  14. Ну то есть когда я в рабочем потоке делаю так:

    var
      Form1: TForm1;
      MsgSender: TMessageSender;
    
    procedure TWorkThread.ShowOverlay;
    var V: Tvalue;
    begin
      V := Tvalue.From(Form1.RectSelf);
      MsgSender.Receiver := TFOverlay.This;
      MsgSender.SendMessageWithResult(PM_OVERLAY_SHOW, V);
    end;
    
    ...
    procedure TWorkThread.Execute;
    begin
      try
        ShowOverlay;
        Sleep(1000);
        HideOverlay;
      except
        on e: exception do MessageDlg(e.Message,TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes], 0, nil);
      end;
      Terminate;
    end;
    
    
    // OVERLAY
    ....
    type
      TFOverlay = class(TForm)
        procedure PMShow(var AMessage: TDispatchMessageWithValue<TRect>); message PM_OVERLAY_SHOW;
      ...
      end;
          
    implementation
    
    procedure TFOverlay.PMShow(var AMessage: TDispatchMessageWithValue<TRect>);
    begin
      FRect := AMessage.Value;
      This.Show;
    end;

    тем не менее я получаю ошибку  CalledFromWrongThreadException: Only the original thread that created a view hierarcy can touch its views" 

    На самом деле если внутри рабочего потока ShowOverlay обернуть в CallInUIThread то ошибки нет, но, как описал Ярослав, негарантированно.

    замкнутый круг. Хочу понять что не так и как вообще следует проектировать в ХЕ8 интерфейсы.

     

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