
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
отображение jpg в delphi
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
|
Опции темы |
|
|
#1 |
|
аццкий троглодит
Сообщений: 3,234
Регистрация: 28.02.2004
Возраст: 41
|
отображение jpg в delphi
надо из папки с изображениями вывести на экран превьюхи...
кол-во файлов может меняца. канвас выводит только в области видимости... соотв когда изображений много, отрезает те, кот не поместились... может кто знает нормальное решение? |
|
|
|
#3 |
|
Кэп Улитка
Сообщений: 8,067
Регистрация: 04.05.2005
Возраст: 46
|
Спроси лучше тут
http://forum.sources.ru/index.php?showforum=9 Или скачай FAQ от сюда - www.drbk.ru (~10мб) Ниже оттуда ответ на 2-ой вопрос. по поводу 1-го - тупо грузить jpg и уменьшать их в pазмеpe - это коpяво , т.к. фоpмат jpg определяет хранение превью [миникопии изображения] в самом файле - работать будет намного быстрее. Как сделать конкретно понятия не имею - особо не заморачивался, мож есть какой компонент - глянь на torry.net ======================================== Как поместить графическое изображение в TDBGrid Использование свойства Canvas компонента TDBGrid в методе OnDrawColumnCell позволяет не только выводить в ячейке текст методом TextOut, но и размещать в ячейках графические изображения. В этом случае используется метод Draw свойства Canvas. Модифицируем наш пример, добавив в форму компонент TImageList и поместив в него несколько изображений. Модифицируем код нашего приложения: Соответствующий код для Delphi имеет вид: procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Im1: TBitmap; begin Im1 := TBitmap.Create; if Column.FieldName = 'VenueNo' then with DBGrid1.Canvas do begin Brush.Color := clWhite; FillRect(Rect); if Table.FieldByName('VanueNo').Value = 1 then ImageList1.GetBitmap(0, Im1) else ImageList1.GetBitmap(2, Im1); Draw(round((Rect.Left + Rect.Right - Im1.Width) / 2), Rect.Top, Im1); end; end; Теперь в TDBGrid в колонке VenueNo находятся графические изображения. |
|
|
|
#4 |
|
аццкий троглодит
Сообщений: 3,234
Регистрация: 28.02.2004
Возраст: 41
|
канвас не присваивает каждой ячейке по картинке, а просто рисует поверх. при скроллинге вниз/вверх изображение пропадает.
задача вобще такая: при нажатии на одну кнопку, отобразить все изображения из одной папки при нажатии на другую - из другой. поиск файлов реализован, пути записаны в массив... а вот с выводом проблемы... |
|
|
|
#5 |
|
Кэп Улитка
Сообщений: 8,067
Регистрация: 04.05.2005
Возраст: 46
|
Гы, а ты думаешь у каждой ячейки свой канвас?
- это самому Pучками надо навеpно (точно не знаю - с VCL мало знаком). Да и pешение выводить каpтинки в DBГpид споpно, лучше уж какой-нить ListView заюзать.А вообще мона динамически создавать TImaЖe-и с pодителем Form1 и выводить в них каpтинки
|
|
|
|
#6 | |
|
аццкий троглодит
Сообщений: 3,234
Регистрация: 28.02.2004
Возраст: 41
|
Yandex, была такая идея... только вот как с динамическими image и всем прочим работать? как их объявить и пр и пр...
Цитата:
|
|
|
|
|
#7 |
|
Форумец
Сообщений: 831
Регистрация: 04.08.2005
|
Эта класс где картинки фармируются
unit ImageText; interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, QStdCtrls, Graphics, JPEG, StdCtrls, Preview; const Space = 10; // Расстояние между объектами FontSize = 8; // Размер шрифта TextHeight = 16; // Высота надписей type // Описание класса TImageText TImageText = class(TControl) private // Поле для хранения ID ID : Integer; // Объект для хранения фотографии jpg : TJpegImage; // Объект для отображения фотографии Image : TImage; // Объект для отображения ФИО FText : TStaticText; // Объект для отображения статуса SText : TStaticText; protected function R_Top : Integer; function R_Left : Integer; function R_Width : Integer; function R_Height : Integer; //----> procedure W_Top (Value: Integer); procedure W_Left (Value: Integer); procedure W_Width (Value: Integer); procedure W_Height (Value: Integer); //----> procedure W_Photo (Value: TJpegImage); procedure W_Fio (Value: String); procedure W_Status (Value: String); public constructor Create (Value: Integer); destructor Destroy; procedure Show (AOwner: TWinControl); procedure LClick (Sender: TObject); procedure RClick (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); published // Координаты и размеры объекта TImageText property Top : Integer read R_Top write W_Top; property Left : Integer read R_Left write W_Left; property Width : Integer read R_Width write W_Width; property Height : Integer read R_Height write W_Height; // Поля для хранения фотографии, ФИО и статуса посетителя property Photo : TJpegImage write W_Photo; property FIO : String write W_Fio; property Status : String write W_Status; end; implementation uses main_rec; /////////////////////////////////////////////////////////////////// // КЛАСС TImageText // /////////////////////////////////////////////////////////////////// // Конструктор класса TImageText constructor TImageText.Create (Value: Integer); begin Image := TImage.Create(nil); FText := TStaticText.Create(nil); SText := TStaticText.Create(nil); //----> Image.Name := 'IM'; FText.Name := 'ST'; SText.Name := 'ST'; //----> FText.Height := TextHeight; SText.Height := TextHeight; FText.Font.Size := FontSize; SText.Font.Size := FontSize; //----> ID := Value; jpg := TJpegImage.Create; Image.OnDblClick := LClick; Image.OnMouseUp := RClick; end; // Деструктор класса TImageText destructor TImageText.Destroy; begin Image.Free; FText.Free; SText.Free; end; // Функция для чтения верхней координаты компонента function TImageText.R_Top : Integer; begin Result := Image.Top; end; // Функция для чтения левой координаты компонента function TImageText.R_Left : Integer; begin Result := Image.Left; end; // Функция для чтения ширины компонента function TImageText.R_Width : Integer; begin Result := Image.Width; end; // Функция для чтения высоты компонента function TImageText.R_Height : Integer; begin Result := Image.Height + 2*(TextHeight + Space); end; // Процедура для записи верхней координаты компонента procedure TImageText.W_Top (Value: Integer); begin Image.Top := Value; FText.Top := Image.Top + Image.Height; SText.Top := FText.Top + FText.Height; end; // Процедура для записи левой координаты компонента procedure TImageText.W_Left (Value: Integer); begin Image.Left := Value; FText.Left := Value; SText.Left := Value; end; // Процедура для записи ширины компонента procedure TImageText.W_Width (Value: Integer); begin Image.Width := Value; FText.Width := Value; SText.Width := Value; end; // Процедура для записи высоты компонента procedure TImageText.W_Height (Value: Integer); begin Image.Height := Value - 2 * TextHeight; FText.Top := Image.Top + Image.Height; SText.Top := FText.Top + FText.Height; end; // Процедура отображения фотографии procedure TImageText.W_Photo (Value: TJpegImage); var Bmp : TBitMap; begin jpg := Value; Bmp := TBitMap.Create; Bmp.Assign(Value); Image.Canvas.StretchDraw(Image.ClientRect, Bmp); Bmp.Free; end; // Процедура отображения ФИО procedure TImageText.W_Fio (Value: String); begin FText.Caption := Value; end; // Процедура отображения статуса procedure TImageText.W_Status (Value: String); begin if Trim(Value) = 'Black List' then SText.Font.Color := clRed; if Trim(Value) = 'Member' then SText.Font.Color := clBlack; if Trim(Value) = 'Silver' then SText.Font.Color := clNavy; if Trim(Value) = 'Gold' then SText.Font.Color := clYellow; if Trim(Value) = 'Staff' then SText.Font.Color := clBlack; SText.Caption := Value; end; // Процедура отображения компонента TImageText procedure TImageText.Show (AOwner: TWinControl); begin Image.Parent := AOwner; FText.Parent := AOwner; SText.Parent := AOwner; end; // Обработка двойного клика мыши на объекте procedure TImageText.LClick (Sender: TObject); begin with MainForm do begin ReceptionQuery.Close; ReceptionQuery.SQL.Clear; ReceptionQuery.SQL.Add('SELECT * FROM RECEPTION WHERE ID_KEY = ' + IntToStr(ID)); ReceptionQuery.Open; RecPageControl.ActivePageIndex := 0; end; end; // Обработка нажатия правой и левой клавиши мыши procedure TImageText.RClick (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var x1, x2, x3, x4, y1, y2, y3, y4 : integer; begin if Button = mbLeft then begin MainForm.BorderDel; x1 := 0; y1 := 0; x2 := x1 + Image.Width; y2 := y1; x3 := x1; y3 := y1 + Image.Height; x4 := x2; y4 := y3; Image.Canvas.Pen.Color := clRed; Image.Canvas.Pen.Width := 5; Image.Canvas.Polyline([Point(x1, y1), Point(x2, y2), Point(x4, y4), Point(x3, y3), Point(x1, y1)]); end; if Button = mbRight then begin View := TPreview.Create(nil); View.PhotoTrans.Active := False; View.PhotoTrans.Active := True; View.PhotoQuery.Close; View.PhotoQuery.SQL.Clear; View.PhotoQuery.SQL.Add('SELECT PHOTO FROM RECEPTION WHERE ID_KEY = ' + IntToStr(ID)); View.PhotoQuery.Open; View.PhotoQuery.FetchAll; View.PhotoQuery.First; if View.PhotoQueryPHOTO.BlobSize > 1 then Jpg.Assign(View.PhotoQueryPHOTO); View.ShowPreview(jpg); View.ShowModal; end; end; end. |
|
|
|
#8 |
|
Форумец
Сообщений: 831
Регистрация: 04.08.2005
|
Эта так картинки рисуются ручками
// Процедура выбора размеров фотографии procedure TMainForm.RadioGroup1Click(Sender: TObject); begin case RadioGroup1.ItemIndex of 0: begin W := 350; H := 350; CreateGallery; end; 1: begin W := 230; H := 230; CreateGallery; end; 2: begin W := 170; H := 170; CreateGallery; end; 3: begin W := 135; H := 135; CreateGallery; end; 4: begin W := 110; H := 110; CreateGallery; end; end; end; // Процедура отрисовки одной фотографии procedure TMainForm.CreatePhoto (var X, Y: integer; P: TJpegImage; F, S: String; ID: Integer); var IT : TImageText; begin IT := TImageText.Create (ID); //----> IT.Top := X; IT.Left := Y; IT.Width := W; IT.Height := H; //----> IT.Photo := P; IT.FIO := F; IT.Status := S; //----> IT.Show(ScrollBox1); end; // Процедура отрисовки галереи procedure TMainForm.CreateGallery; var T, L, CountNumber : Integer; begin CountNumber := 0; DestroyGallery; L := Space; T := Space; DataModule1.TodayShow.Last; while not DataModule1.TodayShow.Bof do begin inc (CountNumber); if DataModule1.TodayShowPHOTO.BlobSize > 1 then Jpg.Assign(DataModule1.TodayShowPHOTO); CreatePhoto (T, L, Jpg, Trim(DataModule1.TodayShowFAMILY.AsString) + ' ' + Trim(DataModule1.TodayShowNAME.AsString), DataModule1.TodayShowNAME1.AsString, DataModule1.TodayShowID_KEY.AsInteger); if (L + W + Space) < (ScrollBox1.Width - Space - W) then begin L := L + W + Space; end else begin L := Space; T := T + H + Space; end; DataModule1.TodayShow.Prior; if CountNumber >= Number then Break; end; BorderDel; end; // Процедура уничтожения галереи procedure TMainForm.DestroyGallery; var i : Integer; begin for i := (ScrollBox1.ControlCount-1) DownTo 0 do if ScrollBox1.Controls[i].Name = 'IM' then (ScrollBox1.Controls[i] as TImage).Free else (ScrollBox1.Controls[i] as TStaticText).Free; end; |
|
|
|
#9 |
|
Кэп Улитка
Сообщений: 8,067
Регистрация: 04.05.2005
Возраст: 46
|
Монстp!!!
![]() Что же ты ему всю пpогу не написал? ![]() 2 Ivan XXX > с динамическими image и всем прочим работать? как их объявить и пр и пр... А слабо книгу по DelpНi почитать? (хотя и FAQ на котоpый я ccылку дал пойдет - там это есть). Вообще то что то в духе var imgs = array of TImagе; ... SetLengtН (imgs, <#каpтинок>); for i := 0 to <#каpтинок> - 1 do begin imgs[i] := TImage.Create (Form1); imgs.НeigНt := ... imgs.WidtН := ... ... end; |
|
|
|
#15 | |
|
Форумец
Сообщений: 14
Регистрация: 23.06.2005
Возраст: 40
|
В ПС не аргумент. Задача программиста, как раз и состоит в выборе средств и методов решения задачи. И если выбор не верен, то проблема вовсе не в языке, а в голове.
Цитата:
|
|
|
|
|
#19 | |
|
бибизьян
Сообщений: 3,020
Регистрация: 17.02.2004
|
darkart
Цитата:
Чисто софтверные компании подбирают людей под задачу, тоже ни о каком выборе говорить не приходится... Ваше предложение верно только для независимых разработчиков. |
|
|
|
|
#20 | |
|
Форумец
Сообщений: 14
Регистрация: 23.06.2005
Возраст: 40
|
aerin, к примеру,
согласитесь что для написания баз данных глупо выбирать asm. К тому же и фирмам наверное будет не выгодно использовать средства, которые тормозят разработку ПО, время - деньги знаете ли. Цитата:
|
|
|
|
|
#21 | |
|
бибизьян
Сообщений: 3,020
Регистрация: 17.02.2004
|
darkart
Совещание в конторе "Рога и копыты", занимающейся разработкой ПО на базе какой-то БД под ключ. Поступил новый заказ. Начальник: "на чем будем писать?" Начальник одного из отделов: "Мошт на asm-е?" Второй: "Не, давай на жабе, этож самая прогрессивная технология, епте" Вы это так себе представляете? Реально я вижу по поделкам некоторых российских фирм, не будем показывать пальцем, что средства разработки меняются не по соображениям целесообразности, а по причине увольнения старой команды девелоперов и набора новых сотрудников, принесших с собой новые веяния. Например, в истории с фискальными регистраторами переход от Меркуриев к Штрихам - это откровенная деградация. Цитата:
Как бы там ни было, сейчас в области написания софта, глобально, C/C++ - это индустриальный стандарт. И никто ничего не выбирает. Есть специфические задачи, которые решаются другими языками, вплоть для скриптовых тип Lua, но это не отменяет первое необходимое условие. |
|
|
|
|
#22 | |
|
Форумец
Сообщений: 14
Регистрация: 23.06.2005
Возраст: 40
|
Ну, во-первых я согласился с
Цитата:
|
|
|
|
|
#23 |
|
бибизьян
Сообщений: 3,020
Регистрация: 17.02.2004
|
darkart
А зачем вообще заказчику знать про какие-то языковые среды? Ему нужна работающая софтина, желательно безглючно, желательно со стандартным интерфесом, чтоб юзверей не пугать. А на чем это дело написано - вопрос десятый. Хотя есть другая сторона медали, если в смете будет указана стоимость ораклового сервака с кучей клиентских лицензий и оплаченной поддержкой на десять лет вперед, то, возможно, это и подвигнет заказчика на более пристальное рассмотрение используемых технологий ЗЫ. Но я говорил о другом, если у кого-то возникнет мысль зарабатывать на хлеб с маслом написанием софта, то начать следует с C/C++, бо без этого никуда... |
|
|
|
#24 |
|
Лентяй
Сообщений: 5,391
Регистрация: 23.03.2005
Возраст: 53
|
Ну что, начинается очередная священная война?
Осеннее обострение, шумящее в автофоруме, и до этого болота добралось? ![]() Если серьёзно - для неспецифичных задач (как-то интернет-проекты, запросы к субд и т.п.) C/C++ действительно достаточен, гибок и удобен. Дельфи, как и VB - непонятная попытка достичь тех же возможностей в другом синтаксисе. До сих пор ни один не достиг, преимуществ над C/C++ нет - так что я до сих пор не понимаю, на кой весь этот сыр-бор. |
|
|
|
#25 | |
|
Форумец
Сообщений: 1,986
Регистрация: 27.08.2003
|
Цитата:
|
|
|
|
|
#28 | |
|
Форумец
Сообщений: 831
Регистрация: 04.08.2005
|
Цитата:
|
|
|
|
|
#29 |
|
Dogs Fucker
Сообщений: 423
Регистрация: 02.11.2005
Возраст: 33
|
aerin, ну серьезные проекты никто на Delphi писать не будет ... хотя можно свободно создать окошечки на делфи, а какие-то вычислительные операции вкоючить в DLL, и использовать их уже из GUI на Delphi ...
|
|
|
|
#30 | |||
|
бибизьян
Сообщений: 3,020
Регистрация: 17.02.2004
|
<Весеннее обострение
>Ray79 Цитата:
- Конечно можно, только зачем? Цитата:
phasma Цитата:
</Весеннее обострение >
|
|||
|