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

Вниз

Когда создать модуль данных   Найти похожие ветки 

 
PoetOfDelphi ©   (2006-02-16 13:30) [0]

Уважаемые, делфисты с опытом!
Пишу приложение для работы с БД. Хочется мне, чтобы в моём проэкте всё было рационально и разложено по полочкам.
Делфи осваивал в сжатые сроки, поэтому в голове моей сумбур. Где-то когда-то вроде бы читал, что модуль данных нужно создавать в последнюю очередь (Apllication.CreateForm(TDataModule)). Я так и сделал. Но это вызвало определённую путаницу в виде перекрёстных ссылок между модулями. Теперь мне начальница грит (сама она такой же программер как и я, только стажа побольше :) ), что в нескольких проэктах нашей фирмы модуль данных создаётся как раз самым первым, а потом из него данные загружаются в остальные формы. При этом у меня тоже возникает путаница, но уже другая. Вправьте мне мозги, пожалуйста или может линкочку  на какую-нть статейку, а? Копаться в томудах нет времени...


 
Johnmen ©   (2006-02-16 13:34) [1]

1. DM первым
2. DM ничего не должен знать про способы представления его информации


 
Digitman ©   (2006-02-16 13:38) [2]


> PoetOfDelphi ©   (16.02.06 13:30)  


Важно понимать следующее:

- объект либо существует (был создан) либо не существует в тот или иной момент времени ... DataModule-объект - не исключение.

- обращения к методам/св-вам объекта должно осущ-ся в соответствии с его threading-safe-моделью.


 
PoetOfDelphi ©   (2006-02-16 13:41) [3]


> 2. DM ничего не должен знать про способы представления его
> информации

Что это значит? Можно немножко подробнее?


 
Johnmen ©   (2006-02-16 13:45) [4]

Грубо говоря, DM не должен uses"ать др.юниты проекта.


 
PoetOfDelphi ©   (2006-02-16 14:11) [5]


> DM не должен uses"ать др.юниты проекта

А что это даёт?


 
Johnmen ©   (2006-02-16 14:16) [6]

>А что это даёт?

Это даёт п.2 из [1], что даёт в свою очередь отсутствие
"определённую путаницу в виде перекрёстных ссылок между модулями." и "путаница, но уже другая"
:)


 
msguns ©   (2006-02-17 12:06) [7]

>Johnmen ©   (16.02.06 13:45) [4]
>Грубо говоря, DM не должен uses"ать др.юниты проекта.

Даже юнит главной формы и юниты с коллекциями процедур и функций ?


 
wal ©   (2006-02-17 12:18) [8]


> Даже юнит главной формы и юниты с коллекциями процедур и
> функций ?
А зачем DM-у вообще знать о главной форме? Его задача - предоставлять данные, а кому их представлять - не его дело, кому надо, тот и возьмет. А вот коллекции процедур и функций - это пожалуйста, если, опять же эти процедуры и функции не имеют различий от того, кто их вызывает.

С уважением.


 
Johnmen ©   (2006-02-17 13:49) [9]


> msguns ©   (17.02.06 12:06) [7]
> Даже юнит главной формы и юниты с коллекциями процедур и
> функций ?


wal уже ответил
:)


 
Ega23 ©   (2006-02-17 14:49) [10]


program Personnel;

uses
 Forms,
 Sysutils,
 WinProcs,
 windows,
 StrUtils,
 UDMpas in "UDMpas.pas" {DMpas: TDataModule},
 UMain in "UMain.pas" {FMain},
 KedrClntDll in "KedrClntDll.pas",
 .........

var hnd:THandle;
ss:string;

begin

 ss:=ExtractFileName(paramstr(0) );
 hnd:=CreateMutex(nil, false, PChar(ss) );
 if GetLastError = ERROR_ALREADY_EXISTS then
 begin
  Beep(100,200); //MessageBeep ->in WinProcs
  ReleaseMutex(hnd);
  Exit;
 end;

 Application.Initialize;

 if not FindCmdLineSwitch("s",[],True) then UseSplash:=True;

 if UseSplash then ShowSplashFormDLL(Application," Подсистема "Бюро пропусков"");

 Application.HelpFile:="Personnel.chm";

 Application.CreateForm(TDMpas, DMpas);
 if not DMpas.LoginOK then
  begin
     DMpas.Free;
     DMpas:=nil;
     ReleaseMutex(hnd);
     Exit;
  end;
Application.ProcessMessages;

 Application.CreateForm(TFMain, FMain);
 Application.CreateForm(TFExtSearch, FExtSearch);
//  Application.CreateForm(TFPersReport, FPersReport);
 if UseSplash then FreeSplashFormDLL;
 Application.Run;
