В чем отличие между create(self) и create(application)


Когда использовать Serializer create() и ModelViewset create() perform_create()

Я хочу уточнить данную документацию django-rest-framework относительно создания модельного объекта. До сих пор я обнаружил, что существует три подхода к обработке таких событий.

Метод Serializer create() . Вот документация

Метод ModelViewset create() . Документация

Метод ModelViewset perform_create() . Документация

Эти три подхода важны в зависимости от среды вашего приложения.

Но КОГДА нам нужно использовать каждую функцию create()/perform_create() ?? С другой стороны, я обнаружил, что для одного пост-запроса были вызваны два метода create: modelviewset create() и serializer create() .

Надеюсь, кто-нибудь поделится некоторыми своими знаниями, чтобы объяснить, и это, безусловно, будет очень полезно в моем процессе разработки.

  1. Вы должны использовать create(self, validated_data) чтобы добавить любые дополнительные детали в объект перед сохранением значений И «prod» в каждое поле модели, как это делает **validated_data . В идеале, вы хотите делать эту форму «подталкивания» только в ОДНОМ месте, поэтому метод create в вашем CommentSerializer — лучшее место. Кроме того, вы можете также вызвать внешний apis для создания учетных записей пользователей на их стороне непосредственно перед сохранением ваших учетных записей в вашей собственной базе данных. Вы должны использовать эту функцию create вместе с ModelViewSet . Всегда думай — «Тонкие взгляды, Толстые сериализаторы».

Функция create(self, request, *args, **kwargs) в ModelViewSet определяется в классе CreateModelMixin который является родителем ModelViewSet . Основные функции CreateModelMixin в:

Как вы можете видеть, вышеупомянутая функция create заботится о вызове проверки вашего сериализатора и получении правильного ответа. Прелесть этого в том, что теперь вы можете изолировать логику своего приложения и НЕ беспокоиться о повседневных и повторяющихся вызовах проверки и обработки вывода ответов :). Это работает довольно хорошо в сочетании с create(self, validated_data) найденным в сериализаторе (где может находиться логика вашего конкретного приложения).

В чем отличие между create(self) и create(application)?

Если Вас сильно интересует вопрос, который состоит в следующем: «Как достоверно узнать в чем есть отличие именно между самими Create ( Self ) и также Create ( Application )?», обязательно прочтите данную статью…

Для того, чтобы иметь возможность правильно ответить на поставленный вопрос, необходимо сделать следующее:

Именно сам Self возможно использовано будет

исключительно в методе самого класса, и к тому же, ссылается на действующий экземпляр необходимого класса. Исходя из этого сам

“Self” уже в методе класса под названием TForm1 именно на экземпляр текущий ссылается TForm1.

Когда мы компонент делаем,

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

либо компонента, практически «на автомате» компоненты все «удаляються» самим же владельцем

которого и является она.

Выходит, что когда в процессе творения самой необходимой формы в качестве именно

владельца передать Application — данная форма «на автомате» фактически уничтожена будет при уничтожении необходимом именно

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

Различия между .build, .create и .create! и когда они должны быть использованы?


November 2020

57.4k раз

Так что я видел людей, использующих .build, .create и .create! в своих контроллерах все больше и больше в последнее время. Какая разница от только с помощью .new и passig объект param’d, а затем .save? Есть плюсы и минусы? Есть ли с помощью этих других методов предлагают преимущество?

4 ответы

Я бы второй вышеуказанные ответы. Плюс для create , один не может передать в false качестве аргумента , который вы можете сделать с save . Переходя в false качестве аргумента будет пропускать все рельсы валидации

#create короче версия нового и сохранить. #Создайте! бросает исключение, если проверка не была положительной.

Несмотря на то, что это правильно , что create вызывает new и то save есть большая разница между этими двумя альтернативами в их возвращаемых значений.

Save возвращает либо true или в false зависимости от того, был ли объект успешно сохранен в базе данных или нет. Это может быть использовано для управления потоком , как в первом примере , в приведенном выше вопрос.

Create возвращает модель , независимо от того, был ли сохранен объект или нет. Это имеет значение для кода выше в том , что верхняя ветвь if заявления всегда будет выполняться , даже если объект не удается валидациями и не сохраняется.

При использовании create с разветвлением логики вы подвержены риском немых неудач , которые не в случае , если вы используете new + save .

create! не страдает от той же проблемы, как он поднимает и исключение, если запись недействительна.

create Альтернатива может быть полезной в контроллерах , где respond_with используются API (JSON / XML) ответы. В этом случае наличие ошибок на объекте вызовет ошибки , которые будут возвращены в ответ со статусом unprocessable_entity , который является именно то , что вы хотите от API.

Я всегда использую new + save вариант для HTML, особенно если вы полагаетесь на возвращаемое значение для управления потоком.

Есть несколько различий, но они не большие:

  1. .create эквивалентно .new последующим .save . Это просто более емким.
  2. .create! эквивалентно .new последующим .save! (выдает ошибку , если произошел сбой при сохранении). Это также только чуть — чуть короче
  3. Я думаю , что .build это в основном псевдоним .new . Он работает один путь в Rails 3 и другой путь в Rails has_many и т.д.) , чтобы автоматически связать эти две модели.

В чем отличие между create(self) и create(application)?

Что такое Self — в справке написано, что это вроде как собственник (Owner) объекта. Хотя чем он отличается от Parent — мне не понятно.
Но проблема не в этом.
Проблема в том, что это иногда не работает! Если прогу запускать в Delphi, то он выдаёт ошибку Access Violation (на строчке TStringGrid.Create(Self) ) и показывает CPU Window (вроде так его называют). Если запускать без Delphi, вообще программа завершается без предупреждений и ошибок! Даже try/except не прокатывает, всё равно завершается.

Пришла в голову идея (видимо, на подсознательном уровне ) вместо Self написать nil. Тогда всё заработало! Почему? Чем они отличаются?

