Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2009, 17:37   #1
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию Инкапсуляция

Иногда, при работе с несколькими формами, нужно чтобы одна форма вернула какой-то результат.
Например чат: нужно забанить плохого юзверя.
Выбираем из списка пользователей нужного, жмем "Бан" и нам показывается окошко, где нас прося ввести (например) кол-во минут бана.
Раньше я делал вот так:
Form1 - главная,
Form2 - подчиненная.
Код:

unit Form2;
...
public
  m_banTime: Integer;
Код:
unit Form1;
...
Form2.ShowModal;
banTime := Form2.m_banTime;
Такая реализация не подходит для ООП, т.к. мы знаем имя переменной. Следовательно для сохранения хорошего стиля нужно что то другое.
Потом думал сделать через свойства, но от этого я отказался, мне этот способ не понравился.

И вот, недавно, додумался. Идея банальна...
Код:
unit Form2;
...
private
  m_banTime: Integer;
public
  function GetBanTime: Integer;

function TForm2.GetBanTime: Integer;
begin
  Result := 0;
  Self.ShowModal;
  Result := m_banTime;
end;

// Например в кнопке Ok
procedure TForm2.Button1Click(Sender: TObject);
begin
  if Edit1.Text <> '' then
    m_banTime := StrToInt(Edit1.Text);
  Close;
end;
и
Код:
unit Form1;
...
banTime := Form2.GetBanTime;
Таким образом, мы получаем одну строку кода для получения в главной форме времени бана и полностью инкапсулируем метод, который можно использовать везде где только возможно... И не только.
Это всего лишь пример и поэтому без дополнительных проверок ни ногой.

P.S. Писал прямо сюда, возможны ошибки.
psycho-coder вне форума Ответить с цитированием
Старый 13.08.2009, 18:27   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Собственно не уловил, вопрос или тема для обсуждения? Возникла проблема или Вам просто интересно мнение других по данному примеру?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.08.2009, 18:32   #3
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Просто поделился )))
psycho-coder вне форума Ответить с цитированием
Старый 13.08.2009, 22:46   #4
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Предпочитаю такую инкапсуляцию:
Код:
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    m_banTime: Integer;
  public
    class function GetBanTime: Integer;
  end;

// var  Form2: TForm2; удаляем за ненадобностью
// не забываем удалять Application.CreateForm(TForm2, Form2); из .dpr

implementation

{$R *.dfm}

{ TForm2 }

class function TForm2.GetBanTime: Integer;
var
  form: TForm2;
begin
  form := Self.Create(nil);
  try
    form.ShowModal;
    // ...
    Result := form.m_banTime;
  finally
    form.Free;
  end;
end;

end.
Работает действительно в одну строку
Код:
banTime := TForm2.GetBanTime;
А строка
Код:
form := Self.Create(nil);
позволяет создавать наследников:
если
Код:
TForm3 = class(TForm2)
то
Код:
banTime := TForm3.GetBanTime;
тоже будет работать
s.Creator вне форума Ответить с цитированием
Старый 14.08.2009, 13:04   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Может тему прикрепить? Как думают модераторы?
psycho-coder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инкапсуляция пакетов TCP/IP bumerung Общие вопросы C/C++ 2 06.06.2009 23:19
ООП инкапсуляция albatros Общие вопросы Delphi 2 03.02.2009 08:28
Инкапсуляция Lyxor Общие вопросы Delphi 0 29.06.2008 13:06