end.


 
Mikhail   (2006-02-17 14:50) [11]


program HotLine;

uses
 SysUtils,
 Forms,
 MainFrm in "MainFrm.pas" {MainForm},
 DataUnt in "DataUnt.pas" {Data: TDataModule},
 SplashFrm in "SplashFrm.pas" {SplashForm},
 LoginFrm in "LoginFrm.pas" {LoginForm},
 ItemEditFrm in "ItemEditFrm.pas" {ItemEditForm},
 ItemSelectFrm in "ItemSelectFrm.pas" {ItemSelectForm};

{$R *.res}

var
 SplashForm: TSplashForm;

begin
 Application.Initialize;
 Application.CreateForm(TData, Data);
 if Data.Login then
 try
   SplashForm := TSplashForm.Create(Application);
   try
     SplashForm.Show;
     SplashForm.Repaint;
     Data.OpenDatasets(SplashForm.StatusMessage);
     Application.CreateForm(TMainForm, MainForm);
     ...
     MainForm.UpdateControls;
   finally
     SplashForm.Free;
   end;
   Application.Run;
 except
   Application.Terminate;
 end
 else
 begin
   Data.Free;
   Application.Terminate;
 end
end.


 
Johnmen ©   (2006-02-17 15:06) [12]

MainLabel :
try
 LastMessages.Free;
 ViewTexts.Terminate;
except
 goto MainLabel;
end;


 
Mikhail   (2006-02-17 15:22) [13]


> Johnmen ©   (17.02.06 15:06) [12]

?


 
Johnmen ©   (2006-02-17 16:06) [14]

>Mikhail   (17.02.06 14:50) [11]

?


 
Mikhail   (2006-02-17 16:16) [15]


> Johnmen ©

Ну зря Вы так.


 
PoetOfDelphi ©   (2006-02-17 16:42) [16]


> Грубо говоря, DM не должен uses"ать др.юниты проекта.


:)
Такс. Понятно.
Я, например, в событии OnStateChange,описанном в DM,изменяю сосотояние Control-ов главной формы,в соответствии с новым состоянием датасета.( Как же подругому отразить на форме изменения, произошедшие в таблицах?)
Это есть uses"нье юнита главной формы?


 
Johnmen ©   (2006-02-17 16:44) [17]

>Mikhail   (17.02.06 16:16) [15]

Почему?


 
Ega23 ©   (2006-02-17 16:45) [18]


> Я, например, в событии OnStateChange,описанном в DM,изменяю
> сосотояние Control-ов главной формы,в соответствии с новым
> состоянием датасета.( Как же подругому отразить на форме
> изменения, произошедшие в таблицах?)
> Это есть uses"нье юнита главной формы?


Это есть uses"нье юнита главной формы. Но делать так - не стоит.


 
Johnmen ©   (2006-02-17 16:45) [19]

>Это есть uses"нье юнита главной формы?

Да.


 
PoetOfDelphi ©   (2006-02-17 16:48) [20]

Во-первых, почему не стоит?
Во-вторых, как сделать то, что я описал по-другому?


 
Mikhail   (2006-02-17 16:50) [21]

Более содержательный наезд приветствуется :)


 
PoetOfDelphi ©   (2006-02-17 16:51) [22]


> Более содержательный наезд приветствуется :)

Это Вы о чём?


 
Johnmen ©   (2006-02-17 16:53) [23]

>Во-вторых, как сделать то, что я описал по-другому?

В гл.форме д.б. механизм изменения отображения контролов в зависимости от различных параметров, в т.ч. и от состояния набора данных.
Такой механизм предоставляется в частности классом TActionList.


 
Mikhail   (2006-02-17 16:53) [24]

Это я Joinmeny


 
PoetOfDelphi ©   (2006-02-17 16:56) [25]


> Johnmen ©   (17.02.06 16:53) [23]

Я использую ActionList.
А от куда подаётся сигнал проверять состояние НД?


 
Johnmen ©   (2006-02-17 17:03) [26]

>PoetOfDelphi ©   (17.02.06 16:56) [25]

Проверяется в OnUpdate. Насколько помню в F1 всё подробно описано...


 
Плохиш ©   (2006-02-17 17:16) [27]


> PoetOfDelphi ©   (17.02.06 16:42) [16]
> Я, например, в событии OnStateChange,описанном в DM,изменяю
> сосотояние Control-ов главной формы,в соответствии с новым
> состоянием датасета.( Как же подругому отразить на форме
> изменения, произошедшие в таблицах?)

В DM создаёшь, новое свойство типа TNotifyEvent, к примеру. В главной форме создаёшь обработчик для этого события. При создании главной формы присваиваешь свойству в DM созданный обработчик.
При обработке события OnStateChange проверяешь и если свойство не nil, то выполняешь обработчик.


 
MBo ©   (2006-02-17 17:31) [28]