Ещё одну деталь хочу добавить к своим показаниям. Не уверен, но это может иметь отношение к делу.
Перед созданием StringGrid’а, в программе есть код, создающий динамический массив A
(array of byte). Опытным путём установлено, что будет строчка
TStringGrid.Create(Self)
работать или нет, зависит от устанавливаемой длины этого массива! Как такое может быть!?

приведи код полностью

.
Procedure TSomeObj.SomeMethod;
.
Begin
TempGr >End;

Интересует SomeObj(создан ли он на момент вызова SomeMethod)

Нашёл ошибку в своём коде.
Но всё равно не понимаю, почему возикает ошибка при создании StringGrid

А если написать for i:=1 to 3 то ошибки не будет
Так какой параметр лучше передавать Self или nil? Чем будет отличаться поведение созданных объектов одним и вторым способом?

Shaggy
Этот код находится в событии FormActivate, форма создаётся автоматически. Поэтому SomeObj существует.

Makarov
Что значит «владеть» ?

Но всё равно не понимаю, почему возикает ошибка при создании StringGrid


SetLength(A, 4);
for i:=1 to 4 do A[i]:= i; //ошибка: нужно for i:=1 to 3

tempGr >
А если написать for i:=1 to 3 то ошибки не будет
Так какой параметр лучше передавать Self или nil? Чем будет отличаться поведение созданных объектов одним и вторым способом?

Судя по всему, устанавливая эту самую длину, ты вылезаешь за его границу и «наступаешь» на адреса других переменных — портишь Self. Вообще же такие ошибки очень не предсказуемы, при одном расположении звезд может отработать без ошибок, ошибка может вывалиться сразу или через полчаса. Как повезет © trainer.

Self — это текущий объект, метод которого выполняется. Аналог С++ -ного this. В данном случае, насколько я понял, это форма. Т.е. ты при создании обекта назначаешь его собственником (Owner) форму. У всех компонентов или их наследников есть (если не nil) собственники — связь Owner/TComponent, отчечающая за «автоматическое» удаление компонентов. При создании компонент помещается в список Components компонента-собственника, при удалении компонента он удаляется из этого списка. Все компоненты из этого списка удаляются при удалении собственника — можно сказать, автоматом.
Если при создании компонета указать ему Owner как nil, то нужно самому удалять этот компонент через Free.

Связь же Parent/TControl приблизительно соответсвует иерархии окон виндоуз. Родитель контрола — это компонент, содержащий окно, являющееся родительским (Parent Window) по отношению к окну дочернего контрола (именно поэтому Рarent — это TWinControl, т.е. контрол с HWND).
Если дочерний контрол не оконный, типа TLabel, то для него VCL «эмулирует» оконное поведение — например, он не может вылезать за пределы окна родительского контрола.
Все дочерние контролы хранятся в списке Controls родительского контрола. Они добавляются/удаляются оттуда при изменении св-ва Parent контрола. Так же как и для Owner/TComponent, все контролы из Controls удаляются при удалении родительского контрола.

В чем отличие между create(self) и create(application)?

procedure TForm1.Button1Click(Sender: TObject);

if not PlayAudioCD(‘D’) then ShowMessage(‘Not an Audio CD’);

Как узнать есть ли у мыши колесико?

Свойство «WheelPresent» глобального обьекта «mouse».

События KeyPress и KeyDown не вызываются для клавиши Tab — как определить, что она была нажата?

На уровне формы клавиша tab обычно обрабатывается Windows. В примере создается обработчик события CM_Dialog для перехвата Dialog keys.

type TForm1 = class(TForm)

procedure CMDialogKey( Var msg: TCMDialogKey ); message CM_DIALOGKEY;

var Form1: TForm1;

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);

if msg.Charcode <> VK_TAB then inherited;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

if Key = VK_TAB then Form1.Caption := ‘Tab Key Down!’;

В чем отличие между Create(Self) и Create(Application)?

Self может быть использовано только в методе класса, и ссылается на текущий экземпляр класса. Таким образом «Self» в методе класса TForm1 ссылается на текущий экземпляр TForm1. При создании компонента Вы передаете его владельца (owner) в конструктор. При уничтожении формы или компонента автоматически уничтожаются и все компоненты владельцем которого она является. Таким образом если при создании формы передать в качестве владельца Application эта форма будет автоматически уничтожена при уничтожении Application. Если же при создании формы передать в качестве владельца другую форму, вновь созданная форма будет автоматически уничтоженн при уничтожении формы-владельца.

Как во время выполнения определить поддерживает ли обьект заданное свойство?

function HasProperty(Obj : TObject; Prop : string) : PPropInfo;

Result := GetPropInfo(Obj.ClassInfo, Prop);

procedure TForm1.Button1Click(Sender: TObject);

p := HasProperty(Button1, ‘Color’);


if p <> nil then SetOrdProp(Button1, p, clRed)

else ShowMessage(‘Button has no color property’);

p := HasProperty(Label1, ‘Color’);

if p <> nil then SetOrdProp(Label1, p, clRed)

else ShowMessage(‘Label has no color property’);

p := HasProperty(Label1.Font, ‘Color’);

if p <> nil then SetOrdProp(Label1.Font.Color, p, clBlue)

else ShowMessage(‘Label.Font has no color property’);

Как при проигрывании музыки с Audio CD показывать сколько прошло минут и секунд?

В примере время выводится по таймеру.

procedure TForm1.Timer1Timer(Sender: TObject);

with MediaPlayer1 do begin

Можно ли рисовать на рамке формы?

Обрабатывайте событие WM_NCPAINT. В примере рамка обводится красной линией толщиной в 1 пиксел.

type TForm1 = class(TForm)

procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPAINT;

var Form1: TForm1;

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);

Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));

OldPen := SelectObject(dc, Pen);

OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));

Rectangle(dc, 0,0, Form1.Width, Form1.Height);

