Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: Komandor, 18:58 18-03-2022
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Освобождение ресурсов это не только утечка памяти. Посмотрите например на TMemIniFile выше.  
Если есть возможность полностью защитить наш объект от AV, то мне не понятно, зачем этой возможностью пренебрегать.

Все было бы так красиво, как вы говорите, если бы была возможность угадать, в каком именно месте была повреждена куча, и как скоро после этого возник AV. В реальности любые попытки что то сохранить после AV потенциально могут вам сохранить мусор. Даже если в тексте AV написано "read".
Не зря в браузерах стали заводить отдельные процессы под каждую вкладку. И даже не посмотрели на полное отсутствие указателей в JS.
 
Alexey_Gawrilow
Вам может так и проще, но мне кажется, что как минимум имена не очень удачные.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:05 04-02-2018
zedxxx

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins
Исключения - это не только AV.

Всего записей: 1501 | Зарегистр. 14-07-2008 | Отправлено: 14:13 04-02-2018
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zedxxx
Хелп говорит, что деструкторы не должны кидать исключения ни при каких обстоятельствах. Хотя конечно AV или что то типа EOutOfMemory всегда может пролезть. Но в этом случае нет особого смысла пытаться что то сохранить или освободить потому, что можно только ухудшить ситуацию. Ухудшить вплоть до того, что даже логер ошибок не сможет создать лог. Разработчики винды вообще говорят в любой непонятной ситуации посылать сразу крашиться, чтобы винда смогла задействовать внешний логер.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:13 04-02-2018
zedxxx

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Хелп говорит

Пруф где? Впрочем, лучший пруф это пример их же собственного кода.

Цитата:
Но в этом случае нет особого смысла

Ну что значит нету смысла. В этой конкретной функции вы ничего не предпримете, но ведь весь остальной код по стеку тоже ж наверняка весь обёрнут в try..finally и все эти блоки будут срабатывать... и "ухудшать ситуацию". Т.е. появляется какая-то нехорошая избирательная обработка ошибок: тут обрабатываем, а там пусть будет что будет.  
 
Не нравится мне такая логика, хоть ты тресни!
 
Добавлено:
Исключение в деструкторе ничем принципиальным не отличается от обычного исключения (для внешнего объекта, а не для того, который его бросил). И все внешние объекты должны обрабатывать его ровно так же, как и все остальные исключения. А поскольку никто не может гарантировать, что деструктор не выбросит исключения, то предлагаемый вариант try..finally является гарантированно небезопасным. Вот когда будет гарантия, что деструкторы безопасны, вот тогда и можно будет о чём-то говорить. Я так считаю.

Всего записей: 1501 | Зарегистр. 14-07-2008 | Отправлено: 18:21 04-02-2018
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Frodo_Torbins

Цитата:
что как минимум имена не очень удачные

Первоначально это фсе называлось New<Subject>Guard
Перегрузил как _g.
Считай это макросом.
У каждого со временем своя клинопись складывается.
Мне за 30+ лет писания программ простительно.

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 22:41 04-02-2018
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Пруф где? Впрочем, лучший пруф это пример их же собственного кода.

Гугл только по плюсам статьи находит. По Делфи лишь пара мертвых линков попались.
Что касается примеров, то вы нигде в библиотеках не найдете raise внутри Destroy.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:18 05-02-2018
zedxxx

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
По Делфи лишь пара мертвых линков попались.

Ну вот, т.е. даже на словах не задекларировано.

Цитата:
то вы нигде в библиотеках не найдете raise внутри Destroy

Руками, через raise, может никто и не бросает (но я все библиотеки на свете не изучил, и не могу вот так смело утверждать, что такого в мире не случается), но исключение там таки может случиться по множеству причин, так что наличие/отсутствие raise - не показатель.
 
Добавлено:
О, и на stackoverflow про этот злосчастный try..finally блок вопрос появился: Delphi XE10 object create inside try block?

