Demidova Aigul
Гость
|
|
« : 05-04-2005 10:20 » |
|
:?Крутые Делфисты!!! Я новичок в Delphi! Помогите мне, глупой, найти ошибку в SQL-коде! Почему-то у меня вместо картинки в таблице в базе пустота добавляется. И в строке ParamByName('0').Assign(Form1.image_mapp.Picture) тоже пустота, когда в отладчике курсор поставить на Form1.image_mapp.Picture. В чем ошибка? Подскажите, пожалуйста!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Код был такой (с помощью этого кода хотела выбрать картинку из OpenPictureDialog1.FileName, а потом добавить эту картинку в таблицу "map_path" в поле "path"):
with modif_path do if OpenPictureDialog1.Execute then begin Form1.image_mapp.Picture.LoadFromFile(OpenPictureDialog1.FileName);
Close; SQL.Clear; SQL.Add('insert into map_path (path,InventoryID) values (:0, :1)'); ParamByName('0').Assign(Form1.image_mapp.Picture); ParamByName('1').AsInteger := dm.Query1InventoryID.AsInteger; Prepare; ExecSQL; Query1.Close; Query1.Open; end;
Пожалуйста, помогите мне!!!!!!!!!!!!!!!!
|
|
« Последнее редактирование: 15-12-2007 17:14 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #1 : 05-04-2005 14:58 » |
|
Demidova Aigul, попробуй так: ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName,ftGraphic);
|
|
« Последнее редактирование: 15-12-2007 17:15 от Алексей1153++ »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #2 : 06-04-2005 08:23 » |
|
:lol:Ура!!! Получилось!!! Все работает!!! Спасибо большущее, Серж!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Удачи тебе!!!
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #3 : 06-04-2005 08:49 » |
|
Ой, забыла спросить: а как теперь на форме в TImage отобразить картинку?
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #4 : 08-04-2005 06:39 » |
|
Да так же, как и было: Form1.image_mapp.Picture.LoadFromFile(OpenPictureDialog1.FileName);
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #5 : 11-04-2005 03:56 » |
|
А мне нужно рисунок не из файла загружать, а из базы данных, из таблицы. Как в этом случае нужно написать?
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #6 : 11-04-2005 06:57 » |
|
Может быть, так: Form1.image_mapp.Picture.Assign(ParamByName('0').Value);
|
|
« Последнее редактирование: 15-12-2007 17:16 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #7 : 11-04-2005 08:07 » |
|
Все же скорее Form1.image_mapp.Picture.Bitmap.Assign(ParamByName('0').Value);
|
|
« Последнее редактирование: 15-12-2007 17:16 от Алексей1153++ »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #8 : 11-04-2005 11:04 » |
|
Не получается! Ошибка выходит:"Project Project_katalog.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'." Код такой: with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open; if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Нет рисунков!'); exit end else begin //image_mapp.Picture.Assign(dm.Query_path.FieldByName('path')); image_mapp.Picture.Bitmap.Assign(dm.Query_path.FieldByName('path')); end; end; end; Почему на Bitmap ругается (в строке image_mapp.Picture.Bitmap.Assign(dm.Query_path.FieldByName('path')) , ведь у меня картинки JPEG? Правда, вместо ParamByName('0').Value написала FieldByName('path') - но ведь не в этом ошибка? Серж, не знаю, что делать? Помоги, пожалуйста!
|
|
« Последнее редактирование: 15-12-2007 17:17 от Алексей1153++ »
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #9 : 11-04-2005 11:36 » |
|
image_mapp.Picture.Bitmap.Assign(dm.Query_path.FieldByName('path').Value); // без Value ты пытаешся вставить само поле
|
|
« Последнее редактирование: 15-12-2007 17:18 от Алексей1153++ »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
RomCom
|
|
« Ответ #10 : 11-04-2005 11:40 » |
|
без Value ты пытаешся вставить само поле т.е. класс TField а не значение хронящееся в этом поле.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #11 : 12-04-2005 04:23 » |
|
Не помогло это. Когда добавляю value - у меня ошибка "Incompatible types: 'TPersistent' and 'Variant'". Может, еще чего-то не хватает?
|
|
« Последнее редактирование: 15-12-2007 17:19 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #12 : 12-04-2005 07:27 » |
|
Aigul, попробуй еще так, наконец-то должно получиться: var MemoryStream:TMemoryStream;
dm.Query_path.FieldByName('path').SaveToStream(MemoryStream); image_mapp.Picture.Bitmap.LoadFromStream(MemoryStream);
|
|
« Последнее редактирование: 15-12-2007 17:19 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #13 : 12-04-2005 07:38 » |
|
Забыл: конечно нужно еще вначале создать экземпляр класса, а в конце его уничтожить: MemoryStream:=TMemoryStream.Create; ................. MemoryStream.Free;
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #14 : 12-04-2005 09:42 » |
|
Дико извиняюсь, но с потоками почему-то тоже не получается. Когда запускаю программу, она ни на что не ругается, но и в TImage картинку не показывает (там пустота - я проверяла с помощью отладчика). Вот код: procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var MemoryStream:TMemoryStream; begin with dm.Query_path do begin Close; SQL.Clear; //SQL.Add('SELECT path FROM map_path where InventoryID ='+dm.Query1InventoryID.AsString+''); SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open; if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Нет картинок!'); exit end else begin MemoryStream:=TMemoryStream.Create; try //TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(MemoryStream); TGraphicField(dm.Query_path.FieldByName('path')).SaveToStream(MemoryStream); image_mapp.Picture.Bitmap.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; end; end; end; Что делать?А еще вот так попробовала - тоже не получается - появляется ошибка EAccessViolation в строке MyPic.LoadFromStream(MemoryStream). procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var MemoryStream:TMemoryStream; MyPic: TGraphic; begin //with dm.modif3 do begin with dm.Query_path do begin Close; SQL.Clear; //SQL.Add('SELECT path FROM map_path where InventoryID ='+dm.Query1InventoryID.AsString+''); SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open; if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Привязанных рисунков нет!'); exit end else begin MemoryStream:=TMemoryStream.Create; if dm.Query_path.FieldByName('path').Text = 'bmp' then MyPic := TBitmap.Create ; if dm.Query_path.FieldByName('path').Text = 'jpg' then MyPic := TJPEGImage.Create ; try TGraphicField(dm.Query_path.FieldByName('path')).SaveToStream(MemoryStream); MemoryStream.Seek(0, 0); MyPic.LoadFromStream(MemoryStream); // ругается на эту строку EAccessViolationimage_mapp.Picture.Assign(MyPic); finally MyPic.Free; MemoryStream.Free; end; end; end; end; Совсем запуталась. Помоги, пожалуйста!
|
|
« Последнее редактирование: 15-12-2007 17:20 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #15 : 12-04-2005 10:45 » |
|
У TDataSet есть еще метод CreateBlobStream. var B:TBlobStream;
with dm.Query_path do begin ...... B:=CreateBlobStream(FieldByName('path'),bmRead); И далее работать с этим потоком.
|
|
« Последнее редактирование: 15-12-2007 17:21 от Алексей1153++ »
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #16 : 12-04-2005 11:38 » |
|
С самого начала был упущен один момент: Какой тип поля? Возможно проще положить на форму элемент TDBImage, назначить ему это поля и потом считывать картинку из него? (способ не оптимальный, но иногда проще решать проблему в лоб . В любом случае, хотя бы для проверки правильности данных, это не плохо бы сделать.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #17 : 13-04-2005 05:31 » |
|
to Серж: Спасибо за подсказку, но все равно не работает! Выходит ошибка "EDBEngineError with message " BLOB not opened". Почему так? Код был такой: procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var BB:TBlobStream;begin with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open; if IsEmpty then begin image_mapp.Visible:=false; ShowMessage (Нет картинок!'); exit end else begin BB:=TBlobStream.Create(TBlobField(dm.Query_path.FieldByName('path')),bmRead);tryTBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB);image_mapp.Picture.Graphic.LoadFromStream(BB); finallyBB.Free;end; end; end; end; А при добавлении картинок вместо ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName, ftGraphic) поставила ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName, ftBlob). to RomCom: Спасибо за подсказку! Я уже тоже задумалась насчет TDBImage. Но когда я в свойствах выбрала свое поле "path", сразу появилось уже надоевшее и подозрительное ругательство "Bitmap image is not valid". Как это исправить? to Серж и RomCom: Вообще у меня база на SQL Server(e), а тип поля в таблице "path" указан как image, а сами картинки JPEG. Я вот думаю, что все не получается из-за "Bitmap image is not valid". Мне кажется, если исправить эту ошибку, то заработает любой из выше перечисленных вами способов (и с потоками, и без потоков - как было предложено в начале, и с TDBImage). А может нужно что-то добавить или исправить в коде на добавление картинки - может там источник этой ошибки. Вот код на добавление картинки: with modif_path do if OpenPictureDialog1.Execute then begin Form1.image_mapp.Picture.LoadFromFile(OpenPictureDialog1.FileName); Close; SQL.Clear; SQL.Add('insert into map_path (path,InventoryID) values (:0, :1)'); //ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName,ftGraphic); ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName,ftBlob); ParamByName('1').AsString := dm.Query1InventoryID.AsString; Prepare; ExecSQL; Query1.Close; Query1.Open; end; В результате этого кода картинка добавляется нормально, но может JPEG-картинки добавляются не как JPEG, а как-то по-другому - как bitmap? В общем, я совсем запуталась. Может как-то можно исправить эту ошибку "Bitmap image is not valid"? Серж и RomCom ! Помогите, пожалуйста!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
« Последнее редактирование: 15-12-2007 17:21 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #18 : 13-04-2005 07:06 » |
|
Aigul, вот у меня код, который я использовал для визуализации JPEG и который заведомо работал, может быть он тебе поможет!
uses JPEG;
var JP2:TJpegImage; BMP3:TBitmap; R:TRect; begin BMP3:=TBitMap.Create; BMP3.HandleType:=bmDIB; BMP3.PixelFormat:=pf24bit; BMP3.Palette:=0; R.Left:=0; R.Top:=0; JP2:=TJpegImage.Create; JP2.LoadFromStream(...); JP2.DIBNeeded; BMP3.Width:=JP2.Width; BMP3.Height:=JP2.Height; R.Right:=BMP3.Width; R.Bottom:=BMP3.Height; BMP3.Canvas.StretchDraw(R,JP2); Image1.Picture.Bitmap.Assign(BMP3); JP2.Destroy; BMP3.Destroy; end;
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #19 : 13-04-2005 07:10 » |
|
Здесь предполагается, что в потоке находится JPEG-картинка, но по-моему, когда мы грузим картинку с помощью метода LoadFromFile, картинка хранится в памяти уже в виде Bitmap, но может быть, я и ошибаюсь.
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #20 : 13-04-2005 07:41 » |
|
BB:=TBlobStream.Create(TBlobField(dm.Query_path.FieldByName ('path')),bmRead);
TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB);
BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(MemoryStream); Image1.Picture.Assign(jp);
|
|
« Последнее редактирование: 15-12-2007 17:23 от Алексей1153++ »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #21 : 13-04-2005 08:43 » |
|
Ой, Серж, а у меня ошибка "EDatabaseError 'BLOB not opened'" ! Причем, я заметила, когда после выхода ошибки "EDatabaseError 'BLOB not opened' нажимаешь "ОК" - стрелочкой выделяется строка BB.Seek(0,soFromBeginning). Наверно, там ошибка. Может, я эту строку не туда поставила. Честно говоря, я вообще не знаю что означает BB.Seek(0,soFromBeginning) ?
У меня вообще порядок строк может быть неправильным, потому что я не все понимаю.
У меня такой получился код:
procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
var JP2:TJpegImage; BMP3:TBitmap; R:TRect; //MemoryStream:TMemoryStream; BB:TBlobStream;
begin
with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage (Нет картинок!'); exit end else begin
BB:=TBlobStream.Create(TBlobField(dm.Query_path.FieldByName('path')),bmRead); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB);
BB.Seek(0,soFromBeginning);
BMP3:=TBitmap.Create; BMP3.HandleType:=bmDIB; BMP3.PixelFormat:=pf24bit; BMP3.Palette:=0; R.Left:=0; R.Top:=0; JP2:=TJPEGImage.Create; JP2.LoadFromStream(BB); JP2.DIBNeeded; BMP3.Width:=JP2.Width; BMP3.Height:=JP2.Height; R.Right:=BMP3.Width; R.Bottom:=BMP3.Height; BMP3.Canvas.StretchDraw(R,JP2); image_mapp.Picture.Bitmap.Assign(BMP3); JP2.Destroy; BMP3.Destroy;
end; end; end;
То, что жирным шрифтом - это то, что я не знаю - правильно или нет и в нужном месте или нет? :oops:
|
|
« Последнее редактирование: 15-12-2007 17:24 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #22 : 13-04-2005 09:20 » |
|
По-моему правильно вот так:
var JP:TJpegImage; BB:TMemoryStream; begin
BB:=TMemoryStream.Create; with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
BB.Seek(0,soFromBeginning); TBlobField(SQLQuery.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); image_mapp.Picture.Assign(jp); jp.Free;
end; BB.Free; end;
|
|
« Последнее редактирование: 15-12-2007 17:25 от Алексей1153++ »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #23 : 13-04-2005 09:38 » |
|
А, что, BB.Seek(0,soFromBeginning); нужно 2 раза писать - перед TBlobField(SQLQuery.FieldByName('path')).SaveToStream(BB); и после ? Или это опечатка?
|
|
« Последнее редактирование: 15-12-2007 17:25 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #24 : 13-04-2005 09:50 » |
|
Это позиционирование в начало. В первый раз, наверно, не обязательно, но не повредит.
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #25 : 13-04-2005 10:58 » |
|
Ой, не верю глазам своим! Получилось наконец-то показать картинку в TImage!!! Ура!! Серж, спасибище тебе, не представляешь какое большууууууууууууууууууууууууууууууууууууууууууууууущее спасибище!!!!!!!!! А еще один вопрос: у меня появившаяся на TImage картинка такая малююююююююююсенькая в левом нижнем углу. Как сделать, чтобы без искажения картинка полностью вписалась в TImage ?
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #26 : 13-04-2005 11:35 » |
|
А какой итоговый текст программы?
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #27 : 13-04-2005 11:42 » |
|
Вот такой итоговый текст:
procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
var JP:TJpegImage; BB:TMemoryStream;
begin image_mapp.Visible:=True;
BB:=TMemoryStream.Create; with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Картинок нет!'); exit end else begin
BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); image_mapp.Picture.Assign(jp); jp.Free;
end; BB.Free; end;
end;
|
|
« Последнее редактирование: 15-12-2007 17:26 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #28 : 13-04-2005 11:57 » |
|
Добавим растяжку:
procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
var JP:TJpegImage; BB:TMemoryStream; BMP3:TBitmap; R:TRect;
begin image_mapp.Visible:=True;
BB:=TMemoryStream.Create; BMP3:=TBitmap.Create; BMP3.HandleType:=bmDIB; BMP3.PixelFormat:=pf24bit; BMP3.Palette:=0; R.Left:=0; R.Top:=0;
with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Картинок нет!'); exit end else begin
BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); JP.DIBNeeded; BMP3.Width:=JP.Width; BMP3.Height:=JP.Height; R.Right:=BMP3.Width; R.Bottom:=BMP3.Height; BMP3.Canvas.StretchDraw(R,JP); image_mapp.Picture.Bitmap.Assign(BMP3); jp.Free; end; BB.Free; BMP3.Free;
end;
end;
|
|
« Последнее редактирование: 15-12-2007 17:27 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #29 : 13-04-2005 12:10 » |
|
Тороплюсь. Если размер Image больше, чем ширина или длина рисунка, то надо записать R.Width:=Image_mapp.Width и аналогично для высоты.
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #30 : 13-04-2005 13:51 » |
|
Спасибо! Я утром на работе попробую так написать. А то дома у меня делфи криво был поставлен и я его грохнула.
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #31 : 13-04-2005 14:41 » |
|
Вот функция подгонки размеров рисунка под TImage:
function StretchImage1(jp:TJPEGImage;image_mp:TImage):TRect; var dw,dh: Single; w,h: integer; begin result.Top:=0; result.Left:=0; w:=image_mp.Width; h:=image_mp.Height; dw:=w/jp.Width; dh:=h/jp.Height; if jp.Height*dw>h then begin result.Bottom:=h; result.Right:=Floor(dh*jp.Width); end else begin result.Bottom:=Floor(dw*jp.Height); result.Right:=w; end; end;
.... Пример: var jp:TJPEGImage; r:TRect; jp:=TJPEGImage.Create; jp.LoadFromFile(...); r:=StretchImage1(jp,Image2); Image2.Canvas.StretchDraw(r,jp); jp.Free;
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
Серж
Гость
|
|
« Ответ #32 : 13-04-2005 15:16 » |
|
RomCom, спасибо за информацию. Никогда не приходило в голову использовать TImage.Canvas, всегда делал дополнительный битмап, хотя это никогда не нравилось.
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #33 : 14-04-2005 05:16 » |
|
Пыталась написать эту функцию для своего случая, но почему-то ошибка "Необъявленный идентификатор Floor". Где и как я должна его объявить? Размер TImage у меня конкретно 200x200, поэтому я не стала задавать "w" и "h".
function TForm1.StretchImage1(jp: TJPEGImage): TRect; var dw,dh:Single; begin Result.Top:=0; Result.Left:=0; dw:=200/jp.Width; dh:=200/jp.Height; if jp.Height*dw>200 then begin Result.Bottom:=200; Result.Right:=Floor(dh*jp.Width); end else begin Result.Bottom:=Floor(dw*jp.Height); Result.Right:=200; end; end;
Не знаю - правильно написала функцию иди нет, но почему-то ошибка "Необъявленный идентификатор Floor". Где и как я должна его объявить?
Помогите, пожалуйста!
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #34 : 14-04-2005 05:35 » |
|
Floor это математическая функция округления числа с плавоющей точкой до целого. Объяви в сроке uses библиотеку Math и все будет ОК.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #35 : 14-04-2005 10:35 » |
|
Ура!!! Спасибо всем! Получилось! Вот только небольшая проблема: почему-то картинка в TImage появляется какая-то бракованная - внизу что-то черное, картинка в нижней части как будто не дорисованная. Хотелось бы для наглядности здесь показать как выглядит бракованная картинка, но не знаю как (и возможно ли это). Может как-то можно сделать, чтобы картинка в TImage появилась нормальная, без брака? Помогите, пожалуйста! Не знаю, что с этим делать! Может картинка читается неправильно или еще что? :? На всякий случай мой итоговый код: procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var JP:TJpegImage; BB:TMemoryStream; R:TRect;
begin image_mapp.Visible:=True;
BB:=TMemoryStream.Create;
with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage (Картинок нет!'); exit end else begin BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); JP.DIBNeeded; R:=StretchImage1(JP); //image_mapp.Canvas.StretchDraw(R,JP); image_mapp.Picture.Bitmap.Assign(JP); jp.Free; end; end; end;
|
|
« Последнее редактирование: 13-12-2007 20:40 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #36 : 14-04-2005 12:38 » |
|
А StretchDraw-то зачем закомментировано?
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #37 : 15-04-2005 03:44 » |
|
Я это закомментировала, потому что именно на эту строку выходит сообщение EInvalidOperation"Can only modify an image if it contains a bitmap". Это получается в тот момент, когда я нажимаю на одну из строк в DBGridEh: procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var JP:TJpegImage; BB:TMemoryStream; R:TRect;
begin image_mapp.Visible:=True;
BB:=TMemoryStream.Create;
with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Нет картинок!'); exit end else begin BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); JP.DIBNeeded; R:=StretchImage1(JP); image_mapp.Canvas.StretchDraw(R,JP);// здесь ругается image_mapp.Picture.Bitmap.Assign(JP); jp.Free; end; end; end;
Может в строке image_mapp.Picture.Bitmap.Assign(JP) не нужно писать Bitmap? Хотя, мне кажется, что дело не только в этом. Что делать, чтобы программа не ругалась на image_mapp.Canvas.StretchDraw(R,JP) и чтобы картинки не были бракованными с чем-то черным внизу? :?
|
|
« Последнее редактирование: 13-12-2007 20:41 от Алексей1153++ »
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #38 : 15-04-2005 07:59 » |
|
У меня следующий код JP:=TJPEGImage.Create; JP.LoadFromFile('1.jpg'); R:=StretchImage(JP,Image1); image1.Canvas.StretchDraw(R,JP); JP.Free; прекрасно работает. StretchImage - функция, которую предложил RomCom.
|
|
« Последнее редактирование: 13-12-2007 20:42 от Алексей1153++ »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #39 : 15-04-2005 15:10 » |
|
ОК, на работе в понедельник утром попробую исправить.
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #40 : 18-04-2005 06:20 » |
|
Ура! С рисунками вроде разобралась! Теперь внизу не появляется что-то черное. Это, оказывается, сами рисунки были бракованными. А вот что делать с сообщением EInvalidOperation"Can only modify an image if it contains a bitmap". Я уже писала, что это получается в тот момент, когда я нажимаю на одну из строк в DBGridEh.
function TForm1.StretchImage1(jp: TJPEGImage): TRect; var dw,dh:Single; begin Result.Top:=0; Result.Left:=0; dw:=300/jp.Width; dh:=300/jp.Height; if jp.Height*dw>300 then begin Result.Bottom:=300; Result.Right:=Floor(dh*jp.Width); end else begin Result.Bottom:=Floor(dw*jp.Height); Result.Right:=300; end; end;
procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var JP:TJpegImage; BB:TMemoryStream; R:TRect;
begin image_mapp.Visible:=True;
BB:=TMemoryStream.Create;
with dm.Query_path do begin Close; SQL.Clear; SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+''''); Open;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Нет картинок!'); exit end else begin BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); JP.DIBNeeded; R:=StretchImage1(JP); image_mapp.Canvas.StretchDraw(R,JP); // здесь ругается image_mapp.Picture.Bitmap.Assign(JP); jp.Free; end; end; end;
Что делать, чтобы программа не ругалась на image_mapp.Canvas.StretchDraw(R,JP)? Все было бы просто супер, если бы это исправить! Помогите, пожалуйста, подскажите!!!!! :?
|
|
« Последнее редактирование: 13-12-2007 20:43 от Алексей1153++ »
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #41 : 28-04-2005 06:55 » |
|
Попробуй заюзать свойство Stretch после загрузки картинки в TImage, по идее должно прокатить!
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #42 : 28-04-2005 07:20 » |
|
короче сделай так! 1. Смой в унитаз строчку! image_mapp.Canvas.StretchDraw(R,JP); // здесь ругается 2. После строки image_mapp.Picture.Bitmap.Assign(JP); напиши следующий код: Image1.Stretch:=false; Image1.Width:=Abs(Rect.Right-Rect.Left); Image1.Height:=Abs(Rect.Top-Rect.Bottom); Image1.Stretch:=true; И все! Поздравляю! Теперь можно идти пить пиво!
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #43 : 28-04-2005 07:25 » |
|
А в твоем случае это будет выглядеть вот так: То есть вместо двух левых строк
image_mapp.Canvas.StretchDraw(R,JP); // здесь ругается image_mapp.Picture.Bitmap.Assign(JP);
ты должна закодить
with image_mapp do begin Stretch:=false; Picture.Bitmap.Assign(JP); Width:=Abs(R.Right-R.Left); Height:=Abs(R.Top-R.Bottom); Stretch:=true; end;
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #44 : 29-04-2005 07:43 » |
|
Ура! Получилось! Спасибо, DJ-AMIGO! А как мне сделать, чтобы эти картинки по центру TImage стояли? А то сейчас те картинки, у которых ширина больше, находятся в верхней части TImage, а те, у которых высота больше, те в левой части. :?
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #45 : 03-05-2005 08:40 » |
|
подожди-ка! Ты что-то путаешь! У тебя картинка сейчас занимает всю площадь компонента TImage, потому что ты используешь свойство Stretch!!! Другой вопрос как расположен сам TImage в контейнере-родителя!? Так вот если ты хочешь сд елать так чтобы картинка выводилась посередине контейнера-родителя, то тебе нужно всего лишь навсего сам компонент TImage разместить посередине этого контейрнера... Мну ДА! В общем так! А это делается следующий образом! 1. Берешь узнаешь геометрические размеры контейнера-родителя (дам ему некое имя, например, CompPar), свойства Width и Height; 2. Узнаешь геометрические размеры TImage (и ему дам некое имя, например, ImgView), только сразу после вывода картинки! Те же свойства Width и Height... 3. Ну и динамически размещаешь TImage в центре контейнера! Короче так: ImgView.Left:=Abs((ImgView.Width mod 2)-(CompPar.Width mod 2)); ImgView.Top:=Abs((ImgView.Height mod 2)-(CompPar.Height mod 2)); И все!!! Не ну конечно могут быть и ньюансы, но это при случае можно решить...
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #46 : 03-05-2005 09:14 » |
|
DJ-AMIGO, а как ты думаешь, почему не работает StretchDraw, а работает твой код? У меня работает и то, и другое.
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #47 : 03-05-2005 10:50 » |
|
Скорее всего это из-за того, что ты используешь в качестве аргумента метода StretchDraw канвы объект класса TJPEGImage, ибо канва может хавать только картинки типа битмапов или бругих потомков класса TGraphi, а в TJPEGImage содержатся запакованные данные, которые надо сначала отконвертить: var bmp : TBitmap; jp : TJPEGImage; begin bmp:=TBitmap.Create; try jp:=TJPEGImage; try bmp.Assign(jp); ;дальше юзаем bmp finally jp.free; end finally bmp.Free; end; end; Хотя с другой стороны TJPEGImage сам является потомком TGraphic, поэтому все должно работать окейно! Кажется я догадываюсь из-за чего это может быть! Просто девушка что-то напутала и не совсем разобралась в сути, потому не стоит напрягаться по поводу несуществующих глюков!
|
|
« Последнее редактирование: 03-05-2005 11:03 от DJ-AMIGO »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #48 : 03-05-2005 11:13 » |
|
Насчет того, что "девушка что-то напутала и не совсем разобралась в сути" - вполне возможно. Я ведь в делфи новичок, и с изображениями впервые работаю, раньше никогда не использовала TImage или что-то подобное. Так что, крутые делфисты, не осуждайте сильно. Еще раз хотела спросить про центрирование. Контейнером-родителем у меня является панель image_panel, TImage у меня называется image_mapp. То есть мне нужно написать image_mapp.Left:=Abs((image_mapp.Width mod 2)-(image_panel.Width mod 2)); image_mapp.Top:=Abs((image_mapp.Height mod 2)-(image_panel.Height mod 2)); Только не знаю, куда это написать. :?
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #49 : 03-05-2005 11:47 » |
|
Мдя! Возможно я слегка перебощил! И попытаюсь исправиться попросив прощения! А по поводу твоего последнего вопроса, так на него я ответил еще в предыдущем сабже! Тяк вот! Пиши эти строчки сразу после того, как выводится картинка...
|
|
« Последнее редактирование: 13-12-2007 20:45 от Алексей1153++ »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #50 : 03-05-2005 11:56 » |
|
Да я не обиделась. Так что не за что извиняться. А насчет того, что "Пиши эти строчки сразу после того, как выводится картинка..." - это значит после добавления картинки?
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #51 : 03-05-2005 12:12 » |
|
Фуф! Как тонна с плеч! пиши это сразу после строк: with image_mapp do begin Stretch:=false; Picture.Bitmap.Assign(JP); Width:=Abs(R.Right-R.Left); Height:=Abs(R.Top-R.Bottom); Stretch:=true; end;
|
|
« Последнее редактирование: 03-05-2005 12:14 от DJ-AMIGO »
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #52 : 05-05-2005 10:45 » |
|
DJ-AMIGO, стыдно сказать, но у меня что-то все равно не получилось с центрированием. Думаю, что это я сама тут что-то еще неправильно делаю.
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #53 : 05-05-2005 11:10 » |
|
Погоди-ка! Приведи свой код полностью, как он сейчас есть! :-P
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #54 : 05-05-2005 11:34 » |
|
procedure TForm1.DBGridEh1CellClick(Column: TColumnEh); var JP:TJpegImage; BB:TMemoryStream; R:TRect;
begin
image_mapp.Visible:=True;
if IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Нет картинок!'); exit end else begin BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; jp.LoadFromStream(BB); JP.DIBNeeded; R:=StretchImage1(JP); //image_mapp.Canvas.StretchDraw(R,JP); //image_mapp.Picture.Bitmap.Assign(JP); with image_mapp do begin Stretch:=false; Picture.Bitmap.Assign(JP); Width:=Abs(R.Right-R.Left); Height:=Abs(R.Top-R.Bottom); Stretch:=true;
image_mapp.Left:=abs((image_mapp.Width mod 2)-(image_panel.Width mod 2)); image_mapp.Top:=abs((image_mapp.Height mod 2)-(image_panel.Height mod 2)); end; jp.Free; end; end; end;
А это на добавление картинки:
procedure Tdm.N1Click(Sender: TObject); var bs:TBlobStream; begin with modif_path do
if OpenPictureDialog1.Execute then begin Form1.image_mapp.Picture.LoadFromFile(OpenPictureDialog1.FileName); Close; SQL.Clear; SQL.Add('insert into map_path (path,InventoryID) values (:0, :1)'); ParamByName('0').LoadFromFile(OpenPictureDialog1.FileName,ftBlob); ParamByName('1').AsString := dm.Query1InventoryID.AsString; Prepare; ExecSQL; Query1.Close; Query1.Open; end;
end;
Я дико извиняюсь, у меня еще есть ошибка EDBEngineError, но не в этой базе. Может, подскажешь, если есть возможность. Это у меня в отдельной теме где-то рядом с темой "Помогите мне, глупой, найти ошибку в SQL-коде - в таблицу добавляется пустота".
|
|
« Последнее редактирование: 13-12-2007 20:47 от Алексей1153++ »
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #55 : 05-05-2005 12:09 » |
|
Кстати, а тебе как нужно отображать картинку? -чтобы картинка, сохраняла свои истинные размеры, какие они были в файле; -чтобы картинка, сохраняя пропоции, масштабировалась автоматически по размеру контейнера; -или чтобы картинка, сохраняя пропоции, масштабировалась автоматически по размеру TImage'а?
|
|
« Последнее редактирование: 13-12-2007 20:48 от Алексей1153++ »
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #56 : 05-05-2005 12:10 » |
|
А вот по поводу другого сабжа, с этим я постараюсь помочь по возможности!
|
|
|
Записан
|
|
|
|
DJ-AMIGO
Гость
|
|
« Ответ #57 : 05-05-2005 12:26 » |
|
А вот и решение твоей проблемы! function TForm1.StretchImage1(jp: TJPEGImage; const MaxSize : integer): TRect; var dw,dh:Single; begin Result.Top:=0; Result.Left:=0; dw:=MaxSize/jp.Width; dh:=MaxSize/jp.Height; if jp.Height*dw>MaxSize then begin Result.Bottom:=MaxSize; Result.Right:=Floor(dh*jp.Width); end else begin Result.Bottom:=Floor(dw*jp.Height); Result.Right:=MaxSize; end; end; procedure TForm1.Button1Click(Sender: TObject); var JP:TJpegImage; BB:TMemoryStream; R:TRect; begin image_mapp.Visible:=True; if dm.Query_path.IsEmpty then begin image_mapp.Visible:=false; ShowMessage ('Нет картинок!'); exit end else begin BB.Seek(0,soFromBeginning); TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB); BB.Seek(0,soFromBeginning); jp:=TJPEGImage.Create; try jp.LoadFromStream(BB); JP.DIBNeeded; R:=StretchImage1(JP, min(image_panel.width-4, image_panel.height-4)); with image_mapp do begin Stretch:=false; Picture.Bitmap.Assign(JP); Width:=Abs(R.Right-R.Left); Height:=Abs(R.Top-R.Bottom); Stretch:=true; end; image_mapp.Left:=abs((image_mapp.Width div 2)-(image_panel.Width div 2)); image_mapp.Top:=abs((image_mapp.Height div 2)-(image_panel.Height div 2)); finally jp.Free; end; end; end; Обрати свое внимание на то, что я немного изменил вызов функции StretchImage1, поэтому ее замени тоже на мой вариант!!!
|
|
« Последнее редактирование: 13-12-2007 20:49 от Алексей1153++ »
|
Записан
|
|
|
|
|
|