Статьи 1
Советы по Delphi 1
Советы по работе с системой 1
Советы для написания программ-инсталляторов 1
Регистрация программ в меню «Пуск» Windows 95 1
Как программно создать ярлык? 1
Затенить кнопку «Закрыть» в заголовке формы 1
Копирование файлов 1
Как скопировать все файлы вместе с подкаталогами 1
Удаление каталога со всем содержимым 1
Определение системной информации 1
Как проинсталлировать свои шрифты? 2
Вставить какую-нибудь программу внутрь EXE файла 2
Как написать маленький инсталлятор? 2
Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается! 2
Работа с принтером. 2
Система 2
Внешние модули (DLL), нити 6
Советы по работе с реестром. 7
Использование некоторых ключей реестра 7
Работа с реестром в Delphi 1 7
Объект INIFILES — работа с INI файлами. 7
Советы по работе с графикой 8
Разное 9
Глюки 14
Создание редактора карт в стратегиях типа WarCraft 14
Шпаргалка по ресурсам Windows-32 (для Delphi) 18
Стандартная технология доступа к ресурсам 18
Внутренний формат ресурсов Windows 18
Описание формата ресурсов в MS PE COFF. 19
Дамп памяти (взят из PE.TXT) 19
API 20
Программирование на основе Win32 API в Delphi 20
1. Введение 20
2. Существующие решения 20
3. Принципы построения API-библиотеки 20
4. Библиотека WinLite 21
5. Пример программы на основе библиотеки WinLite 23
KOL 23
Состояние проекта KOL 23
FAQ 24
Часто задаваемые вопросы по Borland Delphi 24
Общие вопросы по Delphi и данному FAQ (часть 1) 24
Введение 24
Вопросы общего характера 24
Совместимость 26
Базы данных — Interbase и локальные данные 27
Базы данных — прочие SQL сервера 28
Общие вопросы по Delphi и данному FAQ (часть 2) 29
Базы данных — компоненты и VCL. 29
Компоненты и VCL 31
Общие вопросы по Delphi и данному FAQ (часть 3) 34
Object Pascal и Windows API 34
Разное 37
Полезные хитрости 38
Вопросы по Delphi 1.0 38
Вопросы общего характера 38
Delphi и Visual Basic 39
Базы данных 40
Object Pascal и Windows API 40
Компоненты и VCL 41
Разное 41
Вопросы по Delphi 2.0 41
Что нового в Delphi 2.0 по сравнения с Delphi 1.0? 41
Вопросы общего характера 41
Базы данных 44
Object Pascal и Windows API 44
Разное 44
Вопросы по Delphi 3.0 45
Вопросы общего характера 45
Object Pascal и Windows API 45
Delphi, С++ Builder и базы данных: вопросы и ответы 46
Delphi VCL FAQ 48

Лучшие электронные книги в формате fb2
Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

В чем отличие между create(self) и create(application)?

R.Right := R.Right + StringGrid1.Left;

R.Top := R.Top + StringGrid1.Top;


R.Bottom := R.Bottom + StringGrid1.Top;

ComboBox1.Left := R.Left + 1;

ComboBox1.Top := R.Top + 1;

ComboBox1.Height := (R.Bottom + 1) — R.Top;

Как узнать есть ли в заданном CD-ROM’е Audio CD?

Можно использовать функцию Windows API GetDriveType() чтобы определить является ли дисковод CD-ROM’мом. И функцию API GetVolumeInformation() чтобы проверить VolumeName на равенство ‘Audio CD’.

function IsAudioCD(Drive : char) : bool;

if GetDriveType(PChar(DrivePath)) <> DRIVE_CDROM then exit;

if lStrCmp(PChar(VolumeName),’Audio CD’) = 0 then result := true;

function PlayAudioCD(Drive : char) : bool;

var mp : TMediaPlayer;

if not IsAudioCD(Drive) then exit;

procedure TForm1.Button1Click(Sender: TObject);

if not PlayAudioCD(‘D’) then ShowMessage(‘Not an Audio CD’);

Как узнать есть ли у мыши колесико?

Свойство «WheelPresent» глобального обьекта «mouse».

События KeyPress и KeyDown не вызываются для клавиши Tab — как определить, что она была нажата?

На уровне формы клавиша tab обычно обрабатывается Windows. В примере создается обработчик события CM_Dialog для перехвата Dialog keys.

type TForm1 = class(TForm)

procedure CMDialogKey( Var msg: TCMDialogKey ); message CM_DIALOGKEY;

var Form1: TForm1;

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);

if msg.Charcode <> VK_TAB then inherited;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

if Key = VK_TAB then Form1.Caption := ‘Tab Key Down!’;

В чем отличие между Create(Self) и Create(Application)?

Self может быть использовано только в методе класса, и ссылается на текущий экземпляр класса. Таким образом «Self» в методе класса TForm1 ссылается на текущий экземпляр TForm1. При создании компонента Вы передаете его владельца (owner) в конструктор. При уничтожении формы или компонента автоматически уничтожаются и все компоненты владельцем которого она является. Таким образом если при создании формы передать в качестве владельца Application эта форма будет автоматически уничтожена при уничтожении Application. Если же при создании формы передать в качестве владельца другую форму, вновь созданная форма будет автоматически уничтоженн при уничтожении формы-владельца.


В чём заключается разница между VSL Form и VSL Forms Application?

09.05.2020, 14:47

Есть ли разница между VCL Forms Application и Application?
Мне нужно открыть VCL Forms Application. Для этого нужно выполнить команду главного меню File — New.

Операторы Exit, Close, Application.Terminate в чем разница между ними?
Хочу понять разницу между этими операторами. Например, оператор Application.Terminate выходит из.

В чём заключается разница между компиляцией в P-code и Native-code?
Извините что я такой ламмер, но в чём заключается разница между компиляцией в P-code и.

Разница запуска функция Console Application и VCL Forms Application
Ситуация следующая. Есть устройство подключенное к компу посредством USB и библиотека для работы с.

