Форум: "Прочее";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];
ВнизПодбор подходящего компонента Найти похожие ветки
← →
>|< (2012-01-31 13:34) [0]Уважаемые коллеги!
Подскажите, какой лучше использовать компонент в качестве визуального контейнера для большого множества уменьшенных копий изображений из указанной папки?
← →
Rouse_ © (2012-01-31 14:33) [1]TListView
← →
Игорь Шевченко © (2012-01-31 14:35) [2]TPaintBox
← →
Ega23 © (2012-01-31 14:38) [3]
> TListView
Вдогонку: ViewStyle := vsIcon
← →
Dimka Maslov © (2012-01-31 14:53) [4]TCustomControl
← →
>|< (2012-01-31 15:02) [5]Пока остановился на TScrollbox
Суть задачи такова:
Отобразить пиктограммы изображений, которые хранятся в выбранной папке.
Необходимо реализовать отклик программы при выборе папки с большим количеством изображений, чтобы не было подвисаний при создании и отображении пиктограмм.
То есть, насколько я понимаю, формировать список пиктограмм и их отображения нужно делать в потоке...
← →
>|< (2012-01-31 15:05) [6]
> > TListView
>
>
> Вдогонку: ViewStyle := vsIcon
сначала рассматривал этот вариант в связке с ImageList, но при загрузке в него разных изображений с разными пропорциями, теряются эти самые пропорции и все картинки получаются строго квадратными.
Поэтому остановился на создании серии TImage со свойством Proportional :=true
А потом список этих изображений помещаю в TScrollbox в виде плитки.
Как-то так...
← →
Jeer © (2012-01-31 15:09) [7]
> и их отображения нужно делать в потоке...
в водопаде :)
← →
MBo © (2012-01-31 15:13) [8]>серии TImage
Плохая идея
← →
>|< (2012-01-31 16:22) [9]
> >серии TImage
> Плохая идея
предложите идею получше)
Заранее благодарен.)
← →
Омлет © (2012-01-31 18:05) [10]http://rmklever.com/?tag=thumbnails
http://sourceforge.net/projects/karsten/ (http://www.koders.com/info.aspx?c=ProjectInfo&pid=936AD7HF7UB94BUSTY5S6VV8MC)
http://www.lohninger.com/thumbnails.html
http://www.vclcomponents.com/s/0__/delphi_thumbnail/
http://www.delphipages.com/records.cfm?kw=thumbnail
http://www.filebuzz.com/findsoftware/Delphi_Thumbnails_Generate/1.html
← →
>|< (2012-01-31 19:23) [11]
> Омлет © (31.01.12 18:05) [10]
Спасибо за ссылки.
Кто помнит, как называется WinAPI-функция, которая изменяет размеры картинки?
← →
MBo © (2012-01-31 19:33) [12]>WinAPI-функция, которая изменяет размеры картинки
подозреваю, что речь идёт о StretchBlt
← →
antonn © (2012-02-01 01:42) [13]вероятно с учетом пропорций хочет
← →
>|< (2012-02-01 12:22) [14]
> вероятно с учетом пропорций хочет
>
таки хочет. StretchBlt - это позволяет?
> Игорь Шевченко © (31.01.12 14:35) [2]
>
> TPaintBox
После всех раздумий, решил остановиться на Вашем варианте.
Тогда и поток не нужен.
Строить в памяти 100500 пиктограм нет смысла.
Пользователю все равно будет показано не более 10-15 штук.
А уже по мере прокрутки выводить следующие.
← →
Омлет © (2012-02-01 12:40) [15]
> > TPaintBox
> После всех раздумий, решил остановиться на Вашем варианте.
У TPaintBox нет полос прокрутки. Лучше наследоваться от TScrollingWinControl и рисовать прямо на нём.
> StretchBlt - это позволяет?
Да.
← →
>|< (2012-02-02 12:18) [16]
> У TPaintBox нет полос прокрутки. Лучше наследоваться от
> TScrollingWinControl и рисовать прямо на нём.
Все таки сделал реализацию в TPaintbox и добавил две кнопки вверх вниз.
Чтобы остальные пиктограммы рисовались по требованию.
Зачем рисовать 100500 пиктограмм в памяти, если видны будут только около десятка.
Также применил использование потока, чтобы при построении пиктограмм, программа откликалась на действия пользователя.
Но иногда возникает ситуация, когда создаются два потока, вместо одного и блокируют друг друга намертво.
Возможно, стоит использовать критическую секцию для подсчета количества созданных потоков.
Кто силен в работе с потоками(отрисовке в потоке), посоветуйте, как улучшить код.
Сам код:
TThumbThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create;
end;
TfrmThumbViewer = class(TForm)
DriveComboBox: TDriveComboBox;
DirectoryListBox: TDirectoryListBox;
LeftPanel: TPanel;
RightPanel: TPanel;
Splitter: TSplitter;
btnUp: TBitBtn;
btnDown: TBitBtn;
pbImageContainer: TPaintBox;
TempImage: TImage;
procedure DirectoryListBoxChange(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure btnUpClick(Sender: TObject);
procedure btnDownClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
koefx, koefy, FCurrentRow, LastRow: integer;
FileListBox: TStringList;
Filter: string;
procedure DrawThumbs;
procedure Start;
procedure Stop;
function Running: Boolean;
procedure CalcProportion;
procedure SetCurrentRow(const Value: integer);
procedure BuildFileList;
property CurrentRow: integer read FCurrentRow write SetCurrentRow;
protected
ThumbThr: TThumbThread;
procedure UpdateActions; override;
public
{ Public declarations }
end;
var
frmThumbViewer: TfrmThumbViewer;
implementation
procedure TfrmThumbViewer.Start;
begin
if Running then
Exit;
ThumbThr := TThumbThread.Create;
end;
procedure TfrmThumbViewer.Stop;
begin
if ThumbThr <> nil then
begin
ThumbThr.Terminate;
ThumbThr.WaitFor;
ThumbThr.Free;
ThumbThr := nil;
end;
end;
constructor TThumbThread.Create;
begin
FreeOnTerminate := False;
inherited Create(False);
Priority := tpLower;
end;
procedure TThumbThread.Execute;
begin
frmThumbViewer.pbImageContainer.Canvas.Lock;
try
frmThumbViewer.DrawThumbs;
finally
frmThumbViewer.pbImageContainer.Canvas.Unlock;
end;
end;
procedure TfrmThumbViewer.DirectoryListBoxChange(Sender: TObject);
begin
BuildFileList;
CalcProportion;
CurrentRow := 0;
end;
procedure TfrmThumbViewer.SetCurrentRow(const Value: integer);
begin
if Value <> FCurrentRow then
begin
FCurrentRow := Value;
end;
Stop;
Start;
end;
← →
Anatoly Podgoretsky © (2012-02-02 12:31) [17]
> Но иногда возникает ситуация, когда создаются два потока,
> вместо одного и блокируют друг друга намертво.
Проблема наверно в DrawThumbs
← →
Псарь (2012-02-02 12:33) [18]StretchBlt спасает.
← →
>|< (2012-02-02 12:44) [19]
> Проблема наверно в DrawThumbs
Проблема возникает, когда изменяется размер формы.
Насколько я понимаю, вывод графики в VCL однопоточный и помимо моего потока создается еще и поток самой VCL который пытается получить доступ к ресурсу, который заблокирован моим потоком...как-то так.
Что можно сделать в этой ситуации?
← →
Anatoly Podgoretsky © (2012-02-02 12:59) [20]> >|< (02.02.2012 12:44:19) [19]
Все тоже, проблема наверно в DrawThumbs
← →
>|< (2012-02-02 13:00) [21]Проблема решена.
И она не связанна с тем что, вывод графики в VCL однопоточный.
Все спасибо за помощь!:-)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c