Главная страница
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.48 MB
Время: 0.105 c
15-1273962210
[true]TRIx
2010-05-16 02:23
2010.08.27
Прошу потестить портал.


2-1267882176
nikih22
2010-03-06 16:29
2010.08.27
SERVESOCKET и CLIENTSOKEТ и интернет


15-1265078165
Дмитрий С
2010-02-02 05:36
2010.08.27
Подскажите телефон


15-1268811985
12
2010-03-17 10:46
2010.08.27
Посоветуйте инструмент построения диаграмм БД Oracle


15-1266819424
b/@.
2010-02-22 09:17
2010.08.27
Нужен драйвер USB flash -> DVD-дисковод