В чем заключается разница между локальной и удаленной БД?
можете в трех словах объяснить про удаленную бд по сравнению с обычной, например вот у нас идет бд.

Delphi 7 — Когда использовать .create (Application) и когда использовать .create (nil)?

В последнее время я читал много вещей, но не нашел окончательного ответа.
Так, например, если я пишу:

ПРИМЕНЕНИЕ должно нести ответственность за освобождение от формы права памяти?
почему тогда люди обычно делают следующим образом:

??
В некоторых местах вы видели, что если вы попытаетесь «освободить» объект, который уже был освобожден, вы получите сообщение EAccessviolation, но, как я проверял, это не всегда так.

Так что ПОЖАЛУЙСТА, как это на самом деле работает?
Эта вещь EAccessviolation сводит меня с ума, как я могу полностью понять эту вещь? где я нахожу эту ценную информацию! ??

Создан 24 апр. 15 2015-04-24 02:36:12 Cristian Trein

В этом коде нет двойного доступа. Когда форма освобождается, она вызывает своего владельца (приложение), чтобы приложение могло удалить его из своего списка для уничтожения компонентов. – Sertac Akyuz 24 апр. 15 2015-04-24 03:15:00

Подождите, не является ли целью бесплатного метода проверить, существует ли объект и только потом вызывает деструктор объектов по умолчанию? Я знаю, что вызывающий объект-деструктор напрямую будет всегда вызывать EAccesViolation, если объекты больше не существуют или еще не созданы. – SilverWarior 24 апр. 15 2015-04-24 06:20:47

@Silver В коде Q Free и Destroy взаимозаменяемы, потому что в Form1.Free Form1 не может быть nil. Предполагая, что никакая другая сторона не закручивает этот var. Предположение, которое трудно сделать, если вы выполняете режим совместимости VB Delphi IDE и делаете Form1 глобальным var. – David Heffernan 24 апр. 15 2015-04-24 06:26:25

@DavidHeffernan Я знаю, что в коде, который показан в вопросе, Form1 не может быть nill в то время. Но я прошу в общем, потому что я всегда назначаю владельца каждой Форме, которую я создаю, даже если я планирую уничтожить эту форму позже на своем пути, прежде чем уничтожить ее владельца. И до сих пор в этом случае я никогда не получал EAccesViolation, когда владелец пытался уничтожить уже несуществующую форму. Поэтому я просто хочу знать, приемлемый подход или нет. – SilverWarior 24 апр. 15 2015-04-24 06:35:54

@silver мой совет никогда не назначает владельца – David Heffernan 24 апр. 15 2015-04-24 06:37:07

@DavidHeffernan ум говорит мне, почему? – SilverWarior 24 апр. 15 2015-04-24 06:37:59

@ Сильвер для формы, владелец, как правило, бессмыслен. Явное разрушение позволяет вам контролировать, когда это произойдет. Например, модальная форма может быть показана много раз. Каждый раз, когда каждый новый экземпляр имеет основную форму, у вас есть утечка. – David Heffernan 24 апр. 15 2015-04-24 06:51:45

@DavidHeffernan Я не согласен с тем, что для владельца формы бессмысленно. Например, в следующем сценарии он может быть Достаточно полезен. Представьте, что у вас есть вторая форма, которая позволяет вам, например, выбрать какой-либо продукт из списка. Затем вы можете захотеть предоставить некоторую дополнительную информацию об этом продукте на demmand в третьей форме. Поэтому, если позже вы решите закрыть форму seconf, вы, вероятно, захотите закрыть/уничтожить третью форму, так как показ ее в одиночку будет только путаницей, потому что вы не узнаете, к какому продукту принадлежат эти дополнительные данные. – SilverWarior 24 апр. 15 2015-04-24 07:15:41

@DavidHeffernan Да, вы могли бы изменить вторую форму OnClose, чтобы вызвать действие Close для третьего, но вы можете достичь того же, просто указав вторую форму, чтобы быть владельцем третьей формы при ее создании. – SilverWarior 24 апр. 15 2015-04-24 07:17:07

@Silver Передайте эту информацию в параметр. Не связывайте это с владением компонентом, несвязанной вещью. – David Heffernan 24 апр. 15 2015-04-24 07:23:43

@silver Владелец в порядке, если вам нужен принадлежащий ему компонент, чтобы он жил точно столько же, сколько принадлежащий ему компонент. Идеально подходит для большинства компонентов на форме. Но для самих форм, которые часто не то, что вы хотите. – David Heffernan 24 апр. 15 2015-04-24 07:52:46

@DavidHeffernan Передайте эту информацию как параметр? Какую информацию вы имеете в виду и откуда и где. – SilverWarior 24 апр. 15 2015-04-24 08:14:30

@ Сильвер ОК, я неправильно понял. Конечно, если вы не хотите хранить ссылку на другую форму, и вы хотите, чтобы ее уничтожали всякий раз, когда первая форма была уничтожена, владелец в порядке. – David Heffernan 24 апр. 15 2015-04-24 08:17:30


@SilverWarior В моем ответе, который покрывается * Собственность между формами разумна, например, для основной формы и немодального родственника, который живет до тех пор, пока основная форма. Безмозглый вид может принадлежать основной форме, а затем автоматически уничтожается при уничтожении основной формы. * – David Heffernan 24 апр. 15 2015-04-24 08:23:19

2 ответа

Задача компонента Owner — уничтожить все принадлежащие ему компоненты, когда вы уничтожаете владельца.

Объект Application уничтожается после прекращения действия, поэтому, если вы полагаетесь на него, чтобы уничтожить свою форму, это произойдет не до окончания.

Ключевым моментом здесь является назначение владельца контролирует как , который уничтожает принадлежащий компонент, но и когда он будет уничтожен.

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

Нет смысла давать им владельца, так как вы явно уничтожаете его. И убедитесь, что Form является локальной переменной.

