Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

При сравнении содержимого двух 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.06 c
2-1273983220
Учащийся
2010-05-16 08:13
2010.08.27
Какой код быстрее


2-1270109240
Цукор5
2010-04-01 12:07
2010.08.27
Картинка на форме


15-1266854887
Kerk
2010-02-22 19:08
2010.08.27
Язык Си и начальное обучение программированию


2-1275324257
И. Павел
2010-05-31 20:44
2010.08.27
Может ли нарушиться Z-последовательность окон?


15-1264607673
QAZ
2010-01-27 18:54
2010.08.27
Алгоритм Кривая->Кривая безье





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский