Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.06.03;
Скачать: CL | DM;

Вниз

Подбор подходящего компонента   Найти похожие ветки 

 
>|<   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.007 c
2-1327746260
Festil
2012-01-28 14:24
2012.06.03
Динамические TButton, определение нажатия.


15-1327955402
Юрий
2012-01-31 00:30
2012.06.03
С днем рождения ! 31 января 2012 вторник


15-1327682610
tesseract
2012-01-27 20:43
2012.06.03
По поводу совместимости Delphi


15-1327005002
Юрий
2012-01-20 00:30
2012.06.03
С днем рождения ! 20 января 2012 пятница


2-1327475787
Xmen
2012-01-25 11:16
2012.06.03
ExcelApplication1WorkbookBeforeClose не получается закрыт Excel