Это не повредит, особенно если вы передали владельцу. Это было бы просто расточительно, поскольку владелец был уведомлен о своей ответственности, а затем уведомлен о том, что он больше не несет ответственности.

Но если вы сделали это:

, то каждый раз, когда вы показали модальную форму вы бы просочиться формой, которая не будет уничтожена, пока форма владеющей не была уничтожена. Если вы сделали Application принадлежащим, модальные формы будут просачиваться до завершения.

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

Но если в основной форме содержится ссылка на немодальную форму, я бы, скорее всего, просто ее не знал и явно уничтожил из деструктора основной формы.

@ dummzeuch дает хорошее представление о том, что если вы установили Position в poOwnerFormCenter , тогда структура ожидает, что вы предоставите форму владельцу. На мой взгляд, это плохой дизайн, который сочетает управление жизненным циклом с визуальным расположением. Но это дизайн, поэтому вы вынуждены соглашаться с ним. Тем не менее, вам не удастся полностью уничтожить принадлежащий вам компонент. Вы можете сделать это:

Когда вы уничтожаете форму, его владелец получает уведомление, и разрушенная форма удаляется список владельца находящихся в собственности компонентов.

Основная форма сама по себе интересна. Он должен принадлежать Application , так как основная форма должна быть создана по телефону Application.CreateForm . Это единственный раз, когда вы должны позвонить Application.CreateForm . И основная форма, как правило, является единственной формой, которую вы должны были иметь Application . Особенно, если вы принимаете политику отсутствия других форм или владеете формами, которые порождают их.

Но если вы позволите уничтожить основную форму при прекращении, когда уничтожается Application , вы можете поймать пчелы. Я столкнулся с прерывистыми ошибками во время выполнения при кодировании таким образом. Мое средство состоит в том, чтобы явно уничтожить основную форму как окончательный акт основного файла .dpr. То есть, уничтожить главную форму после Application.Run возвращается.

Создан 24 апр. 15 2015-04-24 06:49:45 David Heffernan

Есть еще одна проблема, о которой никто еще не упомянул: TForm.Position позволяет указать, где будет размещаться форма при ее открытии. Он имеет одно возможное значение poOwnerFormCenter, которое предположительно центрирует форму в форме владельца. Если вы передадите NIL, это невозможно. Но что он делает, если вы передаете приложение? – dummzeuch 24 апр. 15 2015-04-24 07:50:39

Использует ‘TCustomForm (Owner)’, если ‘Owner является TCustomForm’, иначе он использует’ Application.MainForm’. – David Heffernan 24 апр. 15 2015-04-24 08:00:39

@DavidHeffernan В проекте, с которым я работаю, я использовал ‘Приложение.CreateForm’ для модуля данных. После того, как я увидел ваше сообщение, я попытался изменить его в соответствии с вашим примером, и я получил новое исключение Eaccessviolation. Какие-нибудь догадки почему? – Cristian Trein 24 апр. 15 2015-04-24 15:09:37

ОК, модули данных скорее выходят за рамки моей компетенции. Я никогда их не использую, не совсем мой стиль. Однако я считаю, что вы должны иметь возможность создавать модули данных без использования ‘CreateForm’. Однако, как правило, вам нужен модуль данных, потому что вы предоставляете его глобально всем и каждому. Поэтому, возможно, если вы использовали локальную переменную для dm, а не глобальную переменную, у вас возникли бы проблемы. Во всяком случае, мне немного сложно сказать отсюда, не видя больше. – David Heffernan 24 апр. 15 2015-04-24 15:13:36

@DavidHeffernan Ну, сэр, теперь мне любопытно. Я знаю, что полное объяснение будет обширным, но, в общем, что вы тогда используете? Имея так много проблем с этой проблемой Eaccessviolation в последнее время, что в моих новых проектах я хочу, чтобы глобальные переменные были как можно меньше, точно oposite от dm . – Cristian Trein 24 апр. 15 2015-04-24 16:13:00

Множество причин нарушений доступа. Возможно, это не вызвано тем, что, по вашему мнению, вызвано? Я лично не использую модули данных, потому что считаю их довольно плохой формой дизайна. Поощряет много муфт и делает его трудно слоем. – David Heffernan 24 апр. 15 2015-04-24 16:17:44

Модули данных — это другое исключение для глобальных созданных IDE переменных и форм автосоздания, особенно когда к ним требуется доступ к данным из основной формы. В этом случае оставьте глобальную переменную для datamodule и используйте Project-> Options-> Forms, чтобы перенести datamodule над основной формой в список Auto-create. Datamodules не могут быть основной формой, поэтому безопасно создавать их в первую очередь. – Ken White 24 апр. 15 2015-04-24 23:55:03

  • Если вы собираетесь освободить его самостоятельно, используйте nil в качестве владельца.
  • Если вы не собираетесь самостоятельно его освобождать, назначьте владельца, который возьмет на себя ответственность за его освобождение.

Так что, если ваш код что-то вроде этого:


Вы должны написать его с nil в качестве владельца, и защитить его в try..finally блоке:

Если, с другой стороны, вы собираетесь оставить его на некоторое время, назначьте владельца, который может позаботиться о его освобождении позже:

Ни один из этих методов не приведет к нарушению доступа, если это сделано так, как я показал здесь. Обратите внимание, что в обоих случаях я не использовал переменную Form2 с >Form1 или того, что вы называете им, который представляет основную форму, которая должна быть автоматически создана и принадлежит Приложению). Помимо var для основной формы, я всегда удаляю автоматически сгенерированную переменную и никогда не создаю ничего, кроме, возможно, datamodule (который может быть автоматически вызван перед основной формой без каких-либо проблем, поскольку datamodule не может быть основной формой).

Создан 24 апр. 15 2015-04-24 03:12:31 Ken White

