![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 все никак не разберусь, как-то все у них мутно... Вроде картинки красивые, но как это сделать - нужно долго и нудно разбираться. А насчет использования браузера - интересный прием, который не приходил мне в голову. Когда-нибудь использую ![]() |