RoschinSpb

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

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

  • Посещение

  • Days Won

    6

RoschinSpb last won the day on 13 февраля

RoschinSpb had the most liked content!

3 подписчика

О RoschinSpb

  • Звание
    Embarcadero FireMonkey разработчик

Контакты

  • Сайт
    http://blogs.embarcadero.com/roschinspb

Информация

  • Пол
    Не определился
  • Город
    Санкт-Петербург

Посетители профиля

459 просмотров профиля
  1. При первой загрузке фотографии уменьшайте её до адекватных размеров допустим 64x64. Полученную миниатюру добавляйте в ImageList. Для сокращения использования памяти присвойте свойству Dormant значение True. Увеличте значение CacheSize, так, чтобы оно было немного больше количества одновременно видимых картинок.
  2. Всё правильно, только тут речь идет о политике IDERA. От Embarcadero осталось одно название (в прямом и переносном смысле). Арфы нет, возьмите бубенпопробуйте нативный грид под IOS, должон перемещаться плавнее
  3. Ломать не строить, здесь нет ни каких сложностей. TImageList содержит две коллекции Source и Destination. Удаляете из них Item`ы как из обычных коллекций TCollection с помощью методов Delete и Clear. В Source находятся сами изображения, в Destination ссылки на Source. Если удалите только из Source, то в нумерация изображений не поменяется и останутся пустые элементы, хотя расход памяти уменьшится. Если удалите только из Destination, то нумерация картинок съедет, и расход памяти почти не изменится. Каждый элемент Destination может содержать несколько ссылок на Source это коллекция Layers, из которой точно также можно удалять элементы.
  4. Я уже писал о том, что так оно и есть, и дважды приводил примеры которые это демонстрируют. Если бы это было не так, новый элемент просто не смог бы добавиться. procedure TForm2.Button1Click(Sender: TObject); begin // Добавляем новый элемент в колекцию ImageList1.Source // И присваиваем тексту кнопки имя свежесозданного элемента Button1.Text := ImageList1.Source.Add.Name; end; vSource := Self.Source.Add; // Здесь безо всякого Tag имеем уникальное имя vSource.Name if AName <> '' then // Если задали какоето своё имя AName то, присваиваем его, если такое имя уже есть, получаем исключение vSource.Name := AName; // Если не задали своё имя оставляем как есть // В любом случае дальше используем vSource.Name Но, как я понял, мои ответы отправляются в пустоту без попыток осмысления...
  5. Еще раз обращаю внимание: обязательный идентификатор инициализируется значением по умолчанию. Если не видите в нем смысла (это вовсе не значит что его нет), ни кто Вас не заставляет его использовать, по сути он и является опциональным. function TImageListHelper.Add(aBitmap: TBitmap; const AName: string = ''): integer; ... begin ... vSource := Self.Source.Add; if AName <> '' then vSource.Name := AName; Использование Tag мало того, что просто дурной тон, оно еще и лишнее и снижает базовую функциональность. С тем же успехом спрошу, а при чем здесь StringList, здесь больше уместна аналогия с TComponent.Name. Я Вам привел конкретные примеры зачем оно может использоваться (а может и не использоваться). Вы приводите гипотетические версии, что можно было бы сделать, конечно можно всё, можно даже заполнять список рандомными данными, но какой в этом практический смысл. И вообще мне странно, что Вы сначала жалуетесь, на излишнюю сложность и уже на следующей строке перекладываете на программиста куда более сложную задачу (формировать отдельные списки/структуры). В подавляющем большинстве случаев пользователь формирует коллекцию в DesignTime и не углубляется в дебри. Если же речь идет о динамической загрузке, это почти всегда что-то нестандартное, тут уже возможны всякие варианты (заменять, поднимать исключение, делать еще что-нибудь, не делать ни чего), но почти всегда важно застраховаться от повторной загрузки, или случайного перетирания одного изображения другим. И здесь могут помочь "человеческие" названия. В сложном приложении порядок загрузки может легко и непринужденно поменяться.
  6. Përdorni specializuar përbërës, për të shfaqur të bazave të të dhënave. Nëse Ju provoni për të ngarkesës të gjitha foto, atëherë ju nuk keni të mjaftueshme burimet e sistemit. TGrid komponent i mban në kujtesë vetëm ato imazhe të cilat janë të dukshme në ekran. Shikoni një shembull që ju lejon për të shfaqur imazhe nga dataset. http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FMX.GridDemo_Sample TDataSet duhet të përmbajë një fushë TGraphicField. Prona BlobType duhet të jetë vendosur për të ftGraphic. Ju duhet të lidhin atë me tabela, duke përdorur LiveBinding
  7. Это смотря какая идея. В некоторых случаях уместно заменить, в некоторых это неуместно, или недопустимо. Например у Вас процедура инициализации (которая загружает сотню картинок) в процессе долгой разработки она перемещалась из OnShow в OnCreate потом в OnActivate где-то забыли удалить вызов и теперь эта процедура вызывается два раза. Допустим в приложении появилась вторая, третья, N+1 форма. Я не знаю отнаследовалась она, или просто скопипастилась, или Вы что-то добавили в Design-Time, так или иначе есть ненулевая вероятность получить неоднократное добавление одного и того же. Ситуация ошибочная и хорошо бы как-то об этом узнать, такая вот идея у меня была. В Вашем случае и не заменит и не предупредит об ошибке, т.е. потенциально имеем утечку ресурсов. Вы бы смогли догадаться, что изображено на этих картинках без доп. описания? Картинки конечно неважные, но в коде-то Вы их вообще не видите. В итоговой коллекции обращение идет всё равно по номеру, потому, что соображения совместимости важнее удобства, но во всяком случае есть возможность найти картинку по человекопонятному описанию например: ImageList1.Source.IndexOf('я'); ImageList1.Destination[0].Layers[0].Name; Надеюсь, я внес некоторое понимание. Кстати, при добавлении новой картинки по умолчанию у неё и так имеется уникальное имя вида "Item 0", "Item 1" и т. д. procedure TForm2.Button1Click(Sender: TObject); begin Button1.Text := ImageList1.Source.Add.Name; end;
  8. Использование Tag, как бы намекает Не стоит скрывать свойство TCustomSourceItem.Name от пользователя, пусть сам заботится об уникальности (не такая уж это большая проблема). Это свойство может быть использовано для предотвращения случайной повторной загрузки, допустим если есть картинка с указанным названием поднимать исключение. На случай, если нужно заменить имеющуюся картинку, можно добавить метод AddOrReplace. Успехов
  9. Может это онa?
  10. Во-первых RoschinSpb попросит передать горячий и пламенный привет в QC. Во-вторых, если Вы создаете свой собственный стиль, то лучше бы соблюдать стандартную структуру стилевых объектов FGlyphObject это, как не сложно догадаться, стилевой элемент 'glyph'. Он содержит галочку и картинку. Возможно также что картинка будет располагаться не поверх галочки (как в Windows), а рядом с галочкой как в Mac. В этом случае glyphstyle будет расположена не внутри glyph, а рядом. В-третьих, если Вам просто требуется использовать ImageList, то нет смысла создавать свой стиль. Если Вы тренируетесь в создании стилей, то надо изучать соответствующий раздел и, скорее всего, исходники тоже.
  11. Вот добавил пример для URL в ту же ветку, коль скоро там велось обстоятельное обсуждение. Также в ImageListDemo есть пример добавления картинки нарисованной вручную См. procedure TMainForm.AddSourceToItem(const Index: Integer);
  12. А вот вариант загрузки из этихвашихинтернетов из сети по заданному 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; Здесь приведен простейший вариант загрузки картинки как есть, т.е. она будет хранится в исходном размере. На телефоне может и не хватить места.
  13. Вот тут пример загрузки из файла. Во-первых убедитесь, что 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;
  14. Средствами Fire Monkey нельзя. И это относится не только к HardwareBack, Home, Menu но и вообще к любым клавишам на любой клавиатуре. Возможно можно как-то воспользоваться андроидными системными функциями, но например в Windows нету системных средств для определения наличия физических клавиш. Так что обработка горячих клавиш всегда должна дублироваться какими-то другими интерфейсными элементами, если конечно Вы не хотите намеренно скрыть что-то от обычных пользователей.
  15. Эмпирически выяснено, что vkHardwareBack есть на всех устройствах с Android (из тех, что проверялись). Это вообще специфическая для Android клавиша, для которой нет аналогов на других платформах. Остальное как получится. Теоретически можно нормальную клаву подключить, но это не проверялось.