Перейти к содержанию

triwire

Пользователи
  • Постов

    67
  • Зарегистрирован

  • Посещение

Весь контент triwire

  1. X-tender //Вариант 0 procedure showImg(img) var pictureForm:TPictureForm; begin pictureForm:=TPictureForm.Create(img,dimensions); try pictureForm.ShowModal; finally pictureForm.Free; end; end; //Вариант 1 procedure showImg(img) var pictureForm:TPictureForm; begin pictureForm:=TPictureForm.Create(img,dimensions); pictureForm.ShowModal; pictureForm.Free; end; //Вариант 2 procedure showImg(img) var pictureForm:TPictureForm; begin try pictureForm:=TPictureForm.Create(img,dimensions); pictureForm.ShowModal; finally pictureForm.Free; end; end; //Вариант 3 procedure showImg(img) var pictureForm:TPictureForm; begin try pictureForm:=TPictureForm.Create(img,dimensions); pictureForm.ShowModal; pictureForm.Free; finally end; end; //Говнокод 0 procedure showImg(img) var pictureForm:TPictureForm; begin pictureForm:=nil try pictureForm:=TPictureForm.Create(img,dimensions); pictureForm.ShowModal; finally if (pictureForm<>nil) then pictureForm.Free; end; end; Вам был предложен(единственно верный в данном контексте) вариант 0, вы же утверждаете что он не верный. Вами пока что было предложено четыре варианта: Вариант 1 - исключительная ситуация в showModal не даст разблокировать ресурсы pictureForm. Вариант 2 - исключительная ситуация в Create приведет к вызову 2 раза деструктора. Вариант 3 - исключительная ситуация в showModal не даст разблокировать ресурсы pictureForm. Говнокод 0 - говнокод все остальные варианты разместить try..finally..end и create..showmodal..free, вообще не имеют смысла Далее: Как вам уже писали, проблема не в дельфи, а в вашем понимании(проблема любых парных вызовов). Тут же вы упомянули про обработку исключений(заметьте первым это зделали вы) при создании обьекта, и единственно рассово верным тут будет вариант: var pictureForm:TPictureForm; begin ... try ... pictureForm:=TPictureForm.Create(img,dimensions); try pictureForm.ShowModal; finally pictureForm.Free; end; except ... end; ... end; try..finally вам предложили, потомучто вы в грубой форме упомянули про говнокод да, в showmodal есть try..finally, но это ничего не меняет, хоть есть он, хоть нету. Снаружи try..finally нужен для того чтоб гарантированно удалить обьект. Ошибка в деструкторе, является критической ошибкой, и по сути исправить мы ничего уже не можем. т.е. придется констатировать факт критической ошибки и завершить программу. Соответственно блок try..except часто нах не нужен, проще это зделать в Application.OnException. По ходу переписки, вы опкидали всех помидорами, досталось даже борланду и дельфи в частности, при этом вами небыло показано не одного полностью верного кода. По факту - вы дятел, еще и опозорилсо.
  2. от procedure showImg(img) var pictureForm:TPictureForm; begin pictureForm:=TPictureForm.Create(img,dimensions); try pictureForm.ShowModal; finally pictureForm.Free; end; end; Когда разбересь, надеюсь, больше не будете приставать с глупостями Я вами поражаюсь, но о вас позже. Я еще раз говорю, что код В, в любом случае вызовет деструктор. Код А, при ошибке в методе TPictureForm.ShowModal не вызывет деструктор pictureForm. Для примера перегрузите метод: function TPictureForm.ShowModal:integer; override; begin result:=inherited ShowModal; raise Exception.Create('ПРЕВЕД'); end; что по сути, будет эквивалентно: procedure showImg(img) var pictureForm:TPictureForm; begin pictureForm:=TPictureForm.Create(img,dimensions); pictureForm.ShowModal; raise Exception.Create('ПРЕВЕД'); pictureForm.Free; end; function TCustomForm.ShowModal: Integer; var WindowList: Pointer; SaveFocusState: TFocusState; SaveCursor: TCursor; SaveCount: Integer; ActiveWindow: HWnd; begin CancelDrag; if Visible or not Enabled or (fsModal in FFormState) or (FormStyle = fsMDIChild) then raise EInvalidOperation.Create(SCannotShowModal); if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0); ReleaseCapture; Application.ModalStarted; try Include(FFormState, fsModal); if (PopupMode = pmNone) and (Application.ModalPopupMode <> pmNone) then begin RecreateWnd; HandleNeeded; end; ActiveWindow := GetActiveWindow; SaveFocusState := Forms.SaveFocusState; Screen.SaveFocusedList.Insert(0, Screen.FocusedForm); Screen.FocusedForm := Self; SaveCursor := Screen.Cursor; Screen.Cursor := crDefault; SaveCount := Screen.CursorCount; WindowList := DisableTaskWindows(0); try Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); if GetActiveWindow <> Handle then ActiveWindow := 0; finally Hide; end; finally if Screen.CursorCount = SaveCount then Screen.Cursor := SaveCursor else Screen.Cursor := crDefault; EnableTaskWindows(WindowList); if Screen.SaveFocusedList.Count > 0 then begin Screen.FocusedForm := Screen.SaveFocusedList.First; Screen.SaveFocusedList.Remove(Screen.FocusedForm); end else Screen.FocusedForm := nil; if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow); RestoreFocusState(SaveFocusState); Exclude(FFormState, fsModal); end; finally Application.ModalFinished; end; end; Поговорим далее: Собственно зачем вы для какого простого примера, взяли такой сложных класс как TForm? Судя по вашему недопониманию отличий, вы для проверки создавали исключение в событии (например в OnClick), и у вас конешно же разницы не наблюдалось. Давайте я приведу пример: procedure pictureForm.FormClick(Sender: TObject); begin raise Exception.Create('Ошибка в обработчике событий'); end; procedure showImg(img) var pictureForm:TPictureForm; begin try pictureForm:=TPictureForm.Create(img,dimensions); pictureForm.OnClick:=pictureForm.FormClick; pictureForm.ShowModal; pictureForm.Free; except raise Exception.Create('Ошибка в "основной" программе'); end; end; Можете комбинировать с первым примером и делать выводы. А дело в том, что события в большинстве случаев вызываются не из вашего кода(В частности OnClick берет свои корни из user32.dll, и этой библиотеке нах не нужны ваши исключительные ситуации), и по этому весь обработчик событий завернут в try..except, который(если не установлено Application.OnException) выводит на экран MessageBox, и завершает обработку текущего сообщения(переходит к обработке следующего сообщения). Т.е. из "основной" программы, блоком try..except, вы не поймаете ошибку в обработке сообщений. И собственно вы правы, групость - пытаться переубедить такого дятла как вы.
  3. X-tender как раз вы и голословны в своих заблуждениях утверждениях Код от борланда просто уверен, что ошибки могут произойти на любом ровном месте, и по этому весь код обернут в блок try..except, который передает управление стандартному обработчику исключительных ситуаций(который можно поменять). Далее весь конструктор обернут в блок try..except, который вызывает деструктор(по этому в любой нормальной книжке по ООП написано, чтоб деструктор по возможности не вызывал исключения и был готов к любому состоянию обьекта, в том числе и к не полностью созданному обьекту) Первый код в любом случае передаст обработчику исключений верную информацию, и предотвратит утечку памяти разблокирует ресурсы(собственно для этого тут и присутствует блок try..finally), т.е. код 100% правильный и так рекомендуется делать со всеми временными обьектам(выделенными ресурсами). Второй код, как вы уже поняли и сами - неверный, так как в обработчик в лучшем случае попадет ахинея. на это утверждение вам четко и ясно ответил coder следующим же постом ,но по видимому вы ничего не поняли т.к. продолжили: Как я уже сказал, весь код программы обернут в try..except, но по видимому иногда не достаточно стандартного обработчика ошибок, т.е нарушилась логика работы программы и надо чтото исправить и продолжить выполнение программы. Очевидно что содержимого блока try..finally не всегда достаточно чтобы исправить логику работы программы. Нужно обернуть код в try..except, в том месте программы, где можно чтото исправить(и это может быть не в том же методе, а в вызывающем). Т.е. назначение у операторов try..finally и try..except совершенно разное: у первого чтоб ненапортить ничего, а у второго чтоб попытаться исправить. И именно по этому это два разных оператора. В связи со сказанным мною выше, эти утверждения становятся смешными. Поймите, все и без вашего вмешательства нормально отловится. Вы советуете использовать операторы не по назначению и пихать их куда только можно, везде прикручивать костыли.(см. Индусы) С таким подходом программы дубут вылетать без какого либо внятного обьяснения причины вылета, причем эти самые костыли делают код не читаемым, и вероятность ошибиться многократно увеличивается, т.е. причин для вылета больше. А программы вылетать будут всегда, так как большинство причин вылета от программы и не зависит. Но всегда приятней если программа при вылете дает качественный отчет о причине, чем когда вылетает молча.
  4. щас зашел, все в норме, лучше б днем и не заходил)
  5. А сейчас решил статистику посмотрел, чуть не ужаснулся там столько денег набежало. Дозвонился до стк, там сказали что какаято авария у них и теперь некоторый траффик считается как внешний но они после праздников все исправят и зделают всем переращет или подойти к ним и они в индивидуальном порядке проведут переращет после 12 числа блин я пока дозванивался нервно скурил 2 сигареты(
  6. есть сайт Института Клиптографии и Связи там все требования написаны и даже примеры вступительных экзаменов там вроде написано за пол года документы подавать указать судимости всех родственников экзамены здавать в местном воинкомате или чето в этом роде
  7. Lakers TJPEGImage *jpg=new TJPEGImage; jpg->LoadFromFile("C:\\3.jpg"); Image1->Picture->Assign(jpg); delete jpg;
  8. 0xDEADBEEF что за топ тимуса? а по мойму ее можно решить перебром с конца т.е.: всего клетка может быть заселена 5 бактериями - одна собственная и 4 от соседних, следует если на определенной итерации у клетки нет 4 заселенных соседей, значит единичка в ней реальная а не получена путем погибания 4 бактерий нужно искать единицы и расселять(1 ставить в ноль а соседнии уменьшать на один) эту клетку, если попытка не удалась то обратно заселять и искать новую единичку что значит попытка не удалась: 1.неосталось единичек, все перебрали или их нет вообще 2.получены две соседнии клетки с реальными единичками 3.получена клетка у которой количество бактерий больше чем количество заселенных соседних клеток +1 (например если нет заселенных соседних клеток то не может быть больше одной бактерии)
  9. PLDN не знаю что это. скорее всего нету)
  10. StarCraft: Brood War Год выпуска: 1998 Жанр: RTS Разработчик: Blizzard Entertainment Тип издания: пиратка Язык интерфейса: только английский Таблэтка: Присутствует Платформа: PC Системные требования: Windows 95/98/NT/2000/XP/Vista Pentium 90 16 MB RAM DirectX-Compatible SVGA Video Card Microsoft-Compatible Mouse Описание: [align=justify]Война Протосов, Зергов и Землян приобрела воистину эпический размах. С момента появления StarCraft во всем мире было продано более девяти миллионов копий игры! Гениальная стратегия удостоилась званий "Лучшей игры года" и "Лидера продаж" - результат, которого добился далеко не каждый конкурент. Официальное дополнение StarCraft: Brood War лишь закрепило достижения оригинала, сделав его еще динамичней и насыщенней.[/align] [*:d4a55282b9]7xPatcher 1.16.0 [*:d4a55282b9]BNetGatewayEditor 2.0 beta [*:d4a55282b9]bwchart 1.03G [*:d4a55282b9]Распаковать архив [*:d4a55282b9]Запустить Setup.exe [*:d4a55282b9]Запустить Install.exe и пропатчить до нужной версии [*:d4a55282b9]Запусить Brood.exe и играть [*:d4a55282b9]Запустить BNetGatewayEditor.exe и добавить сервера games.stbur.ru и ggw.stbur.ru [*:d4a55282b9]Чтобы другие игроки могли видеть вашу игру нужно открыть порт 6112
  11. zager на элт мониторах грубо пиксель загорается, тухнет на следующем цикле опять загорается итд, тоесть чем больше частота тем меньше ты будешь замечать мерцание на лсд грубо говоря кристал поворачивается и конденсатор держит это положение пока не придет сигнал повернуться в другое положение и тд., тоесть мерцания никакого нет и по этому поставь значение то которое в паспорте написано(обычно 60гц), чтобы монитор свой не добить), за глазки можешь не беспокоиться
  12. grey-to-grey намного больше, чем black-to-white, после этого хочется сказать учите матчасть) программно можно получить только частоту обновления а не скорость смены изображения тоесть 16-17мс это как раз 60гц - частота которую мы задали в драйверах видеокарты, и к времени отклика эта цифра никакого отношения не имеетВначале про технологии: Параметры современных ЖК-мониторов(внешка) и про то откуда взялись цифры 2, 4, 6мс: Overdrive для монитора(внешка) Так как сам подолгу сижу за монитором рекомендую мониторы на PVA матрице(типа samsung 970P, 971P...) у самого 970P уже 3 года и нинашто не жалуюсь, были вначале проблемы с плохой интерполяцией, картинка кудато уезжала на разных разрешениях, чернобелые изображения рябили, но подключил через DVI и все прошло, а то я начал грешить на самсунг) так что DVI это обязательно и даже обсуждению не подлежит
  13. как очистить буфер стандартного потока ввода cin? while(1) { int i; cin>>i; if (i==0) break; //... } если ввести абракадабру возникает бесконечный цикл, как эту абракадабру одним движением выкинуть из буфера? И еще, как понять сколько символов сейчас в буфере лежат необработанными и по какой причине прекратился ввод(ну там пробел или абракадабра или все данные считаны)
×
×
  • Создать...