Кен вы можете расширить свой ответ? Я хотел бы знать, почему вы не предпочитаете автоматически сгенерированные/IDE-сгенерированные переменные? – user1593881 24 апр. 15 2015-04-24 05:51:48

В контексте управления памятью использование приложения в качестве владельца бессмысленно. Владелец освобождает принадлежащие ему объекты, когда он уничтожен, и поскольку объект приложения будет уничтожен, когда программа выйдет, в том смысле, что у вас все еще есть утечка памяти. Когда программа выйдет, вся память будет освобождена в любом случае, поэтому использование приложения в качестве владельца не имеет значения. – ain 24 апр. 15 2015-04-24 06:08:30

Все уже сказано «назначьте владельца, который возьмет на себя ответственность за его освобождение». – Sir Rufo 24 апр. 15 2015-04-24 06:12:30

Уходящие формы, принадлежащие Приложению, могут привести к утечкам, как сказал @ain. – David Heffernan 24 апр. 15 2015-04-24 07:03:19

@RawN: Имена сгенерированных переменных IDE являются глобальными, чего всегда следует избегать. Глобальные переменные могут вызывать всевозможные проблемы, например, заставить вас получить доступ к чему-то, чего вы не намеревались, освободить то, что вы не хотели освобождать, или думать, что вы освободили то, чего вы не сделали. Переменные области должны быть как можно более ограниченными, а глобальные переменные почти всегда являются ужасной идеей. Из-за того, как работают приложения Delphi, требуется, чтобы основная форма была автоматически создана и глобальна. Я удаляю остальных по вышеуказанным причинам. – Ken White 24 апр. 15 2015-04-24 12:32:24

@KenWhite: Я согласен. Я удаляю переменные форматированной формы, как только создает их IDE. В противном случае я нахожу, что некоторые из моих разработчиков используют их из других форм для доступа к элементам управления внутри! Кроме того, если вы разрешаете несколько копий формы, то одна переменная не поможет. – Rohit Gupta 28 апр. 15 2015-04-28 13:25:19

Различия между .build, .create и .create! и когда они должны быть использованы?

November 2020

57.4k раз

Так что я видел людей, использующих .build, .create и .create! в своих контроллерах все больше и больше в последнее время. Какая разница от только с помощью .new и passig объект param’d, а затем .save? Есть плюсы и минусы? Есть ли с помощью этих других методов предлагают преимущество?

4 ответы

Я бы второй вышеуказанные ответы. Плюс для create , один не может передать в false качестве аргумента , который вы можете сделать с save . Переходя в false качестве аргумента будет пропускать все рельсы валидации

#create короче версия нового и сохранить. #Создайте! бросает исключение, если проверка не была положительной.

Несмотря на то, что это правильно , что create вызывает new и то save есть большая разница между этими двумя альтернативами в их возвращаемых значений.

Save возвращает либо true или в false зависимости от того, был ли объект успешно сохранен в базе данных или нет. Это может быть использовано для управления потоком , как в первом примере , в приведенном выше вопрос.

Create возвращает модель , независимо от того, был ли сохранен объект или нет. Это имеет значение для кода выше в том , что верхняя ветвь if заявления всегда будет выполняться , даже если объект не удается валидациями и не сохраняется.

При использовании create с разветвлением логики вы подвержены риском немых неудач , которые не в случае , если вы используете new + save .

create! не страдает от той же проблемы, как он поднимает и исключение, если запись недействительна.

create Альтернатива может быть полезной в контроллерах , где respond_with используются API (JSON / XML) ответы. В этом случае наличие ошибок на объекте вызовет ошибки , которые будут возвращены в ответ со статусом unprocessable_entity , который является именно то , что вы хотите от API.

Я всегда использую new + save вариант для HTML, особенно если вы полагаетесь на возвращаемое значение для управления потоком.

Есть несколько различий, но они не большие:

  1. .create эквивалентно .new последующим .save . Это просто более емким.
  2. .create! эквивалентно .new последующим .save! (выдает ошибку , если произошел сбой при сохранении). Это также только чуть — чуть короче
  3. Я думаю , что .build это в основном псевдоним .new . Он работает один путь в Rails 3 и другой путь в Rails has_many и т.д.) , чтобы автоматически связать эти две модели.


Delphi 7 — Когда использовать .create (Application) и когда использовать .create (nil)?

В последнее время я читал много вещей, но не нашел окончательного ответа.
Так, например, если я пишу:

ПРИМЕНЕНИЕ должно нести ответственность за освобождение от формы права памяти?
почему тогда люди обычно делают следующим образом:

??
В некоторых местах вы видели, что если вы попытаетесь «освободить» объект, который уже был освобожден, вы получите сообщение EAccessviolation, но, как я проверял, это не всегда так.

Так что ПОЖАЛУЙСТА, как это на самом деле работает?
Эта вещь EAccessviolation сводит меня с ума, как я могу полностью понять эту вещь? где я нахожу эту ценную информацию! ??

Создан 24 апр. 15 2015-04-24 02:36:12 Cristian Trein

В этом коде нет двойного доступа. Когда форма освобождается, она вызывает своего владельца (приложение), чтобы приложение могло удалить его из своего списка для уничтожения компонентов. – Sertac Akyuz 24 апр. 15 2015-04-24 03:15:00

Подождите, не является ли целью бесплатного метода проверить, существует ли объект и только потом вызывает деструктор объектов по умолчанию? Я знаю, что вызывающий объект-деструктор напрямую будет всегда вызывать EAccesViolation, если объекты больше не существуют или еще не созданы. – SilverWarior 24 апр. 15 2015-04-24 06:20:47

@Silver В коде Q Free и Destroy взаимозаменяемы, потому что в Form1.Free Form1 не может быть nil. Предполагая, что никакая другая сторона не закручивает этот var. Предположение, которое трудно сделать, если вы выполняете режим совместимости VB Delphi IDE и делаете Form1 глобальным var. – David Heffernan 24 апр. 15 2015-04-24 06:26:25

