Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Помогите мне, глупой, найти ошибку в SQL-коде - в таблицу добавляется пустота  (Прочитано 49234 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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);   // ругается на эту строку EAccessViolation
image_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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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);
try
TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB);
image_mapp.Picture.Graphic.LoadFromStream(BB);
finally
BB.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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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++ » Записан
Demidova Aigul
Гость
« Ответ #58 : 06-05-2005 05:52 » 

Ой, DJ-AMIGO, все просто супер работает!!!!!!   Отлично  Спасибо огромнейшее!  Улыбаюсь  Я так рада!   Улыбаюсь Теперь буду внимательно код изучать, каждую строчку, чтобы в будущем это применять правильно.  Спасибо!

И большое спасибо Сержу и RomCom(у), которые тоже мне очень много помогали вначале.  Улыбаюсь
Записан
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines