![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetBookmark, GoToBookmark, FreeBookmark
.dzmitry © (2011-07-13 11:32:00)после поиска (FindKey) в DataSet нужно восстанавливать курсор. много где встречался код такого плана:
function ItemIsFound(Id: Integer): Boolean;
var
B: Pointer;
begin
B := ItemsDataSet.GetBookmark(B);
try
Result := ItemsDataSet.FindKey([Id]);
finally
if Result then
ItemsDataSet.GoToBookmark(B);
ItemsDataSet.FreeBookmark(B);
end;
end;
а что, если при вызове ItemsDataSet.GoToBookmark(B); произойдет ошибка. ItemsDataSet.FreeBookmark(B); не выполнится, возникнет утечка памяти. Будет ли правильным сделать еще один try..finally?
function ItemIsFound(Id: Integer): Boolean;
var
B: Pointer;
begin
B := ItemsDataSet.GetBookmark(B);
try
try
Result := ItemsDataSet.FindKey([Id]);
finally
if Result then
ItemsDataSet.GoToBookmark(B);
end;
finally
ItemsDataSet.FreeBookmark(B);
end;
end;
.dzmitry (2011-07-13 12:51:00) [1]все ясно, вопрос можно считать закрытым
Медвежонок Пятачок (2011-07-13 12:44:00) [2]Вот эта хрень с try/finally зачем здесь:
try
Result := ItemsDataSet.FindKey([Id]);
finally
if Result then
ItemsDataSet.GoToBookmark(B);
end;
ФайндКей вернет либо тру, либо фалс.
Если тру, то курсор сдвинется.
Если не тру, то курсор не сдвинется.
Исключения не генерируется судя по документации.
Зачем здесь try/finally кроме как для мебели?
SQLEXPRESS (2011-07-13 12:36:00) [3]а чего не так?
B := ItemsDataSet.GetBookmark(B);
try
Result := ItemsDataSet.FindKey([Id]);
if Result then
begin
//перед gotobookmark полезно проверять закладку на нил и на bookmarkvalid
ItemsDataSet.GoToBookmark(B);
end;
finally
ItemsDataSet.FreeBookmark(B);
end;
.dzmitry (2011-07-13 12:30:00) [4]спасибо за совет, а что co 2 try..finally блоком для gotobookmark?
Медвежонок Пятачок (2011-07-13 12:15:00) [5]перед gotobookmark полезно проверять закладку на нил и на bookmarkvalid