Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

При сравнении содержимого двух TImage получаю AV   Найти похожие ветки 

 
pavel_guzhanov ©   (2010-03-19 19:28) [0]

Недавно задавал здесь вопрос про сравнение содержимого двух TImage. Сравнение проходит правильно. Но... На форме несколько Timage, они хранятся в массиве.

Pan:array [1..12, 1..18] of TImage;

Процедура обработки щелчка мыши:
begin
 Name:=TControl(Sender as TImage).Name;
 xa:=StrToInt(copy(name, 2, 2));
 ya:=StrToInt(copy(name, 4, 2));
 xaR:=xA;
 yaR:=ya+1;
 Image1:=Pan[xa, ya];
 Image2:=Pan[xaR, yaR];
 try
BitMap:=Image1.Picture.Bitmap;
 BitMapR:=Image2.Picture.Bitmap;

 for i:=0 to Bitmap.Height - 1 do
 begin
   P := Bitmap.ScanLine[i];
   PR:=BitMapR.ScanLine[i];
   if not CompareMem(p, pr, BitMap.Width) then
   begin
     ShowMessage("Нет!!!");
     j:=i;
     Break;
   end;
   j:=i;
 end;
 if j=Bitmap.Height - 1 then
   ShowMessage("Да!!!");
 finally
   BitMap.Free;
   BitMapR.Free;
 end;
end;


Если я кликаю мышью на Timage, то ее содержимое сравнивается с тем Timage, который находится справа от выбранного. Но, если я щелкаю второй раз по тому Timage, который уже участвовал в сравнении, то получаю AV. Если я кликаю по тому, который находится слева от уже выбираемого, т.е. сравнивается с тем, который ранее выбирался, то тоже AV. AV появляется на выделенных строках, в зависимости от того, какой Timage используется повторно.

Понимаю, что что-то надо освобождать, но вот что и как?
пробовал в finally добавлять
TImage1.free;
TImage2.free;
- не помогает.
Также пробовал
TImage1:=nil;
TImage:=nil;
- тоже никакого улучшения.


 
DVM ©   (2010-03-19 19:42) [1]


>    BitMap.Free;
>    BitMapR.Free;

убери


 
Плохиш ©   (2010-03-19 19:56) [2]


> Понимаю, что что-то надо освобождать, но вот что и как?

Не понял, что освобождать? В приведённом коде ничего не создаётся.
Стоит раздел о работе с объектами в делфи ещё раз перечитать.


 
pavel_guzhanov ©   (2010-03-19 20:12) [3]

Спасибо за помощь :о))


 
Slym ©   (2010-03-22 06:54) [4]

CompareMem(p, pr, BitMap.Width) в справке по ScanLine неверный пример... точнее верный только для PixelFormat=pf8bit...

не проверяя PixelFormat ты не полностью сравниваешь линии битмапов при PixelFormat>pf8bit (при pf32bit только четверть)
и при PixelFormat<pf8bit вылазишь за границы памяти битма и можешь получить AV
const
 BitCounts: array [pf1Bit..pf32Bit] of Byte = (1,4,8,16,16,24,32);
var i,BytesPerScanline:integer;
begin
Name:=TControl(Sender as TImage).Name;
xa:=StrToInt(copy(name, 2, 2));
ya:=StrToInt(copy(name, 4, 2));
xaR:=xA;
yaR:=ya+1;
Image1:=Pan[xa, ya];
Image2:=Pan[xaR, yaR];
BitMap:=Image1.Picture.Bitmap;
BitMapR:=Image2.Picture.Bitmap;
if (BitMap.Width<>BitMapR.Width)or (BitMap.Height<>BitMapR.Height) or
 (BitMap.PixelFormat<>BitMapR.PixelFormat) then raise Exception.Create("Non compareble bitmaps");
BytesPerScanline:=BitMap.Width*BitCounts[BitMap.PixelFormat];
i:=0;
while i<Bitmap.Height do
begin
  P := Bitmap.ScanLine[i];
  PR:=BitMapR.ScanLine[i];
  if not CompareMem(p, pr, BytesPerScanline) then
    Break;
end;
if i<Bitmap.Height then
  ShowMessage("Нет!!!")
else
  ShowMessage("Да!!!");
end;


 
Slym ©   (2010-03-22 06:57) [5]

while i<Bitmap.Height do
begin
 P := Bitmap.ScanLine[i];
 PR:=BitMapR.ScanLine[i];
 if not CompareMem(p, pr, BytesPerScanline) then
   Break;
 inc(i);
end;

а while - к тому что пошло использовать 2 переменные (i,j)для одной цели :)



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.084 c
15-1270240202
Юрий
2010-04-03 00:30
2010.08.27
С днем рождения ! 3 апреля 2010 суббота


2-1265642089
webpauk
2010-02-08 18:14
2010.08.27
Проблема с CheckBox


15-1269740773
Незнайка на Луне
2010-03-28 05:46
2010.08.27
Подскажите название книги


10-1166777041
DmiSb
2006-12-22 11:44
2010.08.27
Как программно создать письмо на отправку в The Bat


15-1267479001
Юрий
2010-03-02 00:30
2010.08.27
С днем рождения ! 2 марта 2010 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский