ENRGY

Пользователи
  • Публикации

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

  • Посещение

  • Days Won

    7

Все публикации пользователя ENRGY

  1. DisposeOf не освобождает память, а просто вызывает деструктор. Можно не использовать его, а использовать обычный Close с TCloseAction.caFree. Я проверял на мобильном компиляторе (Android) - все уничтожается корректно, срабатывает деструктор формы. Обязательно создавать надо форму с Owner nil, иначе форма не уничтожится. frmLoading := TfrmLoading.Create(nil); frmLoading.Show; //В форме: procedure TfrmLoading.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := TCloseAction.caFree; end; //Уничтожаем: frmLoading.Close; frmLoading := nil; Если на ARC компиляторах вместо Close, вызвать FreeAndNil(frmLoading) - форма не уничтожится и останется видимой.
  2. @Евгений Корепов Я не собираюсь использовать Error Code, т.к. там может быть проблема с прокси. Но насчет JSON не согласен. Не понимаю эти заделы на будущее. Сколько лет уже программирую, и всегда приходилось писать под текущую задачу, а универсальные вещи\классы пылились на полке. Мне напоминает это серванты с посудой и дорогим постельным бельем у наших родителей и бабушек, с надеждой на применение их в лучшем будущем или по особым случаям, которые у многих и не наступают.. Или например напоминает создание всех форм и компонентов сразу при старте. В результате юзер в основном использует только одну форму, но программа забирает больше ресурсов и медленнее загружается. Я не сторонник такого подхода, точнее даже категорически против, т.к. универсальность влияет на производительность. Я за принцип бритвы Оккама. Имхо если нужно будет возвращать доп. данные, то их добавить просто, но делать это нужно тогда когда это реально понадобится. Стандартного "ОК или ошибка" вполне достаточно (тем более если появится ошибка, то она будет не в стандарте json\xml, а обычным текстом), для другого будет другой запрос. Если бы скрипт возвращал не обычное бинарное подтверждение - да\нет, а какое то значение, тогда было бы лучше использовать json - можно добавить и новые параметры, в новых версиях, не нарушив работу старых версий программы.
  3. function FileSize(const aFilePath: string): Int64; var vSR : TSearchRec; begin if FindFirst(aFilePath, faAnyFile, vSR ) = 0 then begin Result := vSR.Size; FindClose(vSR); end else Result := -1; end; Мультиплатформенный вариант без открытия файла (размер берется из файловой системы).
  4. Понять легко, если использовать не зарезервированные номера. Мануал это и рекомендует, первая цифра класс статуса, остальные 2 свои. Другое дело что может быть проблема с прокси серверами.
  5. Здесь вы не совсем правы. Эти коды и придуманы в том числе и для использования в своих целях. Они разделены на классы. 200 это коды "удачные", 400 "не удачные" итп. Есть зарезервировнные значения, все остальное можно использовать. Не спорю, это не так удобно как текст. Но имхо в таких простых boolean запросах проще использовать текст 'ОК', если это не ОК, значит интепретировать как ошибку, ведь по факту какая нибудь ошибка скрипта отображается простым текстом, без json форматирования. И код станет и прозрачней и быстрее. А если понадобится возвращать сложные данные, то это будет уже другой запрос, со своей описанной в доках структурой (json).
  6. Как вы к примеру подтверждаете из скрипта (напр. PHP) о том что запись добавилась в базу? Есть 2 варианта - возвращать нужный код (не вижу причин почему не рекомендуется возвращать свой Custom Error Code, имхо это вполне логично), или возвращать текст (напр. ошибки или "ОК"). Возвращать пустую строку при удачном добавлении при error code 200 на мой взгляд не совсем правильно. Что то пропустите в коде скрипта - что -то отвалиться, и в итоге запись не добавиться, при этом в ответ вернется 200 и пустая строка. Этот код работает под iOS? Равиль ведь писал что там какая то проблема с IHTTPResponse и он не возвращает код. Я к сожалению не смогу проверить в ближайшее время на iOS .
  7. Разве этот код не будет работать под iOS? Под Android он работает.
  8. Можно еще сокращенный вариант, без объявления TStringStream; Get возвращает IHTTPResponse . Там есть и StatusCode и ContentAsString. Напомню, переменные тип которых начинаются с буквы I (Interface), как IHTTPResponse не нужно уничтожать, они самоуничтожаются при выходе из процедуры. uses System.Net.HttpClient; with THTTPClient.Create do try Result := Get(vURL).StatusCode = ADDED_TO_DB; finally Free; end; Также в этом теме описано как отправить файл.
  9. Скорее всего проблема в 17 строчке..
  10. Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу. А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android? POST запрос? Кто нибудь делал такое уже? Спасибо P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения.
  11. нет, тут речь идет про Handle формы (хотя я не пойму причем тут Handle формы под Android, это же фишка Windows). Почему то сначала он <> nil, затем при втором срабатывании onResize Handle = Nil , и где то в дебрях в результате получается AV после присваивания Image1.Height . Причем это новый проект. .
  12. Есть картинка-шапка (лого). Wrap Mode = Fit. При изменении размера формы (ширины), меняется размер картинки внутри Timage, но не меняется размер самого TImage. Из за этого неправильно позиционируются контролы под Timage (точнее они не меняют позицию), к примеру при уменьшении ширины формы остаются большие пустые куски, из за того что картинка уменьшилась, а сам Timage нет (он должен сменить Height самого конторола пропорционально его Width ), и контролы что под ним (c Align Top), не сменили позицию. В VCL был Autosize у Timage, есть ли что то подобное у FMX ?
  13. На Android без вот этого кусочка программа молча вылетает (Segmentation Failed) if Handle = nil then exit;
  14. Огромное спасибо Равиль! Как хорошо что вы помогаете. Итак для тех кто не знает, в TListView есть режим DynamicAppearance , который позволяет добавлять предустановленные элементы - картинки, текст, GlyphButon. В хелпе написано что их может быть любое количество. Итак добавляем TListView, в панели Structure выбираем TListView > ItemAppearance > Item. В инспекторе объектов выбрать свойство Appearance и комбобоксе Dynamic Appearance. Рядом в инспекторе появится свойство Objects - нажать на него и там уже добавляем нужные поля. Там же можно переименовать поле, в AppearanceObjectName чтобы позже использовать в RunTime. У меня периодически на этих этапах вылетает Catastrophic Failure и среду приходится терминировать с диспетчера (Berlin Update 2). Дальше, жмем правой кнопкой мыши по ListView и выбираем Toggle Design Mode, где можно увидеть эти добавленные Custom поля и расставить их мышкой и указать выравнивание. Это имя затем можно использовать в Runtime, для картинки это индекс в ImageList, который нужно указать в ListView таким образом (за это еще раз спасибо Равилю! :), почему это сделали так неочевидно и почему это не указано в мануале, остается загадкой.. Для TImageObjectAppearance с именем Star - ListView1.Items.Add.Data['Star'] := Integer(1); Например заполняем список с картинками с индексами 0 и 1: procedure TForm5.FormShow(Sender: TObject); var I: Integer; begin for I := 0 to 9 do begin with ListView1.Items.Add do begin Text := 'Item ' + I.ToString; Data['Star'] := Integer(I mod 2 = 0); end; end; end; Переключаем с картинки с индексом 1 на 0 и наоборот. procedure TForm5.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin AItem.Data['Star'] := AItem.Data['Star'].AsInteger xor 1; end ;
  15. Привет. Я к своему стыду так и не научился толком работать с TListView. TListBox это сделать просто, а вот как это сделать в TListView... Это сложный компонент. Подскажите как правильно реализовать. Нужно добавить с правой стороны каждого Item иконку избранное, которая работала бы как чекбокс - если нажать по ней то звездочка становится желтой и без заливки (Checked/unchecked) . Насколько я понял в GlyphButton нельзя добавить картинку.. Как же тогда это сделать? Спасибо.
  16. Я работаю на Windows 10, линии появляются на ней. Если использовать GlobalUseGPUCanvas := true то баг пропадает. Но с этим флагом другая проблема, если в системе установлено dpi больше 100%, напр. как у меня 150%, то программа не масштабируется автоматически, т.е. форма становится пропорционально меньше, выглядит как для 100% dpi на 150%. Это аналог Form Scaled := true на VCL. Хотя мне так больше нравится, я давно искал где же выключается это некрасивое масштабирование в FMX (слишком большое на мой взгляд). Большое спасибо @andrew4010!
  17. Простейшая анимация Timage + Float Animation который меняет RotationAngle картинки. Если запустить анимацию, и если слева от крутящейся картинки стоит еще одна картинка или контрол (статичный), то на этом месте показываются и пропадают вертикальные линии, как будто эффект старой кинопленки. Причем под Android все ок, такая ерунда под Windows. А мне нужно сделать прогу под Win и Android. Кто нибудь сталкивался с таким? Здесь большой круг вращается. А левый маленький - обычная картинка. (2 Timage). Delphi Berlin Update 2 TestAnim.zip
  18. Есть у вас какие то сдвиги по теме? http://www.codenewsfast.com/cnf/thread/0/permalink.thr-ng2072q1234 FDDataMove1.Destination := FDMemTable1; FDDataMove1.SourceKind := skText; FDDataMove1.TextFileName := '.......'; FDDataMove1.TextAnalyze := [taDelimSep, taHeader, taFields];
  19. Для Android лучше Berlin использовать с последним Update 2. На Tokyo Android глючный и тормозит, фактически программы получаются не юзабельные, для Tokyo лучше подождать обновления. Все детали на форуме эбмаркадеры.
  20. В общем вот работающий костыль, который полностью убирает полосы. 2 Timage лежат на TLayout. Если после каждого поворота менять высоту Tlayout на 0,001 туда-обратно, то полос нет. На глаз никакого движения не заметно. Жмем по FloatAnimation и выбираем событие OnProcess. Далее procedure TfrmSplash.FloatAnimation1Process(Sender: TObject); begin {$IFDEF MSWINDOWS} if Layout1.Height > fNormHeight then Layout1.Height := Layout1.Height - 0.001 else Layout1.Height := Layout1.Height + 0.001; {$ENDIF} end; procedure TfrmSplash.FormCreate(Sender: TObject); begin fNormHeight := Layout1.Height; end;
  21. А чем можно заменить Timage, может вручную можно отрисовать? Пока я вижу единственный выход, это делать анимацию из 360 картинок и грузить их в TBitmapListAnimation..
  22. Равиль огромное вам спасибо, так просто. Все работает. Обычная пропорция. Я думал сложнее (я делал Image1.Height := Image1.Bitmap.Height; ). И заодно решилась проблема, когда увеличиваешь размер формы, картинка корректно увеличивается с Fit. Вот правильный код, который посоветовал Равиль: procedure TfrmSplash.FormResize(Sender: TObject); var vKoef: Single; begin if Handle = nil then exit; // on Android without this user will get Access Violation vKoef := Image1.Width / Image1.Bitmap.Width; Image1.Height := Image1.Bitmap.Height * vKoef; end
  23. Как конвертировать растровую картинку в векторный TPath Firemonkey. How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath. Manual. Плюсы векторных изображений: Можно изменять размер избражения в любую сторону, уменьшать и увеличивать, без потери качества. Картинка всегда будет с четкими краями, без размытия по краям и квадратиков. Можно легко изменять в RunTime цвет заливки и обводной рамки, изменяя цвета в полях Fill и Stroke компонента TPath. Заливка как правило одна - это цвет из свойства Fill Color. Но ... цвет может быть и градиентом из множества цветов, который можно указать в диспетчере объектов, там же можно загрузить и Bitmap как текстуру в качестве заливки. Можно анимировать изображение, изменяя вышеуказанные свойства, а также направление градиента, размер, толщину обводной линии итд. Тоже можно менять и для Stroke свойства - обводной рамки. Минусы: Получаемое изображение упрощенное. Т.к. оно может содержать только один путь (Path) и одну плоскость. Возможно получиться скомбинировать множества TPath, положив их друг на друга с прозрачностью. Векторное изображение вычисляется и рисуется "в живую", поэтому потребуется больше ресурсов, чем при отрисовке обычных растровых картинок png, jpg, bitmap. Что означает нагрузку на аппаратную часть, замедление работы программы и более быструю разрядку мобильного устройства. Поэтому если и использовать подобные векторные изображения, то в случае если нужно отобразить большие картинки-символы на разных экранах (не иконки) - например на маленьком экране телефона, и на большом планшете и на еще большем Desktop экране. Хотя в примере \Samples\Object Pascal\Multi-Device Samples\User Interface\CustomListBox\CustomListBox.dproj используется векторная иконка\чекбокс очень простая. Преимущества векторного изображения наглядно: Ингредиенты: 1. Векторный редактор, я взял бесплатный inkscape, который можно скачать здесь . 2. Картинка. Желательно чтобы картинка была с большим разрешением, от 300px и больше. Если взять изображение маленького размера, например 48x48 или 64x64, то контуры получатся не такими точными. И хотя inkscape все равно применит сглаживание контуров, и квадратиков вы не увидите, обводные линии могут получиться другой формы, к примеру более жирными или могут слиться с другими линиями. Исходное изображение лучше брать в формате PNG, т.к. JPEG оставляет артефакты в виде точек, в итоге программа при трассировке может захватить и их, что не желательно. Конечно же если другого исходника нету, то смысла конвертировать jpg в png нет - качество не улучшится. Основной метод конвертации - это трассировка изображения, - когда алгоритм ищет края и обводные линии, и на основе их рисует свои. Потому качественные результаты получаться если брать изображение с одной плоскостью, без теней, градиентов и деталей, в стиле Windows 8\10 или Android. Т.н. Flat (плоский) icon. 3. IDE RAD Studio Delphi или С++ Приступим. Запускаем incscape. Размер исходной png картинки 668x720. 1. Меню File > Open - указываем путь. Иконка загрузилась. 2. Нажимаем левой кнопкой мыши на картинку, чтобы она выделилась. 3. Меню Path > Trace Bitmap. Сразу выберите чекбокс Live Preview (см скриншот). Здесь есть разные методы, но нам нужна секция Single Scan: Creates a Path. Методы нужно подбирать визуально, "на глаз". Можно также использовать и секцию Multiply Scans, а затем скомбинировать пути в один (Path > Combine), т.к. нам нужен один путь, и один набор. Путь (Path) это набор инструкций о том как и сколько рисовать линий-векторов. Для нашего конкретного случая, этой конкретной иконки, оптимальный вариант Color Quantization и количество цветов = 2. 4. Нажимаем OK и закрываем окно. Появилось наше изображение залитое черным цветом - это и есть наша векторная картинка. Стоит заметить что прямо под ним лежит наше исходного изображение. Чтобы его удалить нужно отодвинуть мышкой векторное изображение, выделить исходную картинку и удалить ее клавишей Delete. 5. Вы можете отредактировать пути, выбрав в левой панели инструмент Edit Paths By nodes (F2) или добавить фильтры\эффекты в меню Path > Path Effects. В данном примере я ничего не менял. 6. File Save As > inkscape SVG . 7. Открываем полученный SVG файл в блокноте или в Lister тотал коммандера. Ищем массив чисел, который обычно начинается со строчки "<path". Находим эту строчку, нам нужно набор символов, который идет после буквы "d=", к примеру d="m 397.33334,c -48.1 ...-0.326 -1.64129,-0.66405 z" и копируем все, что внутри кавычек в буфер. 8. Далее в RAD IDE кидаем на форму TPath. В Object Inspector WrapMode устанавливаем в Fit, и в поле Data вставляем из буфера наш код. 9. Меняем Fill и Stroke цвета на нужные нам значения (здесь я установил желтый цвет и увеличил толщину обводки (Stroke)). Еще пару примеров. Дерево - параметры Brightness Cutoff, Threshold 0.370 . Как видите здесь оптимальнее подходит метод Brightness Cutoff. Здесь исходная png картинка - это дерево черного цвета, я ее распознал, и затем добавил в TPath, а в свойстве Fill указал градиент от черного до зеленого. Наушники - Edge Detection 0. Конечно конкретно в этом случае нужно подчищать изображение. Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно, если снова зайти в DATA TPath, то окажется что часть данных потеряна. Что исправить эту ситуацию, нужно путь упростить. Это значит что после шага 4, нужно выбрать в incscrape меню Path > Simplify, затем снова сохранить файл. Правда Simplify в incscrape работает не очень хорошо, часто загругляет прямые участки. Лучше делать Simplify в Adobe Illustrator. Статья опубликована на сайте fire-monkey.ru и возможно будет изменяться и дополняться. Автор: ENRGY 24. 02. 17
  24. Динамически добавляю картинки, - thumbnails в ImageList для дальнейшего отображения в ListView. Некоторые картинки через время не нужны, как корректно удалить картинку из TImageList, чтобы освободить память? При добавлении картинка добавляется в 3 списка Source.Add, Destination.Add и Destination.Layers.Add, получается ее нужно удалять с этих 3 списков? Спасибо. Добавляю картинку так:
  25. @RoschinSpb пожалуйста, возможно вы подскажете как оптимальнее это сделать? Нужно удалять картинки, т.к. они загружаются на Dropbox, и затем удаляются из ListView и из TImageList.