IfbBecameTooFew then
RemoveItem(iLeft + 1);
// ВАЖНО!
// ДО вызова процедуры RemoveItem
// переменная bBecameTooFew = True,
// если слияние страниц, подчинённых записи R, состоялось,
// bBecameTooFew = False, если не было слияния.
// ПОСЛЕ вызова процедуры RemoveItem
// переменная bBecameTooFew = True,
// если на САМОЙ записи R (а не на её потомках)
// стало слишком мало ключей,
// bBecameTooFew = False, если ключей достаточно.
if(lStartPage = 0) andbBecameTooFew then
Begin
// Единственный ключ на корневой странице удалён.
// Значит, осталась ссылка на единственного потомка.
lDied := R.mLink[0];
SeekAndRead(lDied, RAux);
R := RAux;
// Это важно!
// Только ЗДЕСЬ содержимое стартовой страницы
// заменится содержимым её единственного потомка.
RAux.nData := 0;
SeekAndWrite(lDied, RAux);
// Компонент с номером lDied погиб???
end;
SeekAndWrite(lStartPage, R);
end;
Begin
lRightest := FileSize(F);
IflRightest < 1 then
Begin
MsgBox('lFS < 1');
Application.Terminate;
Exit;
end;
iflRightest < 1 + lStartPage then
Begin
MsgBox('lFS < 1 + lStartPage');
Application.Terminate;
Exit;
end;
SeekAndRead(lStartPage, R);
IfR.mLink[0] < 0 then
Begin
// Сюда попали => страница терминальная
fori := 1 toR.nData do
Begin
iR := StringCompare(sFind, R.mData[i]);
ifiR = 0 then
Begin
RemoveItem(i);
// ТОЛЬКО ЗДЕСЬ удаляется ключ!
// bBecameTooFew пойдёт к процедуре-предку.
SeekAndWrite(lStartPage, R);
Exit;
end;
end;
MsgBox('Ключ "' + sFind + '" не найден!');
bFound := False;
Exit;
end;
// Сюда попали => страница НЕтерминальная
fori := 1 toR.nData do
Begin
iR := StringCompare(sFind, R.mData[i]);
ifiR = 0 then
Begin
bFound := True;
lRightest := R.mLink[i - 1];
SeekAndRead(lRightest, RAux);
// В RAux - левый потомок ключа R.mData[i].
Дата добавления: 2015-08-21; просмотров: 441;