C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как русифицировать MessageBox, в DBnavigator?
Dmitri
  Отправлено: 19.06.2003, 18:13


admin@localhost

Группа: Модератор
Сообщений: 110



В DBnavigator (компонент с палитры DataControl) есть кнопка "Удалить запись" (выглядит как минус). Так вот, когда нажимаешь на нее, выскакивает окошко: Confirm: Delete record? OK/Cancel.

КАК русифицировать этот MessageBox? ОЧЕНЬ надо, т.к. пользователи жалуются на английский язык в программе.
Asher
Отправлено: 19.06.2003, 19:14


Мастер участка

Группа: Модератор
Сообщений: 550



Если народ ни чего не придумает, то на крайний случай есть вот такая штука OgreGUI
QUOTE

В общем случае, данная программа предназначена для перевода программ, софта или игрушек на родной язык (локализация). Часто для этой цели используются редакторы ресурсов. Но дело в том, что редакторы ресурсов не позволяют править тексты, находящиеся в теле программы. В результате, во время работы программы, появляются текстовые сообщения на чужеземном языке.
Данная программа и предназначена для того, чтобы править тексты находящиеся в теле программы, а также править и ресурсы. Вообще-то этим текстом может все, что угодно: сообщения, меню, копирайты, пути файлов и реестра, импортируемые и экспортируемые функции, данные ресурсов и т.д.

Но, это не простая замена текста в файле — в программе используются специальные алгоритмы, которые позволяют править тексты, увеличивая их длину. К примеру, надпись "Save" очень легко исправить на "Сохранить в файл...". Обычно этого сделать нельзя т.к. наращивая длину текста, Вы неизбежно затрете текст/данные/код, который следует сразу за этим текстом.

В целом, программа позволяет Вам править строки двух типов: перемещаемые и фиксированные. Перемещаемые строки отличаются от фиксированных тем, что известны ссылки эту такую строку. Т.е. когда Вы подправили строку, ее длина увеличилась, то требуется "переселить" строку в другое место. Если ссылки на строку неизвестны, то "переселить" строку нельзя — программа не узнает об этом. В результате, у фиксированной строки появляется такое ограничение как фиксированная максимальная длина.

если надо, могу мыльнуть, так как он даже пополам рубленный чего-то не прицепляется
Asher
Отправлено: 19.06.2003, 20:53


Мастер участка

Группа: Модератор
Сообщений: 550



Можно еще глянуть сюда Алексей Агафонов
Гость_Nick
Отправлено: 20.06.2003, 13:10


Не зарегистрирован







Можно присвоить
DBNavigator->ConfirmDelete = False;
А в обработчике нажатия кнопки самому спрашивать подтверждение.
Dmitri
Отправлено: 21.06.2003, 13:37


admin@localhost

Группа: Модератор
Сообщений: 110



Интересно, где ты видел обработчик кнопки "Delete record"???
Admin
Отправлено: 23.06.2003, 08:15


Владимир

Группа: Администратор
Сообщений: 1190



По всей видимости имелся ввиду обработчик события BeforeAction
Мы можем поставить в DBNavigator:

DBNavigator->ConfirmDelete = False;

и в обработчике BeforeAction перехватывать это событие

CODE


void __fastcall TForm1::DBNavigator1BeforeAction(TObject *Sender,
     TNavigateBtn Button)
{
   if(Button == nbDelete){
      if(Application->MessageBox("Удалить запись ?",
         "Подтвердите   удаление", MB_YESNO)== IDYES){
                Table1->Delete();
                         }
        else try{ //
                   }
         catch(...){}
      }
}



Однако что делать, чтобы запись не удалялась — непонятно,
в любом случае запись будет удалена,
и зачем нужен такой обработчик BeforeAction,
в котором невозможно отказаться от выполнения Action
тоже неясно.
Гость_Nick
Отправлено: 23.06.2003, 11:36


Не зарегистрирован







Я извиняюсь.
Я сделал так.
Убрал кнопку с DBNavigator и обрабатывал нажатие
клавишь Ctrl+Del

Admin
Отправлено: 23.06.2003, 13:46


Владимир

Группа: Администратор
Сообщений: 1190



Да это понятно, но хотелось бы не убирая кнопки,
именно нажимая кнопку -, иначе тогда DBNavigator
вообще не нужен.
Конечно явно этому обработчику
BeforeAction не хватает некого флага типа
bool isAction, и если isAction = false, то дальнейшая обработка
не выполняется
Что-то Borland тут явно не додумал. wink.gif
Гость_Nick
Отправлено: 24.06.2003, 09:17


Не зарегистрирован







Посмотрел исходники.
Сообщения определены в VCL\dbConst.pas
Можно наверно руссифицировать и перекомпилировать.
У меня сейчас не так много времени.
Admin
Отправлено: 24.06.2003, 16:28


Владимир

Группа: Администратор
Сообщений: 1190



Нашел частично обходной способ это реализовать.
Для этого в Table1 устанавливаем CachedUpdates в true
и в DBNavigator ConfirmDelete в false.

CODE

void __fastcall TForm1::DBNavigator1Click(TObject *Sender,
     TNavigateBtn Button)
{
   if(Button == nbDelete)
    {
    if(Application->MessageBox("Удалить запись ?",
      "Подтвердите удаление", MB_YESNO)== IDYES)
      {
       Table1->ApplyUpdates();
       Table1->CommitUpdates();
      }
    else Table1->CancelUpdates();
    }
}


Admin
Отправлено: 24.06.2003, 16:40


Владимир

Группа: Администратор
Сообщений: 1190



Также можно сделать и так:
(CachedUpdates у Table оставить в false, поместите на форму компонент
Database1 и свяжите с Table1, установите TransIsolation в tiDirtyRead)


CODE

//---------------------------------------------------------------------------
void __fastcall TForm1::DBNavigator1Click(TObject *Sender,
     TNavigateBtn Button)
{
   if(Button == nbDelete)
    {
    if(Application->MessageBox("Удалить запись ?",
      "Подтвердите удаление", MB_YESNO)== IDYES)
      {
       Database1->Commit();
      }
    else {
       Database1->Rollback();
         }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DBNavigator1BeforeAction(TObject *Sender,
     TNavigateBtn Button)
{
      if(Button == nbDelete)
    {
     Database1->StartTransaction();
    }
}
//-----------------------------------------------------


Admin
Отправлено: 04.08.2003, 09:05


Владимир

Группа: Администратор
Сообщений: 1190



Что-то я торможу. Все намного проще.
Ставите ConfirmDelete = false

void __fastcall TForm1::DBNavigator1BeforeAction(TObject *Sender,
TNavigateBtn Button)
{

if(Button == nbDelete && Application->MessageBox("Удалить запись ?",
"Подтвердите удаление", MB_YESNO)!= IDYES)
Abort();
}
//---------------------------------------------------------------------------



Вернуться в Работа с базами данных в C++Builder