Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизКак принято Найти похожие ветки
← →
Makhanev A.S. (2003-12-14 01:48) [0]Программа поделена на функциональные модули, каждый из которых не зависит от другого. Но каждый так или иначе завязан с визуальными контролами.
Сделал тестовые приложения, теперь нужно превратить эти модули (не pas, а в широком смысле слова) в кирпичики проекта.
К примеру, модуль пишет что-то в DataSet и выводит в Memo.
Как принято делать?
Мне на ум приходит только мысль с созданием отдельных компонентов со свойствами для стыковки с другими компонентами:
property DataSet...
property Memo...
Какие есть еще варианты?
← →
Юрий Зотов (2003-12-14 06:54) [1]IMHO, нормальный вариант. Только не забудьте об очистке ссылки на внешний компонент при его удалении (Notification, FreeNotification ...).
Но не обязательно делать связки именно компонентами - можно сделать их, например, и в виде обычных процедур или некомпонентских классов. Все зависит от конкретных условий. IMHO, компоненты однозначно стоит делать, когда нужно добиться технологии "положил на форму - заработало", или когда используется визуальное наследование форм.
← →
Makhanev A.S. (2003-12-14 13:51) [2]
> Юрий Зотов © (14.12.03 06:54) [1]
Спасибо за ответ.
В тот же день меня осенило, что можно и просто в классы обернуть без компонентов:)
← →
Юрий Зотов (2003-12-14 13:59) [3]> Makhanev A.S. © (14.12.03 13:51) [2]
Тогда тем более не забудьте предусмотреть механизм очистки ссылки на внешний компонент при его удалении. Потому что у обычных классов Notification и FreeNotification нет, придется делать какой-то свой аналог.
← →
Romkin (2003-12-14 14:00) [4]А следующий шаг - обергнуть в интерфейсы и сделать на СОМ технологии. И это будет максимально гибко: кирпичиком сможет быть и библиотека, и отдельное приложение. Достаточно посмотреть на MS Office
← →
Юрий Федоров (2003-12-14 14:31) [5]>>Romkin © (14.12.03 14:00) [4]
СОМ умер.
MS его похоронили.
наверно зря ((
← →
me (2003-12-14 17:56) [6]> Юрий Федоров © (14.12.03 14:31) [5]
Никто и не думает умирать. .NET замечательно поддерживает и создание СОМ компонентов, и их использование, причем очень легко и естественно. Даже закрадывается мысль, нет ли там в самом фундаменте .NET-а самого СОМ-а
← →
Vuk (2003-12-14 18:00) [7]to me (14.12.03 17:56) [6]
>Никто и не думает умирать. .NET замечательно поддерживает и
>создание СОМ компонентов
Правда, вот, в MS говорят, что про COM можно забыть.
>Даже закрадывается мысль, нет ли там в самом фундаменте .NET-а
>самого СОМ-а
Нет.
← →
Makhanev A.S. (2003-12-14 18:09) [8]
> Юрий Зотов © (14.12.03 13:59) [3]
Еще раз спасибо.
Я почитал, подумал.. Если несложно, оцените правильность нижеследующей реализации примера.
Итак, MyComp - компонент с свойством типа TButton:
unit MyComp;
interface
uses
Windows, Messages, SysUtils, Classes, StdCtrls;
type
TMyComponent = class(TComponent)
private
{ Private declarations }
FButton: TButton;
procedure SetButton(AButton: TButton);
protected
{ Protected declarations }
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
public
{ Public declarations }
procedure MakingSmthWithButton;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property Button: TButton read FButton write SetButton;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("System", [TMyComponent]);
end;
{ TMyComponent }
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FButton := nil;
end;
destructor TMyComponent.Destroy;
begin
FButton := nil;
inherited;
end;
procedure TMyComponent.MakingSmthWithButton;
var
i: Integer;
begin
if FButton <> nil then
begin
...
for i := 0 to 100 do
if FButton <> nil then //на всякий случай проверяем каждый раз - или есть метод получше?
FButton.Caption := ...
else
Break;
end;
end;
procedure TMyComponent.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if Operation = opInsert then
begin
if (AComponent is TButton) and not Assigned(FButton) then
begin
FButton := AComponent as TButton;
end;
end;
if Operation = opRemove then
begin
if AComponent = FButton then
FButton := nil;
end;
end;
procedure TMyComponent.SetButton(AButton: TButton);
begin
if FButton <> AButton then
begin
FButton := AButton;
if FButton <> nil then
FButton.FreeNotification(Self);
end;
end;
end.
← →
Юрий Зотов (2003-12-14 18:58) [9]1. Конструктор и деструктор не нужны. Сразу после создания FButton и так будет nil (за счет InitInstance), поэтому конструктор ничего полезного не делает. Очищать собственные поля перед собственным удалением тоже незачем, поэтому и деструктор ничего полезного не делает.
2. В MakingSmthWithButton - если в самом начале проверка FButton <> nil уже сделана, то зачем проверять снова? Да еще и в цикле.
3. Notification - нужно проверять только удаление. Остальное юзер компонента сделает сам - так, как ему это нужно.
begin
inherited;
if (Operation = opRemove) and (AComponent = FButton) then
FButton := nil
end;
4. SetButton - лучше привыкать использовать стандартный вид параметров (const Value). В этом случае Ctrl+Shift+C позволяет экономить время (да и другие преимущества тоже есть). Далее, если FButton - единственная возможная связка между конкретно ЭТИМИ двумя компонентами, то есть смысл использовать еще и RemoveFreeNotification (но только для D5 и старше).
procedure TMyComponent.SetButton(const Value: TButton);
begin
if FButton <> Value then
begin
if FButton <> nil then RemoveFreeNotification(FButton);
FButton := Value;
if FButton <> nil then FreeNotification(FButton)
end
end;
← →
Makhanev A.S. (2003-12-14 19:26) [10]
> Юрий Зотов © (14.12.03 18:58) [9]
Спасибо за ответы.
Понял недочёты.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c