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

RoschinSpb

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

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

  • Посещение

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

    10

Весь контент RoschinSpb

  1. Вот добавил пример для URL в ту же ветку, коль скоро там велось обстоятельное обсуждение. Также в ImageListDemo есть пример добавления картинки нарисованной вручную См. procedure TMainForm.AddSourceToItem(const Index: Integer);
  2. А вот вариант загрузки из этихвашихинтернетов из сети по заданному URL procedure TForm2.Button2Click(Sender: TObject); const SourceName = 'Картинка'; function LoadPicture(const SourceName: string; const Scale: Single; const URL: string): TCustomSourceItem; var HTTPClient: TNetHTTPClient; Stream: TMemoryStream; TmpBitmap: TBitmap; BitmapItem: TCustomBitmapItem; begin Result := nil; Stream := nil; TmpBitmap := nil; HTTPClient := TNetHTTPClient.Create(nil); try Stream := TMemoryStream.Create; HTTPClient.Get(URL, Stream); Stream.Position := 0; TmpBitmap := TBitmap.Create; TmpBitmap.LoadFromStream(Stream); if (TmpBitmap.Width > 0) and (TmpBitmap.Height > 0) then begin Result := ImageList1.Source.Add; Result.Name := SourceName; Result.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; Result.MultiResBitmap.SizeKind := TSizeKind.Source; Result.MultiResBitmap.Width := Round(TmpBitmap.Width / Scale); Result.MultiResBitmap.Height := Round(TmpBitmap.Height / Scale); BitmapItem := Result.MultiResBitmap.ItemByScale(Scale, True, True); if BitmapItem = nil then begin BitmapItem := Result.MultiResBitmap.Add; BitmapItem.Scale := Scale; end; BitmapItem.Bitmap.Assign(TmpBitmap); end; finally HTTPClient.Free; TmpBitmap.Free; Stream.Free; end; end; var NewSource: TCustomSourceItem; NewDestination: TCustomDestinationItem; NewLayer: TLayer; begin if ImageList1.Source.IndexOf(SourceName) = -1 then begin NewSource := LoadPicture(SourceName, 1, 'http://voy.dk/wp-content/uploads/2010/06/Avril-lavigne-13thebestdamnthingmarkliddellshootnhy5_122_131lo-779x1024.jpg'); NewDestination := ImageList1.Destination.Add; NewLayer := NewDestination.Layers.Add; NewLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, NewSource.MultiResBitmap.Width, NewSource.MultiResBitmap.Height); NewLayer.Name := SourceName; Button1.ImageIndex := NewDestination.Index; end; end; Здесь приведен простейший вариант загрузки картинки как есть, т.е. она будет хранится в исходном размере. На телефоне может и не хватить места.
  3. Вот тут пример загрузки из файла. Во-первых убедитесь, что MultiResBitmap содержит правильную картинку и размеры. Я бы сначала загрузил во временный TBitmap узнал его параметры (убедился, что он вообще что-то реально содержит) и уже потом присвоил его TCustomBitmapItem.Bitmap.Assign, а потом удалил. Кроме того для масштаба 1 кажется всегда есть картинка. Т.е. сделать надо примерно так: BI := Source.MultiResBitmap.ItemByScale(Scale, True, True); if BI = nil then begin BI := Source.MultiResBitmap.Add; BI.Scale := Scale; end; Во-вторых вы не тот индекс используете. Надо так: NewDestination := ImageList1.Destination.Add; NewLayer := NewDestination.Layers.Add; NewLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, NewSource.MultiResBitmap.Width, NewSource.MultiResBitmap.Height); NewLayer.Name := SourceName; ControlAction1.ImageIndex := NewDestination.Index;
  4. Средствами Fire Monkey нельзя. И это относится не только к HardwareBack, Home, Menu но и вообще к любым клавишам на любой клавиатуре. Возможно можно как-то воспользоваться андроидными системными функциями, но например в Windows нету системных средств для определения наличия физических клавиш. Так что обработка горячих клавиш всегда должна дублироваться какими-то другими интерфейсными элементами, если конечно Вы не хотите намеренно скрыть что-то от обычных пользователей.
  5. Эмпирически выяснено, что vkHardwareBack есть на всех устройствах с Android (из тех, что проверялись). Это вообще специфическая для Android клавиша, для которой нет аналогов на других платформах. Остальное как получится. Теоретически можно нормальную клаву подключить, но это не проверялось.
  6. Не могу удержаться, Ярослав, но ты немного не прав. Можно удалять/изменять/загружать картинки со "съезжанием" и без оного. И хранятся они именно по уникальным именам Переименовывать картинки с уникальным именем можно в редакторе. А вот показывать имена прямо в свойстве ImageIndex не додумался. А ведь действительно искать больших списках по набранным буквам имени могло бы быть проще да и не всегда сообразишь, что изображено на маленькой картинке. Успехов
  7. Можете попробовать что-нибудь извлечь из https://community.embarcadero.com/blogs/entry/xe5-165 Но в общем присоединяюсь в своём недоумении к Равилю.
  8. Так в Битмапе или TImageList? Сделайте тестовый пример и направьте в QC. Баги обсуждать здесь бесполезно, т.к. ни кто уже не является работником Embarcadero.
  9. Яндекс переводчик вроде как по-лучше с этим справляется :o)
  10. Ну, тогда только: https://quality.embarcadero.com/secure/Dashboard.jspa
  11. Моя рекомендация такая: стройте своё приложение таким образом, чтобы избежать обработки нажатий на клавиши. Если Вы не собираетесь создавать свой собственный текстовый редактор, то для подавляющего числа случаев вполне годится обработка горячих клавиш с использованием TActionList, в противном случае изучайте исходники, смотрите какие нужно реализовывать интерфейсы и ... "Безумству храбрых поём мы песню!"
  12. Да, таким способом на мобильных платформах работать не получится. Там всё хуже, т.к. ввод может быть очень замысловатым, включая голосом. Тут я посоветую смотреть исходники, какие там интерфейсы реализованы и как.
  13. P.S. Отец Русской Демократии оно же функция Ord в коде обработки клавиш не нужны. Key сравниваете с константой vkXXX, KeyChar c буквой в апострофах, или #32 (решетка + код символа). Да и кстати, для мобильных экранных клавиатур такая обработка клавиш работать не будет.
  14. См. документацию источник знаний: KeyDown или TKeyEvent. Key это скан код клавиши приведенный к виртуальным кодам клавиш windows. Это значение получается когда нажато некоторое сочетание клавиш к примеру Ctrl+<пробел>, такие нажатия последовательно передаются всем контролам, пока один из них не обработает его и не сбросит в 0. За некоторыми исключениями эти значения определяются физическим расположением клавиш, т. е. английская клавиша <A> будет всегда располагаться приблизительно в одном и том же месте и на Mac и на Win и в России и в Гондурасе. Keychar это введенная буква. Т.е. обычная буква которая вводится при наборе текста зависит от платформы, языка, выбранной раскладки способа ввода и прочих параметров. Такие нажатия передаются только фокусному контролу. Так что для Ctrl+<пробел> надо использовать проверку if (Key = vkSpace) and (ssCtrl in shift). Для проверки нажатия Ctrl+Ф надо использовать проверку if (Key = vkA) and (ssCtrl in shift) и ни каких Key = Ord('Ф') потому, что неизвестно какая на этом месте будет буква на каком-нибудь Mac из Японии. И более того Key = Ord('Ф') = $D4 - это зарезервированный код клавиши Key = Ord('ф') = $F4 - это VK_OEM_ENLW (Only used by Nokia) Key = Ord('a') = $61 - это vkNumpad1 (1 key numeric keypad) Но проще было бы создать действие (см. TActionList и TAction), назначить на него ShortCut выбрав одно из рекомендованных значений.
  15. В качестве послесловия. Деструктор объекта не может быть вызван внутри метода этого объекта (самоубийства запрещены). Всегда можно поставить точку останова на вызов метода Free/FreeAndNil. И внимательно посмотреть стек вызова, если где-то в стеке вызова присутствует разрушаемый объект, то это не правильно. Сложности добавляет то, что это не обязательно приводит возникновению AV, вполне может быть, что у вас всё будет работать без ошибок, а на другом компьютере, или на другой платформе с ошибками. Release на самом деле приводит к отложенному удалению не внутри вызывающего метода, т.е. объект просто помечается как готовый к удалению.
  16. Дайте пример, где он рушит приложение. Статьи есть на русском языке, найдёте, если захотите.
  17. Заведите TImageList (лучше на отдельном TDataModule), добавьте туда картинки в разных масштабах. На форму положите компонент TGlyph и установите свойства Images и ImageIndex. Glyph будет выбирать наиболее подходящую картинку с учетом и масштаба и размеров.
  18. Да, действительно всю тему не прочитал, виноват. Вы тогда про FOverlayShown := True; try Sleep(1000); finally FOverlayShown := False; end; тоже не читайте, ибо малодушный поиск лёгких путей — это не спортивно Посыл сообщений физически это просто вызов некоторого метода объекта, только в отличие от обычных методов обработчики сообщений могут существовать, или не существовать. Смысл посыла сообщений в том, чтобы избавится от зависимостей, т.е. отправитель может не знать какие конкретно методы есть у получателя. Все ограничения связанные с многопоточностью остаются в силе. Главное ограничение это то, что нельзя работать с любыми интерфейсными элементами внутри потока без использования Sinchronize. Если с Sinchronize не работает, то надо написать об ошибке в QC, надеяться и ждать.
  19. 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. А лучше вообще не связывайтесь с потоками.
  20. А само свойство Images правильное значение имеет после загрузки из потока? Вообще трудно понять в чем дело. Можно код увидеть?
  21. Здесь про стили кто-нибудь говорил? Так вот в стиле как раз и указывается какой шрифт используется по умолчанию. Про стили тут вроде отдельная тема есть.
  22. В следующей версии вероятно появятся события: procedure TForm1.StringGrid1CellClick(const Column: TColumn; const Row: Integer); procedure TForm1.StringGrid1CellDblClick(const Column: TColumn; const Row: Integer); Пока ищите информацию в разделах посвященных TGrid и TStringGrid, там всё обсуждалось неоднократно.
  23. Ну, если больше двух желающих наберется, то я за!
  24. RoschinSpb

    Item.ItemData.Bitmap

    Обратите внимание, что если вы хотите поменять текстовые настройки, надо также установить свойство StyledSettings. Оно указывает какие текстовые настройки берутся из стиля, а какие из свойства.
×
×
  • Создать...