>PoetOfDelphi
На мой взгляд, стоит почитать о парадигме программирования MVC (Model-View-Controller).
Грубо говоря, хранитель данных (Model) предоставляет минимальный интерфейс для выдачи или поступления данных, он не знает, кто и как ими распоряжаются, а другие участники процесса не знают, как данные хранятся.


 
Гаврила ©   (2006-02-17 17:37) [29]


> Плохиш ©  


> В DM создаёшь, новое свойство типа TNotifyEvent,


Да, собственно, можно и не создавать нового события, событие то уже есть (у соответствующего компонента в DataModule)
просто присвоить на него метод главной формы, и всех делов


 
PoetOfDelphi ©   (2006-02-21 12:06) [30]

Спасиба, господа! :).
Мой кругозор, благодаря вам расширился.
> PoetOfDelphi ©   (17.02.06 16:42) [16]
> Я, например, в событии OnStateChange,описанном в DM,изменяю
> сосотояние Control-ов главной формы,в соответствии с новым
> состоянием датасета.( Как же подругому отразить на форме
> изменения, произошедшие в таблицах?)
Это всё я сделал в событии OnUpDate ActionLista. Воспользовался советом
Johnmen ©   (17.02.06 17:03) [26]
>PoetOfDelphi ©   (17.02.06 16:56) [25]
Проверяется в OnUpdate. Насколько помню в F1 всё подробно описано...
Работает. Но недостаток закл. в том, что это событие возникает када надо и када не надо.

> В DM создаёшь, новое свойство типа TNotifyEvent, к примеру.
>  В главной форме создаёшь обработчик для этого события.
> При создании главной формы присваиваешь свойству в DM созданный
> обработчик.
> При обработке события OnStateChange проверяешь и если свойство
> не nil, то выполняешь обработчик.
-Это мне больше нравится. Изменение сосотояния контролов гланой формы происходит по факту изменения в таблицах. Собственно, до этого у меня так и было, только в профиль (:)) Но не приходим ли мы опять к пресловутому юзанью модуля главной формы модулем DM? Ведь обработчик,
который вы предлагаете назначить событию DM, описывается в главной форме, стало быть её модуль должно быть видно из DM...
Кстати, как перекрёстные ссылки как-то влияют на качество работы приложения? Или они просто затрудняют сопровождение и понимание кода?


 
Плохиш ©   (2006-02-21 12:14) [31]


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


Т.е. из этого вытекает, что когда ты создаёшь у TForm1 какой-либо обработчик, то модуль Unit1 включается в uses-секцию модуля forms?


 
PoetOfDelphi ©   (2006-02-21 12:56) [32]

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


 
Плохиш ©   (2006-02-21 13:19) [33]

procedure TForm1.MyStart(Sender: TObject);
begin
...
end;

procedure TForm1.MyFunc;
begin
 DM.OnMyStart := MyStart;
 DM.Refresh;
end;
..........
procedure TDM.Refresh;
begin
 if Assigned(FOnMyStart) then FOnMyStart(self);
end;


 
PoetOfDelphi ©   (2006-02-21 13:36) [34]

Спасибо. Надо переварить... :)


 
Johnmen ©   (2006-02-21 13:41) [35]


> PoetOfDelphi ©   (21.02.06 12:06) [30]
> Работает. Но недостаток закл. в том, что это событие возникает
> када надо и када не надо.


Оно ВСЕГДА "возникает", "когда надо". Видимо, ты не так его пользуешь...


 
msguns ©   (2006-02-21 13:44) [36]

>PoetOfDelphi ©   (21.02.06 12:56) [32]
>Я имел ввиду, что чтобы назначить обработчик, описанный в главной форме событию Модуля Данных, нужно в разделе uses Модуля Данных сослаться на модуль главной формы... Или нет?

ИМХО, концептуально неверный подход. Код в главной форме (да и любой другой) должен ссылаться на объект, а где этот объект находится, в датамодуле, другом юните или вообще "с луны свалился", процедуре/функции должно быть равнобедренно.



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.049 c
8-1128784676
beglec
2005-10-08 19:17
2006.03.12
Как сделать TImage полупрозрачным?


5-1126858582
newGuest
2005-09-16 12:16
2006.03.12
Control has no parent window.


2-1140499747
ALIES
2006-02-21 08:29
2006.03.12
Два соединения в BDE


2-1140712917
Firefly
2006-02-23 19:41
2006.03.12
Разделение строки


2-1140763924
Alex 7
2006-02-24 09:52
2006.03.12
"TDBNavigator"