Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.26;
Скачать: CL | DM;

Вниз

Как принято   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-86385
leonidus
2003-12-07 23:49
2003.12.26
Компонент для отображения гистограммы скорости скачивания


3-86319
Kramar
2003-12-01 22:35
2003.12.26
DBGrid


1-86376
Александр из Минска
2003-12-15 15:26
2003.12.26
Строки


3-86285
Djek
2003-12-02 18:13
2003.12.26
Фильтрация в БД


3-86277
dimm22
2003-12-03 08:37
2003.12.26
Посоветуйте толковую книгу по MSSQL, с описанием компонент