Всего записей: 1501 | Зарегистр. 14-07-2008 | Отправлено: 15:33 05-02-2018 | Исправлено: zedxxx, 15:36 05-02-2018
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zedxxx
И ответы там просто чудесные.
 
Вольный перевод ответа от Dalija Prasnikar:
Цитата:
Если в деструкторе возникает исключение, то FreeInstance не будет вызван. Это значит, что память, занимаемая полями этого объекта, никогда не будет освобождена. В результате в программе будет утечка, и горы try/finally не спасут. Кроме того, такое исключение не позволит отработать родительским деструкторам, и приведет к утечкам других объектов и ресурсов принадлежащих этому объекту.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 18:40 05-02-2018 | Исправлено: Frodo_Torbins, 18:41 05-02-2018
zedxxx

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну да, с тем объектом будет всё плохо. Но другие после этого ещё можно и спасти...
 
Добавлено:
Интересно пишет David Heffernan в комментариях:

Цитата:
The best thing to do if a destructor fails to run to completion is to forcibly terminate the process.

Только мне не понятно, как предлагается такое сделать. Как узнать что вот это исключение произошло именно в деструкторе и нужно срочно умереть? Наворачивать кучу дополнительного кода в finally?
 
А вообще, по заветам, функции должны быть короткими, в "три строчки". И там не должно создаваться по 3-5 объектов, а максимум два. И тогда такой проблемы с try..finally не будет и код будет стройный.

Всего записей: 1501 | Зарегистр. 14-07-2008 | Отправлено: 22:14 05-02-2018 | Исправлено: zedxxx, 22:14 05-02-2018
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hi All,
 
В Delphi 7 если у TSaveDialog включить опцию ofAllowMultiSelect, то появляется возможность выбора сразу нескольких файлов для их последующего сохранения.
 
В Delphi 10.2.2 у TSaveDialog тоже можно включить опцию ofAllowMultiSelect, но она почему то не дает возможность выбора нескольких файлов.
 
Вопрос: Это ошибка Delphi 10.2.2 или это так и должно быть ?  
Кстати говоря в диалоге TOpenDialog эта опция работает.
 
 
И еще небольшой вопрос по Delphi 10.2:  
В Delphi 10.2.1 в режиме дизайна формы в контекстном меню любого компонента или контроля был пункт меню для копирования названия компонента. А в Delphi 10.2.2 этот пункт пропал.  
Можно ли его как то включить назад ?

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 12:09 09-02-2018
vez



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
10.2.2 этот пункт пропал.  
Можно ли его как то включить назад ?  

 
Он есть, Copy Component Names

Всего записей: 559 | Зарегистр. 02-06-2003 | Отправлено: 13:08 09-02-2018
Sulphide

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В Delphi 10.2.2 у TSaveDialog тоже можно включить опцию ofAllowMultiSelect, но она почему то не дает возможность выбора нескольких файлов.  

Мне сложно представить функционал приложения в котором бы эта фича могла быть реализована... Поэтому, да, так и должно быть.

Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 05:40 10-02-2018
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vez

Цитата:
Он есть, Copy Component Names  

А у Вас случайно, GExperts не установлен ? ИМНО это пункт от него. А в 10.2.1 был собственный аналогичный пункт меню.
 
Sulphide

Цитата:
Мне сложно представить функционал приложения в котором бы эта фича могла быть реализована... Поэтому, да, так и должно быть.

Элементарно. Пользователь выбирает несколько файлов для их последующего сохранения в БД.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 17:11 12-02-2018
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware

Цитата:
Элементарно. Пользователь выбирает несколько файлов для их последующего сохранения в БД

Это случай для TOpenDialog, a не TSaveDialog. Мне кажется как только вы поменяете TSaveDialog на TOpenDialog у Вас все найдется и получится.

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 17:56 12-02-2018
DestinyR



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В Delphi 10.2.1 в режиме дизайна формы в контекстном меню любого компонента или контроля был пункт меню для копирования названия компонента. А в Delphi 10.2.2 этот пункт пропал.  
Можно ли его как то включить назад ?  

 
Я использую cnPpack и комбинацию клавиш Ctrl+Alt+N при выделенном компоненте - копирует название в буфер обмена и сразу переключает на код с формы.

