Работа с пользовательской сеткой изображений - PullRequest
2 голосов
/ 27 марта 2012

Я искал пользовательскую сетку изображений и нашел похожий вопрос , в ответе которого был действительно приятный компонент.

Я скачал код и после некоторой путаницы мне удалосьполучить его для компиляции в DXE2.Это выглядит действительно круто, но я не могу найти ни одну полосу прокрутки.Я также не могу понять, как динамически управлять отображаемыми изображениями.Или как обновить сетку на основе событий клавиатуры.

Кроме того, для ее компиляции мне пришлось удалить ссылки GR32;у библиотеки, которую я скачал, было слишком много несовместимостей с DXE2, чтобы я мог ее разрешить.

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

Обновление от Билл :

Вот скриншот неправильной миниатюры.Я не могу заставить миниатюры выглядеть как скриншот из рассматриваемого компонента .

Thumbnail Painting of ImageGrid

Если миниатюры были нарисованы в том же XY, что и ректынарисованные на первом проходе они будут выглядеть намного лучше.Есть идеи о том, что происходит?

1 Ответ

1 голос
/ 27 марта 2012

... но я не могу показать ни одну полосу прокрутки.

Ну, горизонтальной полосы прокрутки нет. Существует свойство ColWidth, которое управляет количеством изображений, рисуемых в одном ряду, в зависимости от ширины элемента управления. Вы можете обновить ColWidth в обработчике событий OnResize из-за настроек привязки, например.

Вертикальная полоса прокрутки появляется автоматически, когда не все изображения (включая интервал) помещаются в клиенте. Изображения нарисованы на TPaintBox, а размер этой коробки для рисования обновляется, как только меняется число изображений:

procedure TImageGrid.RearrangeImages;
begin
  ...
    FPainter.Height := Max(ClientHeight,
      FRowCount * (FRowHeight + FImageSpacing) - FImageSpacing);

Компонент наследуется от TScrollingWinControl, поэтому полоса прокрутки должна соответственно измениться. Если нет, то Билл найдет обходной путь, который прокомментирован:

VertScrollBar.Range := FRowCount * (FRowHeight + FImageSpacing) - FImageSpacing;

Я понимаю, что это, очевидно, также работает, но мне действительно интересно, почему диапазон полосы прокрутки должен быть изменен вручную. Здесь, в D7, у меня нет проблем со скрытой вертикальной полосой прокрутки.

... Я также не могу понять, как динамически управлять отображаемыми изображениями. ...

Самый простой способ заполнить компонент - присвоить свойству Folder путь с изображениями. Будут загружены только изображения с форматами файлов в свойстве FileFormats. Чтобы указать изображения вручную (например, для объединения нескольких папок), используйте свойство FileNames. Когда установлено свойство Folder, свойство FileNames соответствующим образом обновляется, но эти имена файлов не сохраняются в DFM. Когда вы изменяете имена файлов (например, удаляете одно из папки), свойство Folder очищается, а компонент использует вместо него свойство FileNames.

... Или как обновить сетку на основе событий клавиатуры. ...

В настоящее время реализованы только нажатия клавиш «Вверх», «Вниз», «PageUp», «PageDown», «Home» и «End», которые прокручивают элемент управления. Какие еще ключевые действия вы хотите? Это зритель.

Вот скриншот неправильной картинки. Я не могу заставить миниатюры выглядеть как скриншот из рассматриваемого компонента. ... Если миниатюры были нарисованы в том же XY, что и каноны, нарисованные в первом проходе, они выглядели бы намного лучше.

При загрузке изображений рисуется временный прямоугольник размером ColWidth * RowHeight. Все изображения растягиваются в пределах этого размера, поэтому отрегулируйте соотношение этих свойств, чтобы расстояние было одинаковым везде. Обратите внимание, что вы также можете влиять на внешний вид с помощью свойств ImageHorzAlign и ImageVertAlign.

Обновление:

Компонент, на который вы ссылаетесь, был недавно полностью переписан, а некоторые из приведенных выше ответов устарели.

Теперь у него есть свойство Propertional, которое по умолчанию равно True, но когда установлено False, оно будет растягивать большие пальцы до любого размера ячейки, который вы установили, независимо от размеров исходного изображения. Маленькие изображения могут оставаться узкими, если только вы не установите новое свойство Stretch в True.

Теперь он различает RowHeight и CellHeight и ColWidth и CellWidth. Разница между ними составляет CellSpacing.

Компонент больше не спускается с TScrollingWinControl, а с TCustomControl и добавляется только вертикальная полоса прокрутки.

...