|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Отображение картинок по данным из базы
Всем привет!
Есть такая задачка. Есть база данных, например, CAR_NAME - название авто, IMAGE_FILE_NAME - и путь к ее картинке на сервере. Когда пользователь выбирает машину, картинка подгружается в локальный кэш на диск и отображается в программе. В следующий раз картинка не качается, а берется из кэша. Все просто, когда речь идет о выводе данных по одной машине. Теперь собственно задача. Нужно выводить на форму картинки машин списком. Ну как выводятся товары в интернет-магазинах. По сути задача сводится к созданию интерфейса наподобие ACDSee. Там программа тоже считывает файлы с диска и показывает их миниатюры. Тут миниатюры делать не нужно, там размеры файлов уже фиксированы, но нужно выводить списком картинки. Так вот вопрос: какой компонент на ваш взгляд для этого лучше использовать? Я пока что вижу следующее решение: 1. Получить размеры формы 2. Динамически создать нужное количество компонентов TImage и позиционировать их на форме, чтобы получился аналог сетки 3. В каждый компонент TImage в потоках загружать фотки, чтобы приложение не висло в момент загрузки и скроллинга 4. При скроллинге использовать графический буфер, чтобы не было мерцания Но что-то мне подсказывает, что уже есть готовые решения, ведь задача типовая... Может кто подскажет компонент или решение? |
#2
|
|||
|
|||
Я использовал EasyListView из пакета MustangPeak.
Вообще, DevExpress тоже в своем гриде такое умеет. Можно и свой такой компонент написать (тоже делал), там не так сложно, как кажется... |
#3
|
||||
|
||||
А вот так не устроит?
Код:
unit Unit27; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls; type TForm27 = class(TForm) WebBrowser1: TWebBrowser; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const HtmTemplate: String = '<html><body style="margin:0">%s</body></html>'; var Form27: TForm27; implementation uses ActiveX, IOUtils, Types; {$R *.dfm} procedure TForm27.Button1Click(Sender: TObject); Var Htm: TStringStream; HtmBody: TStringList; Dir: TDirectory; Files: TStringDynArray; i: Integer; begin WebBrowser1.Navigate('about:blank'); Htm := TStringStream.Create; HtmBody := TStringList.Create; Files := Dir.GetFiles('D:\Install\GlyFx\BigPicture\', '*.png'); for i := 0 to Length(Files) - 1 do begin if ExtractFileExt(Files[i]) = '.png' then HtmBody.Add('<img src="' + Files[i] + '">'); if i = 30 then Break; end; Htm.WriteString(Format(HtmTemplate, [HtmBody.Text])); Htm.Position := 0; (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(Htm)); HtmBody.Free; Htm.Free; end; end. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
|||
|
|||
Спасибо за ответы
Не удержалася и вместо того, чтобы дождаться ответа, просто сделал как планировал. В итоге потоки не потребовались, в принципе итак работает нормально. Так же как и графический буфер. В общем, решение через несколько TImage вполне подходит. Вот тут видео, как это работает. https://yadi.sk/i/KNA6l9UbUgYct Фотки каждая размером примерно 50 кб. К сожалению, с MustangPeak ознакомиться не удалось, их официальный сайт, похоже не работает. Жаль, надеялся на хорошую библиотеку. C DevExpress все никак не разберусь, как-то все у них мутно... Вроде картинки красивые, но как это сделать - нужно долго и нудно разбираться. А насчет использования браузера - интересный прием, который не приходил мне в голову. Когда-нибудь использую |