Главная страница
    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.056 c
2-1265884838
lewka
2010-02-11 13:40
2010.08.27
Взоимодействие Word и Delphi


15-1271261484
[true]TRIx
2010-04-14 20:11
2010.08.27
Ищу дельфи пример Цепи Маркова.


6-1219050457
Muh
2008-08-18 13:07
2010.08.27
Как определить программно залогинился ли я на каком либо сайте


2-1270565008
Heckfy1990
2010-04-06 18:43
2010.08.27
SQL запрос на сумму


2-1273983220
Учащийся
2010-05-16 08:13
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский