Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Перевести из Делфи


Автор: Лена 28.1.2009, 19:35
Как сея конструкция из Делфи, будет выглядить в С++ 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;


 

Автор: Dem_max 28.1.2009, 19:48
Цитата

Ключевое слово 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

Автор: Alexeis 28.1.2009, 20:14
Если в терминах С++ то throw , если SEH то RaiseException

Автор: vivat 29.1.2009, 04:53
Цитата(Лена @  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!");


Автор: Лена 30.1.2009, 16:39
На этой странице: http://research.pdmagic.com/iw/html/index.html?4_3_the_secrets_of_the_server_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 

Автор: mrbrooks 30.1.2009, 17:12
Цитата(Лена @  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 

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


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


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

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

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

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

да будет так 

Автор: VOX 6.2.2009, 12:06
вот переведенный код, заработает?

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" );
 } 

Автор: mrbrooks 6.2.2009, 12:15
VOX, камрад юзай тег код. а то читать не кошерно как-то.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)