@DavidHeffernan Я знаю, что в коде, который показан в вопросе, Form1 не может быть nill в то время. Но я прошу в общем, потому что я всегда назначаю владельца каждой Форме, которую я создаю, даже если я планирую уничтожить эту форму позже на своем пути, прежде чем уничтожить ее владельца. И до сих пор в этом случае я никогда не получал EAccesViolation, когда владелец пытался уничтожить уже несуществующую форму. Поэтому я просто хочу знать, приемлемый подход или нет. – SilverWarior 24 апр. 15 2015-04-24 06:35:54

@silver мой совет никогда не назначает владельца – David Heffernan 24 апр. 15 2015-04-24 06:37:07

@DavidHeffernan ум говорит мне, почему? – SilverWarior 24 апр. 15 2015-04-24 06:37:59

@ Сильвер для формы, владелец, как правило, бессмыслен. Явное разрушение позволяет вам контролировать, когда это произойдет. Например, модальная форма может быть показана много раз. Каждый раз, когда каждый новый экземпляр имеет основную форму, у вас есть утечка. – David Heffernan 24 апр. 15 2015-04-24 06:51:45

@DavidHeffernan Я не согласен с тем, что для владельца формы бессмысленно. Например, в следующем сценарии он может быть Достаточно полезен. Представьте, что у вас есть вторая форма, которая позволяет вам, например, выбрать какой-либо продукт из списка. Затем вы можете захотеть предоставить некоторую дополнительную информацию об этом продукте на demmand в третьей форме. Поэтому, если позже вы решите закрыть форму seconf, вы, вероятно, захотите закрыть/уничтожить третью форму, так как показ ее в одиночку будет только путаницей, потому что вы не узнаете, к какому продукту принадлежат эти дополнительные данные. – SilverWarior 24 апр. 15 2015-04-24 07:15:41

@DavidHeffernan Да, вы могли бы изменить вторую форму OnClose, чтобы вызвать действие Close для третьего, но вы можете достичь того же, просто указав вторую форму, чтобы быть владельцем третьей формы при ее создании. – SilverWarior 24 апр. 15 2015-04-24 07:17:07

@Silver Передайте эту информацию в параметр. Не связывайте это с владением компонентом, несвязанной вещью. – David Heffernan 24 апр. 15 2015-04-24 07:23:43

@silver Владелец в порядке, если вам нужен принадлежащий ему компонент, чтобы он жил точно столько же, сколько принадлежащий ему компонент. Идеально подходит для большинства компонентов на форме. Но для самих форм, которые часто не то, что вы хотите. – David Heffernan 24 апр. 15 2015-04-24 07:52:46

@DavidHeffernan Передайте эту информацию как параметр? Какую информацию вы имеете в виду и откуда и где. – SilverWarior 24 апр. 15 2015-04-24 08:14:30

@ Сильвер ОК, я неправильно понял. Конечно, если вы не хотите хранить ссылку на другую форму, и вы хотите, чтобы ее уничтожали всякий раз, когда первая форма была уничтожена, владелец в порядке. – David Heffernan 24 апр. 15 2015-04-24 08:17:30

@SilverWarior В моем ответе, который покрывается * Собственность между формами разумна, например, для основной формы и немодального родственника, который живет до тех пор, пока основная форма. Безмозглый вид может принадлежать основной форме, а затем автоматически уничтожается при уничтожении основной формы. * – David Heffernan 24 апр. 15 2015-04-24 08:23:19

2 ответа

Задача компонента Owner — уничтожить все принадлежащие ему компоненты, когда вы уничтожаете владельца.

Объект Application уничтожается после прекращения действия, поэтому, если вы полагаетесь на него, чтобы уничтожить свою форму, это произойдет не до окончания.

Ключевым моментом здесь является назначение владельца контролирует как , который уничтожает принадлежащий компонент, но и когда он будет уничтожен.

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

Нет смысла давать им владельца, так как вы явно уничтожаете его. И убедитесь, что Form является локальной переменной.

Это не повредит, особенно если вы передали владельцу. Это было бы просто расточительно, поскольку владелец был уведомлен о своей ответственности, а затем уведомлен о том, что он больше не несет ответственности.


Но если вы сделали это:

, то каждый раз, когда вы показали модальную форму вы бы просочиться формой, которая не будет уничтожена, пока форма владеющей не была уничтожена. Если вы сделали Application принадлежащим, модальные формы будут просачиваться до завершения.

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

Но если в основной форме содержится ссылка на немодальную форму, я бы, скорее всего, просто ее не знал и явно уничтожил из деструктора основной формы.

@ dummzeuch дает хорошее представление о том, что если вы установили Position в poOwnerFormCenter , тогда структура ожидает, что вы предоставите форму владельцу. На мой взгляд, это плохой дизайн, который сочетает управление жизненным циклом с визуальным расположением. Но это дизайн, поэтому вы вынуждены соглашаться с ним. Тем не менее, вам не удастся полностью уничтожить принадлежащий вам компонент. Вы можете сделать это:

Когда вы уничтожаете форму, его владелец получает уведомление, и разрушенная форма удаляется список владельца находящихся в собственности компонентов.

Основная форма сама по себе интересна. Он должен принадлежать Application , так как основная форма должна быть создана по телефону Application.CreateForm . Это единственный раз, когда вы должны позвонить Application.CreateForm . И основная форма, как правило, является единственной формой, которую вы должны были иметь Application . Особенно, если вы принимаете политику отсутствия других форм или владеете формами, которые порождают их.

Но если вы позволите уничтожить основную форму при прекращении, когда уничтожается Application , вы можете поймать пчелы. Я столкнулся с прерывистыми ошибками во время выполнения при кодировании таким образом. Мое средство состоит в том, чтобы явно уничтожить основную форму как окончательный акт основного файла .dpr. То есть, уничтожить главную форму после Application.Run возвращается.

Создан 24 апр. 15 2015-04-24 06:49:45 David Heffernan