Всего записей: 33 | Зарегистр. 13-12-2003 | Отправлено: 17:58 12-02-2018
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter

Цитата:
Это случай для TOpenDialog, a не TSaveDialog. Мне кажется как только вы поменяете TSaveDialog на TOpenDialog у Вас все найдется и получится.

То что эта опция работает для TOpenDialog я знаю, просто когда в заголовке диалога выбора файлов  
указано "Выберите файлы для их сохранения в БД", а на кнопке диалога надпись не "Сохранить", а "Открыть" это ИМНО несколько смущает.
 
DestinyR
Цитата:
Я использую cnPpack и комбинацию клавиш Ctrl+Alt+N при выделенном компоненте - копирует название в буфер обмена и сразу переключает на код с формы.

То что это есть в экспертах это понятно, но в данном случае речь идет о чистой IDE Delphi 10.2 - в 10.2.1 этот пункт есть, а в 10.2.2 почему то его нет. Вот я и хочу понять почему ?

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 10:08 14-02-2018
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
То что эта опция работает для TOpenDialog я знаю, просто когда в заголовке диалога выбора файлов  
указано "Выберите файлы для их сохранения в БД", а на кнопке диалога надпись не "Сохранить", а "Открыть" это ИМНО несколько смущает.  

StalkerSoftware ну вообще обычно так и делают, но, если смущает - сделай что-то на подобии:

Код:
procedure TForm1.dlgOpen1Show(Sender: TObject);
begin
  SetDlgItemText(GetParent(dlgOpen1.Handle), IDOK, PChar('&Select'));
end;


Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 10:41 14-02-2018
vez



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
 

Цитата:
То что это есть в экспертах это понятно, но в данном случае речь идет о чистой IDE Delphi 10.2 - в 10.2.1 этот пункт есть, а в 10.2.2 почему то его нет. Вот я и хочу понять почему ?

 
Почему нет, есть, уже писал, в контекстном меню для любой компоненты на  форме есть пункт: (Tokyo 10.2.2)
"Components to Code" а под ним "Copy Component Name".

Всего записей: 559 | Зарегистр. 02-06-2003 | Отправлено: 10:54 14-02-2018
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
Цитата:
TSaveDialog тоже можно включить опцию ofAllowMultiSelect, но она почему то не дает возможность выбора нескольких файлов.

Цитата:
Элементарно. Пользователь выбирает несколько файлов для их последующего сохранения в БД.
Вопрос в правильности формулировки. Т.к. диалог относится к файлам, то правильнее говорить о том, что открываются несколько файлов для сохранения в базу данных. Т.е., файлы читаются, а не записываются. И диалоговое окно должно быть для чтения файлов, а не для записи. Следовательно:
- файлы должны обязательно существовать (диалог для записи этого не требует)
- На эти файлы (или на папку) необходимы права на чтение (и необязательны права на запись)

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:08 14-02-2018 | Исправлено: Dronton2, 11:13 14-02-2018
stanzdor



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
 

Цитата:
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  if not OpenDialog1.Execute() then exit;
  for i := 0 to OpenDialog1.Files.Count - 1 do ShowMessage(OpenDialog1.Files[i]);
end;
 
// для OpenDialog1 установите это событие
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  SetWindowText(GetParent(TOpenDialog(Sender).Handle), 'Выберите файл(ы) для сохранения в базу данных..');
  TOpenDialog(Sender).Options:= [ofFileMustExist, ofAllowMultiSelect];
  SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PWideChar('&Save2DataBase') );
end;
 
 

Всего записей: 588 | Зарегистр. 12-04-2004 | Отправлено: 17:46 14-02-2018 | Исправлено: stanzdor, 17:52 14-02-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru