-
Постов
568 -
Зарегистрирован
-
Посещение
-
Победитель дней
57
Сообщения, опубликованные ENERGY
-
-
Простейшая анимация Timage + Float Animation который меняет RotationAngle картинки.
Если запустить анимацию, и если слева от крутящейся картинки стоит еще одна картинка или контрол (статичный), то на этом месте показываются и пропадают вертикальные линии, как будто эффект старой кинопленки.
Причем под Android все ок, такая ерунда под Windows. А мне нужно сделать прогу под Win и Android.
Кто нибудь сталкивался с таким?
Здесь большой круг вращается. А левый маленький - обычная картинка. (2 Timage).
Delphi Berlin Update 2
-
Есть картинка-шапка (лого). Wrap Mode = Fit.
При изменении размера формы (ширины), меняется размер картинки внутри Timage, но не меняется размер самого TImage.
Из за этого неправильно позиционируются контролы под Timage (точнее они не меняют позицию), к примеру при уменьшении ширины формы остаются большие пустые куски, из за того что картинка уменьшилась, а сам Timage нет (он должен сменить Height самого конторола пропорционально его Width ), и контролы что под ним (c Align Top), не сменили позицию.
В VCL был Autosize у Timage, есть ли что то подобное у FMX ?
-
@RoschinSpb пожалуйста, возможно вы подскажете как оптимальнее это сделать?
Нужно удалять картинки, т.к. они загружаются на Dropbox, и затем удаляются из ListView и из TImageList.
-
Динамически добавляю картинки, - thumbnails в ImageList для дальнейшего отображения в ListView.
Некоторые картинки через время не нужны, как корректно удалить картинку из TImageList, чтобы освободить память?
При добавлении картинка добавляется в 3 списка Source.Add, Destination.Add и Destination.Layers.Add, получается ее нужно удалять с этих 3 списков?
Спасибо.
Добавляю картинку так:Скрытый текстtype TImageListHelper = class helper for TImageList function Add(aBitmap: TBitmap): integer; end; function TImageListHelper.Add(aBitmap: TBitmap): integer; const SCALE = 1; var vSource: TCustomSourceItem; vBitmapItem: TCustomBitmapItem; vDest: TCustomDestinationItem; vLayer: TLayer; begin Result := -1; if (aBitmap.Width = 0) or (aBitmap.Height = 0) then exit; // add source bitmap vSource := Source.Add; vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; vSource.MultiResBitmap.SizeKind := TSizeKind.Source; vSource.MultiResBitmap.Width := Round(aBitmap.Width / SCALE); vSource.MultiResBitmap.Height := Round(aBitmap.Height / SCALE); vBitmapItem := vSource.MultiResBitmap.ItemByScale(SCALE, True, True); if vBitmapItem = nil then begin vBitmapItem := vSource.MultiResBitmap.Add; vBitmapItem.Scale := Scale; end; vBitmapItem.Bitmap.Assign(aBitmap); vDest := Destination.Add; vLayer := vDest.Layers.Add; vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width, vSource.MultiResBitmap.Height); vLayer.Name := vSource.Name; Result := vDest.Index; end;
ImageList1.Add(MyBitmap);
-
Application.processmessages пробовали после смены размера окна?
Мне кажется проблема в этих режимах. Можно подробнее про них?
-
На мобильных платформах обычно не принято указывать пути, хотя есть конечно исключения.
На Android нет стандартного диалога, на iOS есть, но Apple не рекомендует использовать его.Important: An iOS app should never use an Open or Save panel to prompt the
user for the location of a file within the app’s sandbox. iOS apps should
always save files to known locations inside their sandbox, and apps should
use a custom interface when presenting those documents to the user. iOS apps
can, however, use a UIDocumentPickerViewController to prompt the user to
import, export, open, or move files to or from some areas outside the app’s
sandbox. For more information, see the Document Picker Programming Guide.unit frmSelect; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Edit, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation; type TCallback = procedure (ASelected: String) of object; TfmSelect = class(TForm) Panel1: TPanel; btnRefresh: TButton; lstItems: TListBox; edtCurrentFolder: TEdit; pnlDirectoryNotExist: TPanel; lblDirectoryNotExist: TLabel; btnSelect: TButton; procedure btnRefreshClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure lstItemsClick(Sender: TObject); procedure btnSelectClick(Sender: TObject); private { Private declarations } public const CONST_STRING_PARENT = '..'; CONST_X = '/'; { I know is function for this } var Callback: TCallback; { Public declarations } function CD(AFolder: String): Boolean; end; var fmSelect: TfmSelect; implementation {$R *.fmx} uses System.IOUtils; procedure TfmSelect.btnSelectClick(Sender: TObject); var LResult: String; begin if Assigned(Callback) then begin if lstItems.ItemIndex = -1 then LResult := EmptyStr else LResult := lstItems.Items[lstItems.ItemIndex]; Callback(LResult); end; Close; end; function TfmSelect.CD(AFolder: String): Boolean; var LParent: String; LDirs, LFiles: TStringDynArray; s: String; begin lstItems.Clear; pnlDirectoryNotExist.Visible := False; if (AFolder <> EmptyStr) and (AFolder <> CONST_X) and (AFolder[AFolder.Length - 1] <> CONST_X) then AFolder := AFolder + CONST_X; edtCurrentFolder.Text := AFolder; { http://stackoverflow.com/questions/20318875/how-to-show-the-availble-files-in-android-memory-with-firemonkey } if not TDirectory.Exists(AFolder, True) then begin lblDirectoryNotExist.Text := 'Directory ' + AFolder + ' does not exist.'; pnlDirectoryNotExist.Visible := True; Exit(False); end; { } LParent := TDirectory.GetParent(AFolder); { } if LParent <> AFolder then lstItems.Items.Add(CONST_STRING_PARENT); { } LDirs := TDirectory.GetDirectories(AFolder, '*'); // Get all files. Non-Windows systems don't typically care about // extensions, so we just use a single '*' as a mask. LFiles := TDirectory.GetFiles(AFolder, '*'); for s in LDirs do lstItems.Items.Add(s + CONST_X); for s in LFiles do lstItems.Items.Add(s); Result := True; end; procedure TfmSelect.FormCreate(Sender: TObject); begin pnlDirectoryNotExist.Visible := False; end; procedure TfmSelect.lstItemsClick(Sender: TObject); var s: String; begin if lstItems.ItemIndex = -1 then Exit; if SameText(lstItems.Items[lstItems.ItemIndex], CONST_STRING_PARENT) then { Or we need to use global var for Parent } CD(TDirectory.GetParent(edtCurrentFolder.Text)) else begin s := lstItems.Items[lstItems.ItemIndex]; if s = EmptyStr then Exit; if s[s.Length - 1] = CONST_X then CD(s); end; end; procedure TfmSelect.btnRefreshClick(Sender: TObject); begin if edtCurrentFolder.Text <> EmptyStr then CD(edtCurrentFolder.Text) else CD(TPath.GetDocumentsPath); end; end.
Использование
if fmSelect = nil then begin Application.CreateForm(TfmSelect, fmSelect); fmSelect.Callback := Yahoo; end; fmSelect.Show; fmSelect.CD(TPath.GetDocumentsPath); procedure TFormXX.Yahoo(ASelectedItem: String); begin ShowMessage(ASelectedItem); // end;
-
-
Друзья, нашел тут интересную статью, где тестируются разные jSON парсеры.
Ссылка: http://www.webdelphi.ru/2016/10/ishhem-samyj-bystryj-parser-json-v-delphi/
Автор: Владислав Баженов
Описание (26/10/2016):
Скрытый текстВ продолжение статьи об инструменте для просмотра JSON решил разобраться с вопросом: какой самый быстрый парсер JSON есть в Delphi? На сегодняшний день у Delphi-разработчиков более, чем достаточно различных библиотек для работы с JSON, в том числе имеются и «родные» классы для JSON. И хотелось бы узнать, какая из библиотек окажется самой быстрой.В качестве теста я решил проверить, как справятся библиотеки с парсингом файла, размером в 189 Мб (ссылка).
Библиотеки, которые тестировались:
Какие-то из этих библиотек развиваются и постоянно дорабатываются, например, как x-SuperObject, а какие-то давно уже «умерли», но, тем не менее, на просторах Интернета о них упоминается чаще, чем о других может быть более новых библиотеках, о которых я не в курсе.
Тест проводился согласно демонстрационным примерам к библиотекам
В тесте я обращал внимание не только на время, которое потребуется библиотеке, чтобы распарсить большой файл, но и размер оперативной памяти, который займет программа после того, как библиотека справится с большим JSON. В «спокойном» состоянии тестовая программа занимает в оперативной памяти 1,4 Мб.
Работа каждой библиотеки проверялась трижды. После каждого вызова процедуры парсинга, тестовая программа полностью перезагружалась.
Вот какие результаты в итоге были получены:
Библиотека Время парсинга Объем занимаемой памяти, Mb lkJson 00:00:13.9 1008,3 Delphi Web Utils 00:03:46.6 912,4 SuperObject Out of Memory x-SuperObject Out of Memory Fast JSON lib Программа зависла System.JSON Out of Memory Три библиотеки (SuperObject, System.Json и FastJson lib) не справились с разбором тестового файла.
При этом FastJSON lib на протяжении получаса «отъедала» 51,4% CPU и 911 Mb оперативной памяти, но так ничего и не распарсила.
x-SuperObject справилась с задачей один раз, затратив на это чуть более 50 секунд, второй и третий разы выдала out of Memory.
SuperObject и System.Json сошли с дистанции практически сразу, выкинув перед этим «Out of Memory».
Из оставшихся самой быстрой оказалась библиотека lkJson, которая справилась с заданием за примерно 14 секунд и заняла в памяти чуть больше 1 Гб.
Delphi Web Utils затратила в 14 раз больше времени (3 минуты 46 секунд), но в памяти заняла примерно на 100 Мб меньше.
Что тут можно сказать…lkJson, как и Delphi Web Utils не обновлялись с 2013 года, однако с задачей парсинга большого JSON справились. Так что, если вы ищите небольшую, но достаточно быструю библиотеку для парсинга больших и очень больших JSON-объектов, то, думаю, что Вам стоит присмотреться к lkJson.
-
-
Вам что нужно сделать? Связать Windows и Android или iOS?
-
-
А если нужно будет указать длительность 24 или 25 часов?
Сделай обычный TLabel и рядом кнопки + - которые будут прибавлять убавлять единицу, или можно использовать TSpinBox
-
Вообще время должно отображаться в том формате, который показывает TimeEdit по умолчанию. Т.к. это системный формат, и он удобен тому пользователю, которые его установил.
24 часовой формат:
TimeEdit1.Format := 'HH:mm';
Чтобы принудительно на am pm перевести:
TimeEdit1.Format := 'hh:mm ampm' - главное чтобы была строчка ampm или am\pm или .
-
Там много чего перестало работать в токио, плюс упала в 2 раза производительность, нужно подождать обновление, а до этого лучше не использовать Токио для Android. Больше информации на сайте эмбаркадеро.
-
Попробуйте THashSHA1.GetHMACAsBytes из System.Hash.pas
Вообще мне больше нравятся System.Net компоненты вместо Indy.
Ну и вдогонку
function OAuthEncryptHMACSha1(const aValue, aKey: string): string; begin Result := TNetEncoding.Base64.EncodeBytesToString( THashSHA1.GetHMACAsBytes(aValue, aKey) ); end;
-
Равиль Зарипов
Спасибо. А как вообще проводиться авторизация? Ведь пользователь должен ввести свой email и пароль к своему DropBox акку?
Через что это делается?
Насколько я понял через TWebBrowser?
-
Спасибо что попробовали, я тоже по разному пытался.
-
Vitaldj
Идея была в том что FireDac универсальный мультиплатформенный компонент для доступа к разным базам данных.
Покурив мануалы, понял что FireDac MySQL не работает на моб. платфомах, есть только вариант использовать DevArt DAC, он работает с mySQL с моб. платформы, правда он платный (FireDac тоже в принципе платный ).
-
Цитата
И для мобильных операционных систем ты не найдешь драйвера
Вообще информации много в сети по поводу доступа из моб. систем при помощи FireDac, это и статьи, видео и темы на форумах..
Откуда у вас такая информация?
-
RESTAPI для меня новый компонент.
Ничего не знаю о нем. Нашел пару статей о том как сделать upload ,
http://simshelloworld.blogspot.co.uk/2014/12/restuploadfile.html
https://forums.embarcadero.com/thread.jspa?threadID=109596
но там показан только upload, а как провести авторизацию? Ведь пользователь должен ввести свой email и пароль, должна показаться формочка с кнопкой разрешить.. Вобщем с чего начать подскажите пожалуйста?
P. s. Есть набор компонентов TMS FMX Cloud - там все это есть и рабочее, но денег у меня к сожалению нет на его покупку (в год 150$)...
-
Илья Захаров
FireDac мультиплатформенный, это то что рекомендует использовать Embarcadero для доступа к база.
-
-
-
English... please, do you speak it?
Как сделать аналог Autosize в TImage
в TImage
Опубликовано · Изменено пользователем ENRGY
Равиль огромное вам спасибо, так просто. Все работает. Обычная пропорция.
Я думал сложнее (я делал Image1.Height := Image1.Bitmap.Height; ). И заодно решилась проблема, когда увеличиваешь размер формы, картинка корректно увеличивается с Fit.
Вот правильный код, который посоветовал Равиль: