-
Постов
67 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Галерея
События
Весь контент triwire
-
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. По ходу переписки, вы опкидали всех помидорами, досталось даже борланду и дельфи в частности, при этом вами небыло показано не одного полностью верного кода. По факту - вы дятел, еще и опозорилсо.
-
от 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, вы не поймаете ошибку в обработке сообщений. И собственно вы правы, групость - пытаться переубедить такого дятла как вы.
-
X-tender как раз вы и голословны в своих заблуждениях утверждениях Код от борланда просто уверен, что ошибки могут произойти на любом ровном месте, и по этому весь код обернут в блок try..except, который передает управление стандартному обработчику исключительных ситуаций(который можно поменять). Далее весь конструктор обернут в блок try..except, который вызывает деструктор(по этому в любой нормальной книжке по ООП написано, чтоб деструктор по возможности не вызывал исключения и был готов к любому состоянию обьекта, в том числе и к не полностью созданному обьекту) Первый код в любом случае передаст обработчику исключений верную информацию, и предотвратит утечку памяти разблокирует ресурсы(собственно для этого тут и присутствует блок try..finally), т.е. код 100% правильный и так рекомендуется делать со всеми временными обьектам(выделенными ресурсами). Второй код, как вы уже поняли и сами - неверный, так как в обработчик в лучшем случае попадет ахинея. на это утверждение вам четко и ясно ответил coder следующим же постом ,но по видимому вы ничего не поняли т.к. продолжили: Как я уже сказал, весь код программы обернут в try..except, но по видимому иногда не достаточно стандартного обработчика ошибок, т.е нарушилась логика работы программы и надо чтото исправить и продолжить выполнение программы. Очевидно что содержимого блока try..finally не всегда достаточно чтобы исправить логику работы программы. Нужно обернуть код в try..except, в том месте программы, где можно чтото исправить(и это может быть не в том же методе, а в вызывающем). Т.е. назначение у операторов try..finally и try..except совершенно разное: у первого чтоб ненапортить ничего, а у второго чтоб попытаться исправить. И именно по этому это два разных оператора. В связи со сказанным мною выше, эти утверждения становятся смешными. Поймите, все и без вашего вмешательства нормально отловится. Вы советуете использовать операторы не по назначению и пихать их куда только можно, везде прикручивать костыли.(см. Индусы) С таким подходом программы дубут вылетать без какого либо внятного обьяснения причины вылета, причем эти самые костыли делают код не читаемым, и вероятность ошибиться многократно увеличивается, т.е. причин для вылета больше. А программы вылетать будут всегда, так как большинство причин вылета от программы и не зависит. Но всегда приятней если программа при вылете дает качественный отчет о причине, чем когда вылетает молча.
-
щас зашел, все в норме, лучше б днем и не заходил)
-
А сейчас решил статистику посмотрел, чуть не ужаснулся там столько денег набежало. Дозвонился до стк, там сказали что какаято авария у них и теперь некоторый траффик считается как внешний но они после праздников все исправят и зделают всем переращет или подойти к ним и они в индивидуальном порядке проведут переращет после 12 числа блин я пока дозванивался нервно скурил 2 сигареты(
-
есть сайт Института Клиптографии и Связи там все требования написаны и даже примеры вступительных экзаменов там вроде написано за пол года документы подавать указать судимости всех родственников экзамены здавать в местном воинкомате или чето в этом роде
-
Lakers TJPEGImage *jpg=new TJPEGImage; jpg->LoadFromFile("C:\\3.jpg"); Image1->Picture->Assign(jpg); delete jpg;
-
0xDEADBEEF что за топ тимуса? а по мойму ее можно решить перебром с конца т.е.: всего клетка может быть заселена 5 бактериями - одна собственная и 4 от соседних, следует если на определенной итерации у клетки нет 4 заселенных соседей, значит единичка в ней реальная а не получена путем погибания 4 бактерий нужно искать единицы и расселять(1 ставить в ноль а соседнии уменьшать на один) эту клетку, если попытка не удалась то обратно заселять и искать новую единичку что значит попытка не удалась: 1.неосталось единичек, все перебрали или их нет вообще 2.получены две соседнии клетки с реальными единичками 3.получена клетка у которой количество бактерий больше чем количество заселенных соседних клеток +1 (например если нет заселенных соседних клеток то не может быть больше одной бактерии)
-
PLDN не знаю что это. скорее всего нету)
-
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
-
поиск по трем буквам
-
zager на элт мониторах грубо пиксель загорается, тухнет на следующем цикле опять загорается итд, тоесть чем больше частота тем меньше ты будешь замечать мерцание на лсд грубо говоря кристал поворачивается и конденсатор держит это положение пока не придет сигнал повернуться в другое положение и тд., тоесть мерцания никакого нет и по этому поставь значение то которое в паспорте написано(обычно 60гц), чтобы монитор свой не добить), за глазки можешь не беспокоиться
-
grey-to-grey намного больше, чем black-to-white, после этого хочется сказать учите матчасть) программно можно получить только частоту обновления а не скорость смены изображения тоесть 16-17мс это как раз 60гц - частота которую мы задали в драйверах видеокарты, и к времени отклика эта цифра никакого отношения не имеетВначале про технологии: Параметры современных ЖК-мониторов(внешка) и про то откуда взялись цифры 2, 4, 6мс: Overdrive для монитора(внешка) Так как сам подолгу сижу за монитором рекомендую мониторы на PVA матрице(типа samsung 970P, 971P...) у самого 970P уже 3 года и нинашто не жалуюсь, были вначале проблемы с плохой интерполяцией, картинка кудато уезжала на разных разрешениях, чернобелые изображения рябили, но подключил через DVI и все прошло, а то я начал грешить на самсунг) так что DVI это обязательно и даже обсуждению не подлежит
-
как очистить буфер стандартного потока ввода cin? while(1) { int i; cin>>i; if (i==0) break; //... } если ввести абракадабру возникает бесконечный цикл, как эту абракадабру одним движением выкинуть из буфера? И еще, как понять сколько символов сейчас в буфере лежат необработанными и по какой причине прекратился ввод(ну там пробел или абракадабра или все данные считаны)