Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.012 c
2-1140711503
K_Lock
2006-02-23 19:18
2006.03.12
Ошибка......


2-1140437290
Creative
2006-02-20 15:08
2006.03.12
LoadFromFile


2-1140768616
evgenij_
2006-02-24 11:10
2006.03.12
Русский хелп для Дельфина


10-1114366435
ink
2005-04-24 22:13
2006.03.12
Как в TWebBrowser поменять путь загрузки рисунка.


8-1128233186
homm
2005-10-02 10:06
2006.03.12
16 битное значение цвета из 32 битного представления





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский