Главная страница
    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-1273664604
Дмитро
2010-05-12 15:43
2010.08.27
delphi


15-1272634082
JohnKorsh
2010-04-30 17:28
2010.08.27
Как в Windows7 отключить UAC?


15-1273508224
AKE
2010-05-10 20:17
2010.08.27
Где можно найти программиста на C++?


2-1274516991
ali
2010-05-22 12:29
2010.08.27
Проблема с переходом на D2010


15-1270794656
Den
2010-04-09 10:30
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский