Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2009, 04:58
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
Радость Отображение картинок из папок

есть 2 radionbutton под каждой задана папка, в них находятся картинки "Название у всех разные и изменить нельзя". При выборе одно из radionbutton показывать по очереди в image. ну если не трудно при нажатии кнопки button их перелистывать на следующую но потом продолжать цикл
Ответить с цитированием
  #2  
Старый 23.12.2009, 13:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Если это картинки в формате BMP или JPG, то ничего особо сложного.
Получаете список файлов по пути и файловой маске с помощью функций FindFirst, FindNext. Ну а дальше по нажатию на кнопку двигаетесь по этому списку, загружая картинку в TImage.
Начните, если что-то не получится, задавайте конкретный вопрос.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
dencikkk (02.11.2019)
  #3  
Старый 25.12.2009, 01:24
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
По умолчанию

Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
  fs: TSearchRec;

begin

if FindFirst(Form2.kat1.Text+'*.*', faAnyFile, fs)=0 then
   repeat
      Image1.Picture.LoadFromFile(fs.Name);
      Label6.Caption :=(fs.Name);
   until FindNext(fs)<>0;
   FindClose(fs);
end;
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 25.12.2009 в 10:16.
Ответить с цитированием
  #4  
Старый 25.12.2009, 01:28
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
По умолчанию

Вот получилось так, на сколько я понял, но только имя отображает, а вот картинку чет не получается отобразить?
Ответить с цитированием
  #5  
Старый 25.12.2009, 03:14
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
procedure TForm1.Button1Click(Sender: TObject);
var
fs: TSearchRec;
pic : TJPEGImage;
x:string;
begin
x:= Edit1.Text+'\*.jpg' ;

if FindFirst(x, faAnyFile, fs)=0 then
repeat
Label1.Caption :=(fs.Name);
until FindNext(fs)<>0;
FindClose(fs);


end;


end.

Еще такой вопрос: В данном случай он выдает имя только последнего измененного файла. Я бы хотел сделать что он выводил их по очереди при нажатии
Ответить с цитированием
  #6  
Старый 25.12.2009, 09:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Так попробуйте:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, JPEG;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Image1: TImage;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
   Files: Array of string;
   Index: Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
 fs: TSearchRec;
 x: string;
begin
 x:= Edit1.Text+'*.*' ;
 SetLength(Files, 0);
 Index := -1;
 if FindFirst(x, faAnyFile, fs) = 0
 then repeat
      if (ExtractFileExt(fs.Name) = '.bmp') or (ExtractFileExt(fs.Name) = '.jpg')
      then begin
           SetLength(Files, Length(Files)+1);
           Files[High(Files)] := Edit1.Text + fs.Name;
           end;
      until FindNext(fs)<>0;
 FindClose(fs);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Inc(Index);
 if Index > High(Files) then Index := 0;
 Image1.Picture.LoadFromFile(Files[Index]);
end;

end.
и dfm
Код:
object Form1: TForm1
  Left = 192
  Top = 114
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 8
    Top = 88
    Width = 105
    Height = 105
    Proportional = True
    Stretch = True
  end
  object Button1: TButton
    Left = 16
    Top = 56
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Edit1: TEdit
    Left = 16
    Top = 24
    Width = 289
    Height = 21
    TabOrder = 1
    Text = 'Edit1'
  end
  object Button2: TButton
    Left = 312
    Top = 24
    Width = 65
    Height = 25
    Caption = 'Button2'
    TabOrder = 2
    OnClick = Button2Click
  end
end
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 25.12.2009, 15:18
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо получилось
Ответить с цитированием
  #8  
Старый 25.12.2009, 17:50
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
По умолчанию

Теперь такая проблема! если в папке нет картинок он выдает ошибку http://files.mail.ru/JB6OWC?t=1 и ругается на
Цитата:
Image1.Picture.LoadFromFile(Files[Index]);
Возможно ли сделать если нет файлов в папке чтобы кнопка стала не активной и на форме была надпись в "Данной папке картинок нет", а то massege в работе напрягают лишний кнопки нажимать!
Еще такой вопрос, у меня есть listbox в нем содержится путь к файлу. При выборе чтобы он показывал в image но при этом не оставалось предыдущая картинка и растянул или уменьшил ее по до краев image? Как ее отобразить я сделал вот только не могу подогнать
Ответить с цитированием
  #9  
Старый 25.12.2009, 21:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для подгона изображения используйте свойство Proportional и Strech.
Количество картинок в каталоге можно узнать через Length(Files)
Если результат равен 0 значит картинок нет и кнопку отвечающую за переход к следующей картинке можно заблокировать.
Выглядит так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 fs: TSearchRec;
 x: string;
begin
 x:= Edit1.Text+'*.*' ;
 SetLength(Files, 0);
 Index := -1;
 if FindFirst(x, faAnyFile, fs) = 0
 then repeat
      if (ExtractFileExt(fs.Name) = '.bmp') or (ExtractFileExt(fs.Name) = '.jpg')
      then begin
           SetLength(Files, Length(Files)+1);
           Files[High(Files)] := Edit1.Text + fs.Name;
           end;
      until FindNext(fs)<>0;
 FindClose(fs);
 Button1.Enabled := Length(Files) > 0;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 26.12.2009, 02:15
Sanal Sanal вне форума
Прохожий
 
Регистрация: 20.12.2009
Сообщения: 11
Репутация: 10
Вопрос

Можешь посмотреть что там не так. Я уже все перепробовал не могу понять в чем ошибка наверняка какая нибудь фигня мелкая. Вкратце о программе: Мне нужно копировать ряд картинок из папки 1 в папку 2, но перед копирование нужно посмотреть какие картинки в папке. Интересуют только *.jpg
проблемы:
1. При ручном просмотре картинки через Listbox они не уменьшаются,
2. Если в папке нет картинок он выдает ошибку т.к. программа при запуске выполняет функцию отобразит картинку
Цитата:
Кнопка Button3
Image1.Visible := true;
image2.Visible := false;
Inc(Index);
if Index > High(Files) then Index := 0;
Image1.Picture.LoadFromFile(Files[Index]);
3. в Label1 нужно отобразит состояние копировании, у меня в любом случай показывает что копирование выполнено, не могу догнать как подвязать к копированию.
4. Если директория "Kat" задана не верно, нужно сделать Radiobutton неактивным, чтобы знать в чем проблема.
5. Копировать выбранную картинку из Listbox'a

Возможно ли упростить код в каких нибудь местах, если не трудно.

P.S. У меня просто времени в обрез мне целую неделю нужно работать с 9 утра до 10 вечера, не высыпаюсь. А работы до кучи а программа даже недописанная до конца выручает, а если она полностью заработает то еще и время на отдых будет Я давненько не писал немного подзабыл даже элементарные вещи не замечаю, и все таки 4 года это время.
Заранее огромное спасибо!!!
Вложения
Тип файла: rar Sun.rar (48.7 Кбайт, 17 просмотров)
Ответить с цитированием
  #11  
Старый 26.12.2009, 14:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Сейчас ругать вас буду.
У вас отличный инструмент есть в руках - отладчик, а вы им наверное не пользуетесь. Буквально сразу вылезло:
Код:
if FindFirst(Form2.kat1.Text+'\*.jpg', faAnyFile, fd)=0 then
У вас при выбраном шаблоне 1 значение Form2.kat1.Text = 'C:\1\*.*'
Ну и что будет если к 'C:\1\*.*' прибавить '\*.jpg' ? Правильно - ошибка.
Далее. Я вам код писал в расчете на использование только динамического массива, а вы теперь добавили листбокс и продолжаете использовать динамический массив. Вывод - нерационально и бездумно скопировали.
Далее:
Код:
if (ExtractFileExt(fs.Name) = '.JPG') or (ExtractFileExt(fs.Name) = '.jpg')
Это половинчатое решение, а если будет расширение .Jpg или JpG и т.д.&?
Следовательно надо делать иначе:
Код:
if UpperCase(ExtractFileExt(fs.Name)) = '.JPG'
В итоге всю процедуру можно сократить вдвое.
Код:
procedure TForm1.RadioButton1Click(Sender: TObject);
var
  fs: TSearchRec;
begin
  Label1.Caption:='Выбран шаблон №1';
  Label2.Caption:=Form2.kat1.Text;
  Label4.Caption:=Form2.kat11.Text;
  Label1.Color:=clbtnface;

  Listbox1.Clear;
  if FindFirst(Form2.kat1.Text+'\*.jpg', faAnyFile, fs) = 0 
  then Repeat
         Listbox1.AddItem(Form2.kat1.Text+'\'+fd.Name, nil);
         until FindNext(fd)<>0;
  FindClose(fs);
  Button3.Enabled := not Listbox1.isEmpty;
end;

Весь код жутко неоптимален.
На кой бес для каждого радиобатона вы свой обработчик пишете? У вас одного общего хватит.

Можно еще долго продолжать. Ошибок и недоработак - тьма.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025