Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1328195461
Димка На
2012-02-02 19:11
2012.06.03
Локальный сниффер.


15-1328387403
Юрий
2012-02-05 00:30
2012.06.03
С днем рождения ! 5 февраля 2012 воскресенье


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


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


15-1328272996
Тимохов Д
2012-02-03 16:43
2012.06.03
Проблема со шрифтами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский