Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-86399
Islander
2003-12-08 12:06
2003.12.26
Изменение размеров кнопок под размер системного шрифта


7-86568
gunner
2003-10-22 10:29
2003.12.26
Как узнать (вычислить) дату перевода времени ?


14-86512
raymond
2003-12-04 12:05
2003.12.26
Музыка и программирование


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


7-86580
crocodile_
2003-10-22 14:33
2003.12.26
WMI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский