Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевести из Делфи 
:(
    Опции темы
Лена
Дата 28.1.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Как сея конструкция из Делфи, будет выглядить в С++ Builder? 
if edFirst.Text = '' then //тут понятно
raise EMyApp.Create( 'First Name is required' ); //а тут как raise заменить?

Мне надо так:
if(IWDBLookupComboBox2->ItemIndex == -1)
 {
   тут raise
   return;
 }

Весь код, выглядит так:
Код

typeEMyApp = class (Exception); 

. . . 

procedure TformMain.IWButton1Click(Sender: TObject); const 

SMessage = 'Thank you for your interest <b>%s %s</b>. You will be notified by %s at %s' ; 

var SNotifyAt, SNotifyMethod: string ; beginif not (cbIntraweb.Checked or cbASPNET.Checked or cbDelphi7.Checked) then raise EMyApp.Create( 'Please check at least one event' ); 

if edFirst.Text = '' then
raise EMyApp.Create( 'First Name is required' );
 

if edLast.Text = '' then
raise EMyApp.Create( 'Last Name is required' );
 

case rgrpNotify.ItemIndex of 

0: if edEmail.Text = '' then
raise EMyApp.Create( 'Email not filled in' );
 

1: if edPhone.Text = '' then
raise EMyApp.Create( 'Phone not filled in' );
 

2: if edAddress.Text = '' then 

raise EMyApp.Create( 'Address not filled in' );
end;


 

Это сообщение отредактировал(а) Лена - 28.1.2009, 19:41
PM MAIL   Вверх
Dem_max
Дата 28.1.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Цитата

Ключевое слово Raise создает объект исключения, который передается обработчику исключений Delphi. 

Вы можете поднимать исключения только в буквально исключительных случаях. Это не только из-за понесенных накладных расходов ресурсов при выполнении, но также и потому, что есть наиболее лучшие пути для обработки ошибок приложения, таких как коды возврата от функций. 

Версия 1:
Raise используется в предложении Except инструкции Try. Она просто, переподнимает текущее исключение в приложении для того, чтобы обратиться к нему на более высоком уровне. 

Версия 2:
Использует новый объект исключения для сообщения об исключении. Обычно, вы можете использовать объект Exception, или унаследованный объект Exception. 

Вы можете создать объект во время исключения: 

Raise Exception.Create('Error happened');

Версия 3: как и версии 2, но с изменением значения адреса исключения. Во всех случаях, когда запрос Raise сделан, выполнения кода переходит к обработчику исключений Delphi - он или заканчивает программу, или использует текущую инструкцию Try, чтобы обработать её.


Код

//Пример кода : Использование функции Raise 
var
  fred, jim : string;
begin
  // Установка некоторых типовые названий
  fred := 'Good name';
  jim  := 'Badname  ';

  // Попытка менять эти названия
  try
    ShowMessage(fred+' поменялся = '+SwapNames(fred));
    ShowMessage(jim+' поменялся = '+SwapNames(jim));
  except
    On E : Exception do
      ShowMessage(E.Message);
  end;
end;

// Перестановка первого и второго названия в переданной строке названия
// Поднимает исключение, если название недопустимо
function TForm1.SwapNames(name: string): string;
var
  blankPos : Integer;
  i        : Integer;
  nameLen  : Integer;
begin
  // Очистка строки результата, чтобы указать, что нет никакого результата
  Result := '';

  // Нахождение позицию последнего названия
  blankPos := Pos(' ', name);

  // Если найдено, и позиция меньше конца названия
  // тогда пока всё нормально
  nameLen := Length(name);
  if (blankPos > 0) and (blankPos   then
  begin
    // Нахождение начала второго названия
    i := blankPos + 1;
    repeat
      // Если начало последнего названия найденно, меняем первое и последнее название
      if name[i] <> ' '
      then Result := Copy(name, i, nameLen-i+1) + ' ' +
                     Copy(name, 1, blankPos-1)

      else Inc(i);
    until (i > nameLen) or (Length(Result) > 0);
  end;

  // Не удалось поменять первое и второе название ?
  if Length(Result) = 0
  then Raise Exception.CreateFmt('Недопустимое название : ''%s''', [name]);
end;
//Good name поменялся = name Good
//Недопустимое название : 'Badname '
    
//Пример кода : Поднимаем новый тип исключения 
var
  age : Integer;
  exc : EBadAge;
begin
  // Простой код, который поднимает новый тип исключения
  age := 23;
  if age <30 
  then
  begin
    // Создание нового объекта исключения EBadAge
    exc := EBadAge.CreateFmt('Bad age : %d',[age]);

    // Теперь поднимаем этот новый объект исключения
    Raise exc;
  end;
end;
//Диалог ошибки Delphi покажет сообщение :

Bad age : 23



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexeis
Дата 28.1.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Если в терминах С++ то throw , если SEH то RaiseException


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vivat
Дата 29.1.2009, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 6.4.2006
Где: Томск

Репутация: 2
Всего: 2



Цитата(Лена @  28.1.2009,  19:35 Найти цитируемый пост)
Как сея конструкция из Делфи, будет выглядить в С++ Builder? 
if edFirst.Text = '' then //тут понятно
raise EMyApp.Create( 'First Name is required' ); //а тут как raise заменить?

Код

if(editFirst->Text=="") throw("First Name is required!");


PM   Вверх
Лена
Дата 30.1.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



На этой странице: http://research.pdmagic.com/iw/html/index...._controller.cfm
В разделе Сomponents->Building the Weblication
описан пример как вызывать исключения в отдельном web окне.
//Set the ExceptionDisplayMode to smNewWindow и т.д.

Я пишу так: 
if(IWDBLookupComboBox2->ItemIndex == -1) throw("Привет дядя!");

В результате я получаю окно с другим содержанием (см.рис).

Как все таки правльно перевести тот код с Делфи?

Добавлено через 11 минут и 38 секунд
Помогла справка Архангельского.   smile 
Вот так надо было:
if(IWDBLookupComboBox2->ItemIndex == -1) throw Exception("Привет дядя!");
 smile 

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  popup.gif 10,67 Kb
PM MAIL   Вверх
mrbrooks
Дата 30.1.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Лена @  30.1.2009,  16:39 Найти цитируемый пост)
Я пишу так: 
if(IWDBLookupComboBox2->ItemIndex == -1) throw("Привет дядя!");
В результате я получаю окно с другим содержанием (см.рис).


В этом случае по правилам исключительной ситуации в С++ надо так:
Код

try
{
   String msg = "Привет дядя!"; 
   if(IWDBLookupComboBox2->ItemIndex == -1) throw msg;
}
catch (String str)
{
  ShowMessage(str);
}


Добавлено через 1 минуту и 32 секунды
Цитата(Лена @  30.1.2009,  16:39 Найти цитируемый пост)
if(IWDBLookupComboBox2->ItemIndex == -1) throw Exception("Привет дядя!");

а это уже VCL-шная тема. Сторонники чистоты С++ тебя съедят  smile 
PM MAIL   Вверх
Лена
Дата 1.2.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Цитата(mrbrooks @  30.1.2009,  17:12 Найти цитируемый пост)
В этом случае по правилам исключительной ситуации в С++ надо так:


Мне необходимо избавиться от ShowMessage, потому что это окно возникает на серверном компьютере и клиент просто висит.
Поэтому так надо: throw Exception("Привет дядя!");
в результате окно появляется на клиенте в IntraWEB. smile 


PM MAIL   Вверх
mrbrooks
Дата 2.2.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Лена @  1.2.2009,  12:55 Найти цитируемый пост)

Мне необходимо избавиться от ShowMessage, потому что это окно возникает на серверном компьютере и клиент просто висит.

это я чисто для примера - как обрабатываются исключения. это не есть руководство к действию  smile 

Цитата(Лена @  1.2.2009,  12:55 Найти цитируемый пост)
Поэтому так надо: throw Exception("Привет дядя!");

да будет так 
PM MAIL   Вверх
VOX
Дата 6.2.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: 1
Всего: 1



вот переведенный код, заработает?

typeEMyApp == class (Exception); 

 TObject) const  procedure TformMain->IWButton1Click(Sender;
SMessage == "Thank you for( your interest <b>%s %s</b>. You will be notified by %s at %s" ; 
 string   { if(!   (cbIntraweb->Checked || cbASPNET->Checked || cbDelphi7->Checked)   ) raise EMyApp->Create( "Please check at least one event" );  var SNotifyAt, SNotifyMethod;
if(edFirst->Text == ""   )
raise EMyApp->Create( "First Name is required" );
 
if(edLast->Text == ""   )
raise EMyApp->Create( "Last Name is required" );
 
switch(rgrpNotify->ItemIndex) 
0: if(edEmail->Text == ""   )
raise EMyApp->Create( "Email not filled in" );
 
1: if(edPhone->Text == ""   )
raise EMyApp->Create( "Phone not filled in" );
 
2: if(edAddress->Text == ""   ) 
raise EMyApp->Create( "Address not filled in" );
 } 
typeEMyApp == class (Exception); 

 TObject) const  procedure TformMain->IWButton1Click(Sender;
SMessage == "Thank you for( your interest <b>%s %s</b>. You will be notified by %s at %s" ; 
 string   { if(!   (cbIntraweb->Checked || cbASPNET->Checked || cbDelphi7->Checked)   ) raise EMyApp->Create( "Please check at least one event" );  var SNotifyAt, SNotifyMethod;
if(edFirst->Text == ""   )
raise EMyApp->Create( "First Name is required" );
 
if(edLast->Text == ""   )
raise EMyApp->Create( "Last Name is required" );
 
switch(rgrpNotify->ItemIndex) 
0: if(edEmail->Text == ""   )
raise EMyApp->Create( "Email not filled in" );
 
1: if(edPhone->Text == ""   )
raise EMyApp->Create( "Phone not filled in" );
 
2: if(edAddress->Text == ""   ) 
raise EMyApp->Create( "Address not filled in" );
 } 
PM MAIL   Вверх
mrbrooks
Дата 6.2.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



VOX, камрад юзай тег код. а то читать не кошерно как-то.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1305 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.