Есть еще одна проблема, о которой никто еще не упомянул: TForm.Position позволяет указать, где будет размещаться форма при ее открытии. Он имеет одно возможное значение poOwnerFormCenter, которое предположительно центрирует форму в форме владельца. Если вы передадите NIL, это невозможно. Но что он делает, если вы передаете приложение? – dummzeuch 24 апр. 15 2015-04-24 07:50:39

Использует ‘TCustomForm (Owner)’, если ‘Owner является TCustomForm’, иначе он использует’ Application.MainForm’. – David Heffernan 24 апр. 15 2015-04-24 08:00:39

@DavidHeffernan В проекте, с которым я работаю, я использовал ‘Приложение.CreateForm’ для модуля данных. После того, как я увидел ваше сообщение, я попытался изменить его в соответствии с вашим примером, и я получил новое исключение Eaccessviolation. Какие-нибудь догадки почему? – Cristian Trein 24 апр. 15 2015-04-24 15:09:37

ОК, модули данных скорее выходят за рамки моей компетенции. Я никогда их не использую, не совсем мой стиль. Однако я считаю, что вы должны иметь возможность создавать модули данных без использования ‘CreateForm’. Однако, как правило, вам нужен модуль данных, потому что вы предоставляете его глобально всем и каждому. Поэтому, возможно, если вы использовали локальную переменную для dm, а не глобальную переменную, у вас возникли бы проблемы. Во всяком случае, мне немного сложно сказать отсюда, не видя больше. – David Heffernan 24 апр. 15 2015-04-24 15:13:36

@DavidHeffernan Ну, сэр, теперь мне любопытно. Я знаю, что полное объяснение будет обширным, но, в общем, что вы тогда используете? Имея так много проблем с этой проблемой Eaccessviolation в последнее время, что в моих новых проектах я хочу, чтобы глобальные переменные были как можно меньше, точно oposite от dm . – Cristian Trein 24 апр. 15 2015-04-24 16:13:00

Множество причин нарушений доступа. Возможно, это не вызвано тем, что, по вашему мнению, вызвано? Я лично не использую модули данных, потому что считаю их довольно плохой формой дизайна. Поощряет много муфт и делает его трудно слоем. – David Heffernan 24 апр. 15 2015-04-24 16:17:44

Модули данных — это другое исключение для глобальных созданных IDE переменных и форм автосоздания, особенно когда к ним требуется доступ к данным из основной формы. В этом случае оставьте глобальную переменную для datamodule и используйте Project-> Options-> Forms, чтобы перенести datamodule над основной формой в список Auto-create. Datamodules не могут быть основной формой, поэтому безопасно создавать их в первую очередь. – Ken White 24 апр. 15 2015-04-24 23:55:03

  • Если вы собираетесь освободить его самостоятельно, используйте nil в качестве владельца.
  • Если вы не собираетесь самостоятельно его освобождать, назначьте владельца, который возьмет на себя ответственность за его освобождение.

Так что, если ваш код что-то вроде этого:

Вы должны написать его с nil в качестве владельца, и защитить его в try..finally блоке:

Если, с другой стороны, вы собираетесь оставить его на некоторое время, назначьте владельца, который может позаботиться о его освобождении позже:

Ни один из этих методов не приведет к нарушению доступа, если это сделано так, как я показал здесь. Обратите внимание, что в обоих случаях я не использовал переменную Form2 с >Form1 или того, что вы называете им, который представляет основную форму, которая должна быть автоматически создана и принадлежит Приложению). Помимо var для основной формы, я всегда удаляю автоматически сгенерированную переменную и никогда не создаю ничего, кроме, возможно, datamodule (который может быть автоматически вызван перед основной формой без каких-либо проблем, поскольку datamodule не может быть основной формой).

Создан 24 апр. 15 2015-04-24 03:12:31 Ken White

Кен вы можете расширить свой ответ? Я хотел бы знать, почему вы не предпочитаете автоматически сгенерированные/IDE-сгенерированные переменные? – user1593881 24 апр. 15 2015-04-24 05:51:48

В контексте управления памятью использование приложения в качестве владельца бессмысленно. Владелец освобождает принадлежащие ему объекты, когда он уничтожен, и поскольку объект приложения будет уничтожен, когда программа выйдет, в том смысле, что у вас все еще есть утечка памяти. Когда программа выйдет, вся память будет освобождена в любом случае, поэтому использование приложения в качестве владельца не имеет значения. – ain 24 апр. 15 2015-04-24 06:08:30

Все уже сказано «назначьте владельца, который возьмет на себя ответственность за его освобождение». – Sir Rufo 24 апр. 15 2015-04-24 06:12:30

Уходящие формы, принадлежащие Приложению, могут привести к утечкам, как сказал @ain. – David Heffernan 24 апр. 15 2015-04-24 07:03:19

@RawN: Имена сгенерированных переменных IDE являются глобальными, чего всегда следует избегать. Глобальные переменные могут вызывать всевозможные проблемы, например, заставить вас получить доступ к чему-то, чего вы не намеревались, освободить то, что вы не хотели освобождать, или думать, что вы освободили то, чего вы не сделали. Переменные области должны быть как можно более ограниченными, а глобальные переменные почти всегда являются ужасной идеей. Из-за того, как работают приложения Delphi, требуется, чтобы основная форма была автоматически создана и глобальна. Я удаляю остальных по вышеуказанным причинам. – Ken White 24 апр. 15 2015-04-24 12:32:24

@KenWhite: Я согласен. Я удаляю переменные форматированной формы, как только создает их IDE. В противном случае я нахожу, что некоторые из моих разработчиков используют их из других форм для доступа к элементам управления внутри! Кроме того, если вы разрешаете несколько копий формы, то одна переменная не поможет. – Rohit Gupta 28 апр. 15 2015-04-28 13:25:19

Илон Маск рекомендует:  $Z - Директива компилятора Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL