Форум: "Media";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];
Вниз
Помогите пожалуйста! Найти похожие ветки
← →
nick_vstu (2002-01-23 03:03) [0]Здраствуйте!
Подскажите пожалуйста как заставить мою програмку работать быстрее(или хотя бы просто работать).
Программа выполняет следущие действия:
1. Ищет все jpeg-файлы в укказаном каталоге;
2. Поочереди загружает их в TJpegImage;
3. Преобразовивает в BMP;
4. Маштабирует;
5. Додает в TImageList;
6. Потом все картинки отображаются в TDrawGrid
(В обработчике события OnDrawCell соответствуещаяся
картинка рисуется на канвасе TDrawGrid)
Проблема1: Картинки загружаются и ммаштабируются очень медленно.
Может этот процесс можно както ускорить.
Проблема2: Когда все уже загрузилось, и картинок больше 100,
начать прокручивать содержимое TDrawGrid, где-то на
середине программа выдает сообщение что системе
не хватает ресурсов.
Зарание благодарен.
← →
Фэ (2002-01-23 03:10) [1]P-4, Athlon-XP (>1500)
>256M
Win2000
HDD 7200 rpm
← →
nick_vstu (2002-01-23 03:29) [2]Извините что не в тот раздел, было два разных вопроса, задумался и написал оба в один раздел.
← →
Hrul (2002-02-13 17:05) [3]Возможно, что у Вас в программе после преобразований не освобождается память. Точнее GDI - не возвращает ее после отрисовки. Попробуйте явным образом освобождать ее после преобразований.
← →
nick_vstu (2002-02-14 00:23) [4]> Hrul
Вы имеете ввиду память которую занимает канвас?
Обясните пожалуйста что и как нужно освобождать.
← →
Лёша (2002-02-14 04:24) [5]Проблема1: JpegImage.Scale позволяет "маштабировать" изображение еще до загрузки файла. Специально придуманно для предварительного просмотра большого количества jpg.
type TJPEGScale=(jsFullSize,jsHalf,jsQarter,jsEighth);
Проблема2: Не понятно откуда рисуется картинка на TDrawGrid.
Если из TImageList, то проблем быть не должно.
← →
nick_vstu (2002-02-16 01:35) [6]2 Леша. Спасибо! Первую проблему - решили!
Осталась вторая.
Тот исходник пропал вместе с винтом :(
Пришлось написать новый, только вместо DrawGrid - ListBox
но нисчего - проблемы остались те же.
Вот иходник обеих процедур:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
b0,b1:TBitmap;
Rect:TRect;
begin
b0:=TBitmap.create;
b1:=TBitmap.Create;
For i:=0 to 100{FileListBox1.Items.Count-1} do
begin
FileListbox1.ItemIndex:=i mod 6 ;
b0.LoadFromFile(FileListBox1.FileName);
b1.Height:=50;
b1.Width:=50;
Rect.Top:=0; Rect.Left:=0; Rect.Right:=50; Rect.Bottom:=50;
b1.Canvas.StretchDraw(Rect,b0);
ImageList1.Add(b1,b1);
ListBox1.Items.Add(" ");
application.ProcessMessages;
end;
b1.FreeImage;
b0.FreeImage;
end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var B:TBitmap;
begin
b:=TBitmap.create;
ImageList1.GetBitmap(Index,b);
ListBox1.Canvas.Draw(Rect.left+1,Rect.Top+1,b);
b.FreeImage;
end;
Я заметил что при непрерывном прокручивания ListBox не обрабатываются сообщения (программа подвисает) возможно проблемма именно в этом нужно както заставить их обработаться.
IMHO надо ловить сообщение которое посылается при прокручивании ListBox-a и запускать ProcessMesseges.
Если это так - то какое сообщение?
← →
Лёша (2002-02-17 03:31) [7]FreeImage "очищает" дескриптор битмапа для дальнейшего использования. Если на данный дескриптор есть ссылки, то он дублируется. Используй: b.Free;
← →
nick_vstu (2002-02-20 03:12) [8]2 Лёша
Поменял на Free но проблема не исчезла.
Может есть еще какие-нибудь предложения.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c