Особенности удаления записи из таблицы

Чтобы удалить запись следует на навигаторе нажать кнопку (заметим, что удаление может быть выполнено и многими другими методами). В этом случае перед тем как удалить запись, программа выдает окно с вопросом о подтверждении ее удаления (рис. 4.4). Получив положительный ответ, программа удаляет запись.

Правда, вопрос при этом программа задает на английском языке. Эту ситуацию можно улучшить своими средствами, используя функцию MessageDlg. Для этого сначала нужно отменить в навигаторе вопрос о подтверждении удаления, установив его свойство ConfirmDelete в false.

Рис. 4.4. Окно подтверждения удаления записи Рис. 4.5. Свое окно подтверждения удаления записи Рис. 4.6. Полностью русифицированное окно

Создадим событие для щелчка кнопке навигатора DBNavigator со следующим текстом:

procedure TForm1.DBNavigatorClick(Sender: TObject; Button: TNavigateBtn);
begin
if Button = nbDelete then
if YesNo('Удалить зÓäàëèòü çàïèñü '+Table1Category.AsString+'?') then
Table1.Delete;
end;

Функция MessageDlg выводит в окно текст, который расположен среди его параметров первым. В нашем случае он складывается из суммы трех строк: а) слова " Удалить " с пробелом в конце, б) значения Table1Category. AsString (строчное значение по полю Category) и в) "? " - символа вопроса с пробелом перед ним. Сумму этих строк мы и видим в окне рис. 4.5. Такое окно значительно информативнее, к тому же задает вопрос по-русски. В окне есть 2 кнопки mbYes и mbNo (кстати, в списке кнопок можно было бы указать и другие, но в данном случае они не нужны). Функция вернет свое значение для той кнопки, на которую нажал пользователь. Если пользователь нажал кнопку mbYes, то функция примет значение mrYes и, следовательно, условие в операторе if выполнится. Это приведет к исполнению процедуры Table1. Delete, то есть удалению текущей записи в Table1. В том случае, если пользователь закроет окно вопроса любым другим способом, то сработает та часть оператора, которая стоит за словом else (иначе). Там расположен оператор Abort (прервать). В данном случае мы прерываем процедуру удаления, которая производится в событии BeforeDelete. Если бы мы не вставили этот оператор, то процедура даже при отрицательном ответе все равно бы удалила запись.

Тем не менее и это окно пишет наименования на кнопках по-английски. Сейчас мы заставим Delphi эти надписи выводить по-русски. Для этого будем подсовывать Delphi вместо стандартных английских слов нужные нам русские посредством перехвата момента события вывода надписей на кнопках и в заголовке окна.

В самом конце модуля перед оператором end. разместите текст

procedure HookResourceString(rs: PResStringRec; newStr: PChar);
// процедура инициализации перехвата ресурсной строки rs и замены ее на newStr
var OldProtect: DWORD;
begin

VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect);
rs^.Identifier:= Integer(newStr);
VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect);
end;

initialization
// начать перехват вывода текста на кнопке Yes, при перехвате заменять на 'Да'
HookResourceString(@SMsgDlgYes, 'Да');
// начать перехват вывода текста на кнопке No, при перехвате заменять на 'Нет'
HookResourceString(@SMsgDlgNo, 'Нет');
// начать перехват вывода текста заголовка окна, при перехвате заменять на 'Подтвердите'
HookResourceString(@SMsgDlgConfirm, 'Подтвердите');

Результат таких перехватов (хуков) показан на рис. 4.6.

Примечание. Если подобные вопросы в программе задается часто, то удобно их оформить отдельной логической функцией YesNo, в которой единственным аргументом будет текст вопроса: function YesNo(Text: String): boolean; begin Result:= MessageDlg(Text,mtConfirmation, [mbYes, mbNo], 0) = mrYes; end; Тогда код процедуры удаления станет много короче: procedure TForm1.Table1BeforeDelete(DataSet: TDataSet); begin if YesNo('Удалить '+Table1Category.AsString+'?') then Table1.Delete else abort; end;

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: