Форум: "Начинающим";
Текущий архив: 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