Форум: "Начинающим";
Текущий архив: 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 вылазишь за границы памяти битма и можешь получить AVconst
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