Changeset 105 for trunk/Packages


Ignore:
Timestamp:
Oct 9, 2012, 1:58:45 PM (12 years ago)
Author:
chronos
Message:
  • Přidáno: Hlavní modul Base, který slouží jako základní rozhraní k aplikaci pro ostatní moduly. Modul System zajistí udržování seznamu instalovaných modulů v perzistentním úložišti v databázi.
  • Upraveno: Správce modulů ModuleManager je nyní použit pro každé komunikační spojení zvlášť.
Location:
trunk/Packages
Files:
3 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/CoolWeb/WebServer/UWebApp.pas

    r96 r105  
    2424  TPageList = class(TListObject)
    2525    RootDir: string;
     26    function FindByPage(Page: TWebPage): TRegistredPage;
    2627    function FindByName(Name: string): TRegistredPage;
    27     procedure RegisterPage(PageClass: TWebPageClass; out Reference; Path: string);
    28     procedure UnregisterPage(Path: string);
     28    procedure RegisterPage(Page: TWebPage; Path: string);
     29    procedure UnregisterPage(Page: TWebPage);
    2930    function ProducePage(HandlerData: THTTPHandlerData): Boolean;
    3031  end;
     
    7879{ TPageList }
    7980
     81function TPageList.FindByPage(Page: TWebPage): TRegistredPage;
     82var
     83  I: Integer;
     84begin
     85  I := 0;
     86  while (I < Count) and (TRegistredPage(Items[I]).Page <> Page) do Inc(I);
     87  if I < Count then Result := TRegistredPage(Items[I])
     88    else Result := nil;
     89end;
     90
    8091function TPageList.FindByName(Name: string): TRegistredPage;
    8192var
     
    117128end;
    118129
    119 procedure TPageList.RegisterPage(PageClass: TWebPageClass; out Reference;
    120   Path: string);
     130procedure TPageList.RegisterPage(Page: TWebPage; Path: string);
    121131var
    122132  NewPage: TRegistredPage;
     
    125135  NewPage := TRegistredPage(AddNew(TRegistredPage.Create));
    126136//  NewPage.Page := PageClass.Create(Self);
    127   NewPage.Page := PageClass.Create(nil);
     137  NewPage.Page := Page;
    128138  NewPage.Name := Path;
    129   TWebPage(Reference) := NewPage.Page;
    130 end;
    131 
    132 procedure TPageList.UnregisterPage(Path: string);
    133 var
    134   Page: TRegistredPage;
    135 begin
    136   Page := FindByName(Path);
    137   Remove(Page);
     139end;
     140
     141procedure TPageList.UnregisterPage(Page: TWebPage);
     142var
     143  RegPage: TRegistredPage;
     144begin
     145  RegPage := FindByPage(Page);
     146  Remove(RegPage);
    138147end;
    139148
  • trunk/Packages/ModularSystem/Demo

    • Property svn:ignore set to
      lib
      Demo.exe
  • trunk/Packages/ModularSystem/Demo/Demo.lpi

    r89 r105  
    3535      <Item1>
    3636        <PackageName Value="ModularSystem"/>
     37        <DefaultFilename Value="..\ModularSystem.lpk" Prefer="True"/>
    3738      </Item1>
    3839      <Item2>
  • trunk/Packages/ModularSystem/Demo/Demo.lps

    r89 r105  
    22<CONFIG>
    33  <ProjectSession>
     4    <PathDelim Value="\"/>
    45    <Version Value="9"/>
    56    <BuildModes Active="Default"/>
    6     <Units Count="5">
     7    <Units Count="6">
    78      <Unit0>
    89        <Filename Value="Demo.lpr"/>
    910        <IsPartOfProject Value="True"/>
    1011        <UnitName Value="Demo"/>
    11         <UsageCount Value="20"/>
     12        <UsageCount Value="22"/>
    1213      </Unit0>
    1314      <Unit1>
     
    1819        <ResourceBaseClass Value="Form"/>
    1920        <UnitName Value="UMainForm"/>
    20         <IsVisibleTab Value="True"/>
    21         <EditorIndex Value="1"/>
    22         <WindowIndex Value="0"/>
    23         <TopLine Value="87"/>
    24         <CursorPos X="46" Y="105"/>
    25         <UsageCount Value="20"/>
    26         <Loaded Value="True"/>
     21        <EditorIndex Value="4"/>
     22        <WindowIndex Value="0"/>
     23        <TopLine Value="61"/>
     24        <CursorPos X="37" Y="76"/>
     25        <UsageCount Value="22"/>
     26        <Loaded Value="True"/>
     27        <LoadedDesigner Value="True"/>
    2728      </Unit1>
    2829      <Unit2>
     
    3031        <IsPartOfProject Value="True"/>
    3132        <UnitName Value="UModuleUser"/>
    32         <UsageCount Value="20"/>
     33        <EditorIndex Value="2"/>
     34        <WindowIndex Value="0"/>
     35        <TopLine Value="13"/>
     36        <CursorPos X="17" Y="26"/>
     37        <UsageCount Value="22"/>
     38        <Loaded Value="True"/>
    3339      </Unit2>
    3440      <Unit3>
     
    3642        <IsPartOfProject Value="True"/>
    3743        <UnitName Value="UModuleBase"/>
    38         <UsageCount Value="20"/>
     44        <IsVisibleTab Value="True"/>
     45        <EditorIndex Value="1"/>
     46        <WindowIndex Value="0"/>
     47        <TopLine Value="10"/>
     48        <CursorPos X="40" Y="17"/>
     49        <UsageCount Value="22"/>
     50        <Loaded Value="True"/>
    3951      </Unit3>
    4052      <Unit4>
     
    4557        <WindowIndex Value="0"/>
    4658        <TopLine Value="1"/>
    47         <CursorPos X="36" Y="4"/>
    48         <UsageCount Value="20"/>
     59        <CursorPos X="17" Y="14"/>
     60        <UsageCount Value="22"/>
    4961        <Loaded Value="True"/>
    5062      </Unit4>
     63      <Unit5>
     64        <Filename Value="..\UModularSystem.pas"/>
     65        <UnitName Value="UModularSystem"/>
     66        <EditorIndex Value="3"/>
     67        <WindowIndex Value="0"/>
     68        <TopLine Value="117"/>
     69        <CursorPos X="1" Y="133"/>
     70        <UsageCount Value="11"/>
     71        <Loaded Value="True"/>
     72      </Unit5>
    5173    </Units>
    5274    <General>
    5375      <ActiveWindowIndexAtStart Value="0"/>
    5476    </General>
    55     <JumpHistory Count="1" HistoryIndex="0">
     77    <JumpHistory Count="29" HistoryIndex="28">
    5678      <Position1>
    57         <Filename Value="UMainForm.pas"/>
    58         <Caret Line="1" Column="1" TopLine="1"/>
     79        <Filename Value="UModuleUser.pas"/>
     80        <Caret Line="13" Column="51" TopLine="10"/>
    5981      </Position1>
     82      <Position2>
     83        <Filename Value="UModuleUser.pas"/>
     84        <Caret Line="15" Column="23" TopLine="2"/>
     85      </Position2>
     86      <Position3>
     87        <Filename Value="UModuleBase.pas"/>
     88        <Caret Line="13" Column="31" TopLine="10"/>
     89      </Position3>
     90      <Position4>
     91        <Filename Value="UModuleBase.pas"/>
     92        <Caret Line="12" Column="43" TopLine="1"/>
     93      </Position4>
     94      <Position5>
     95        <Filename Value="UModuleACL.pas"/>
     96        <Caret Line="13" Column="29" TopLine="1"/>
     97      </Position5>
     98      <Position6>
     99        <Filename Value="UModuleACL.pas"/>
     100        <Caret Line="14" Column="43" TopLine="1"/>
     101      </Position6>
     102      <Position7>
     103        <Filename Value="UMainForm.pas"/>
     104        <Caret Line="14" Column="39" TopLine="1"/>
     105      </Position7>
     106      <Position8>
     107        <Filename Value="UMainForm.pas"/>
     108        <Caret Line="92" Column="54" TopLine="77"/>
     109      </Position8>
     110      <Position9>
     111        <Filename Value="UMainForm.pas"/>
     112        <Caret Line="71" Column="23" TopLine="54"/>
     113      </Position9>
     114      <Position10>
     115        <Filename Value="UMainForm.pas"/>
     116        <Caret Line="46" Column="7" TopLine="33"/>
     117      </Position10>
     118      <Position11>
     119        <Filename Value="UMainForm.pas"/>
     120        <Caret Line="71" Column="35" TopLine="57"/>
     121      </Position11>
     122      <Position12>
     123        <Filename Value="UMainForm.pas"/>
     124        <Caret Line="72" Column="35" TopLine="58"/>
     125      </Position12>
     126      <Position13>
     127        <Filename Value="UMainForm.pas"/>
     128        <Caret Line="74" Column="35" TopLine="60"/>
     129      </Position13>
     130      <Position14>
     131        <Filename Value="UMainForm.pas"/>
     132        <Caret Line="137" Column="3" TopLine="135"/>
     133      </Position14>
     134      <Position15>
     135        <Filename Value="UMainForm.pas"/>
     136        <Caret Line="138" Column="3" TopLine="136"/>
     137      </Position15>
     138      <Position16>
     139        <Filename Value="UMainForm.pas"/>
     140        <Caret Line="139" Column="3" TopLine="137"/>
     141      </Position16>
     142      <Position17>
     143        <Filename Value="UMainForm.pas"/>
     144        <Caret Line="140" Column="3" TopLine="138"/>
     145      </Position17>
     146      <Position18>
     147        <Filename Value="UMainForm.pas"/>
     148        <Caret Line="35" Column="15" TopLine="22"/>
     149      </Position18>
     150      <Position19>
     151        <Filename Value="UMainForm.pas"/>
     152        <Caret Line="40" Column="15" TopLine="25"/>
     153      </Position19>
     154      <Position20>
     155        <Filename Value="UMainForm.pas"/>
     156        <Caret Line="95" Column="77" TopLine="86"/>
     157      </Position20>
     158      <Position21>
     159        <Filename Value="UMainForm.pas"/>
     160        <Caret Line="98" Column="65" TopLine="76"/>
     161      </Position21>
     162      <Position22>
     163        <Filename Value="..\UModularSystem.pas"/>
     164        <Caret Line="183" Column="1" TopLine="164"/>
     165      </Position22>
     166      <Position23>
     167        <Filename Value="..\UModularSystem.pas"/>
     168        <Caret Line="237" Column="33" TopLine="220"/>
     169      </Position23>
     170      <Position24>
     171        <Filename Value="..\UModularSystem.pas"/>
     172        <Caret Line="183" Column="1" TopLine="170"/>
     173      </Position24>
     174      <Position25>
     175        <Filename Value="..\UModularSystem.pas"/>
     176        <Caret Line="233" Column="1" TopLine="220"/>
     177      </Position25>
     178      <Position26>
     179        <Filename Value="..\UModularSystem.pas"/>
     180        <Caret Line="130" Column="1" TopLine="117"/>
     181      </Position26>
     182      <Position27>
     183        <Filename Value="..\UModularSystem.pas"/>
     184        <Caret Line="131" Column="1" TopLine="117"/>
     185      </Position27>
     186      <Position28>
     187        <Filename Value="..\UModularSystem.pas"/>
     188        <Caret Line="132" Column="1" TopLine="117"/>
     189      </Position28>
     190      <Position29>
     191        <Filename Value="..\UModularSystem.pas"/>
     192        <Caret Line="133" Column="1" TopLine="117"/>
     193      </Position29>
    60194    </JumpHistory>
    61195  </ProjectSession>
    62   <EditorMacros Count="0"/>
     196  <Debugging>
     197    <BreakPoints Count="1">
     198      <Item1>
     199        <Kind Value="bpkSource"/>
     200        <WatchScope Value="wpsLocal"/>
     201        <WatchKind Value="wpkWrite"/>
     202        <Source Value="..\UModularSystem.pas"/>
     203        <Line Value="233"/>
     204      </Item1>
     205    </BreakPoints>
     206  </Debugging>
    63207</CONFIG>
  • trunk/Packages/ModularSystem/Demo/UMainForm.lfm

    r89 r105  
    1010  OnDestroy = FormDestroy
    1111  OnShow = FormShow
    12   LCLVersion = '1.1'
     12  LCLVersion = '1.0.1.3'
    1313  object ListViewModules: TListView
    1414    Left = 8
     
    3030      end   
    3131      item
    32         Caption = 'State'
     32        Caption = 'Installed'
     33        Width = 80
     34      end   
     35      item
     36        Caption = 'Running'
    3337        Width = 80
    3438      end   
     
    8084    TabOrder = 3
    8185  end
     86  object ButtonUpdate1: TButton
     87    Left = 248
     88    Height = 25
     89    Top = 281
     90    Width = 75
     91    Action = AModuleStart
     92    Anchors = [akLeft, akBottom]
     93    TabOrder = 4
     94  end
     95  object ButtonUpdate2: TButton
     96    Left = 328
     97    Height = 25
     98    Top = 281
     99    Width = 75
     100    Action = AModuleStop
     101    Anchors = [akLeft, akBottom]
     102    TabOrder = 5
     103  end
    82104  object PopupMenu1: TPopupMenu
    83105    left = 183
     
    92114      Action = AModuleUpdate
    93115    end
     116    object MenuItem4: TMenuItem
     117      Action = AModuleStart
     118    end
     119    object MenuItem5: TMenuItem
     120      Action = AModuleStop
     121    end
    94122  end
    95123  object ActionList1: TActionList
    96     left = 137
    97     top = 165
     124    left = 184
     125    top = 136
    98126    object AModuleInstall: TAction
    99127      Caption = 'Install'
     
    108136      OnExecute = ButtonUpdateClick
    109137    end
     138    object AModuleStart: TAction
     139      Caption = 'Start'
     140      OnExecute = AModuleStartExecute
     141    end
     142    object AModuleStop: TAction
     143      Caption = 'Stop'
     144      OnExecute = AModuleStopExecute
     145    end
    110146  end
    111147end
  • trunk/Packages/ModularSystem/Demo/UMainForm.pas

    r89 r105  
    1515  TMainForm = class(TForm)
    1616  published
     17    AModuleStart: TAction;
     18    AModuleStop: TAction;
    1719    AModuleInstall: TAction;
    1820    AModuleUninstall: TAction;
     
    2224    ButtonUninstall: TButton;
    2325    ButtonInstall: TButton;
     26    ButtonUpdate1: TButton;
     27    ButtonUpdate2: TButton;
    2428    ListViewModules: TListView;
    2529    MenuItem1: TMenuItem;
    2630    MenuItem2: TMenuItem;
    2731    MenuItem3: TMenuItem;
     32    MenuItem4: TMenuItem;
     33    MenuItem5: TMenuItem;
    2834    PopupMenu1: TPopupMenu;
     35    procedure AModuleStartExecute(Sender: TObject);
     36    procedure AModuleStopExecute(Sender: TObject);
    2937    procedure ButtonInstallClick(Sender: TObject);
    3038    procedure ButtonUninstallClick(Sender: TObject);
     
    4452
    4553const
    46   InstalledText: array[Boolean] of string = ('Not installed', 'Installed');
     54  BoolText: array[Boolean] of string = ('No', 'Yes');
    4755
    4856var
     
    6674    Item.Caption := Title;
    6775    Item.Data := ModuleManager.Modules[Item.Index];
    68     Item.SubItems.Add(Name);
     76    Item.SubItems.Add(Identification);
    6977    Item.SubItems.Add(Version);
    70     Item.SubItems.Add(InstalledText[Installed]);
     78    Item.SubItems.Add(BoolText[Installed]);
     79    Item.SubItems.Add(BoolText[Running]);
    7180    Item.SubItems.Add(License);
    7281    Item.SubItems.Add(StringReplace(Dependencies.Text, LineEnding, ', ', [rfReplaceAll]));
     
    7988var
    8089  Installed: Boolean;
     90  Running: Boolean;
    8191begin
    8292  if Assigned(ListViewModules.Selected) then Installed := TModule(ListViewModules.Selected.Data).Installed;
     93  if Assigned(ListViewModules.Selected) then Running := TModule(ListViewModules.Selected.Data).Running;
    8394  AModuleInstall.Enabled := Assigned(ListViewModules.Selected) and not Installed;
    8495  AModuleUninstall.Enabled := Assigned(ListViewModules.Selected) and Installed;
    8596  AModuleUpdate.Enabled := Assigned(ListViewModules.Selected) and Installed;
     97  AModuleStart.Enabled := Assigned(ListViewModules.Selected) and not Running;
     98  AModuleStop.Enabled := Assigned(ListViewModules.Selected) and Running;
    8699end;
    87100
    88101procedure TMainForm.RegisterModules;
    89102begin
    90   ModuleManager.RegisterModule(TModuleUser.Create);
    91   ModuleManager.RegisterModule(TModuleBase.Create);
    92   ModuleManager.RegisterModule(TModuleACL.Create);
     103  ModuleManager.RegisterModule(TModuleUser.Create(nil));
     104  ModuleManager.RegisterModule(TModuleBase.Create(nil));
     105  ModuleManager.RegisterModule(TModuleACL.Create(nil));
    93106end;
    94107
     
    129142end;
    130143
     144procedure TMainForm.AModuleStartExecute(Sender: TObject);
     145var
     146  ModuleList: TStringList;
     147begin
     148  if Assigned(ListViewModules.Selected) then begin
     149    try
     150      ModuleList := TStringList.Create;
     151      TModule(ListViewModules.Selected.Data).EnumModulesStart(ModuleList);
     152      if ModuleList.Count > 0 then begin
     153        if MessageDlg('These modules will be started in addition to ' +
     154          TModule(ListViewModules.Selected.Data).Name + ': ' +
     155          StringReplace(ModuleList.Text, LineEnding, ', ', [rfReplaceAll]),
     156          mtConfirmation, [mbYes, mbNo], 0) = mrYes then
     157           TModule(ListViewModules.Selected.Data).Start;
     158      end else TModule(ListViewModules.Selected.Data).Start;
     159    finally
     160      ModuleList.Free;
     161    end;
     162    RefreshList;
     163  end;
     164end;
     165
     166procedure TMainForm.AModuleStopExecute(Sender: TObject);
     167var
     168  ModuleList: TStringList;
     169begin
     170  if Assigned(ListViewModules.Selected) then begin
     171    try
     172      ModuleList := TStringList.Create;
     173      TModule(ListViewModules.Selected.Data).EnumModulesStop(ModuleList);
     174      if ModuleList.Count > 0 then begin
     175        if MessageDlg('These modules will be stopped in addition to ' +
     176          TModule(ListViewModules.Selected.Data).Name + ': ' +
     177          StringReplace(ModuleList.Text, LineEnding, ', ', [rfReplaceAll]),
     178          mtConfirmation, [mbYes, mbNo], 0) = mrYes then
     179            TModule(ListViewModules.Selected.Data).Stop;
     180      end else TModule(ListViewModules.Selected.Data).Stop;
     181    finally
     182      ModuleList.Free;
     183    end;
     184
     185    RefreshList;
     186  end;
     187end;
     188
    131189procedure TMainForm.ButtonUninstallClick(Sender: TObject);
    132190var
     
    155213begin
    156214  if Assigned(ListViewModules.Selected) then begin
    157     TModule(ListViewModules.Selected.Data).Update;
     215    TModule(ListViewModules.Selected.Data).Upgrade;
    158216    RefreshList;
    159217  end;
     
    162220procedure TMainForm.FormDestroy(Sender: TObject);
    163221begin
    164   ModuleManager.Free;
     222  FreeAndNil(ModuleManager);
    165223end;
    166224
  • trunk/Packages/ModularSystem/Demo/UModuleACL.pas

    r89 r105  
    1212
    1313  TModuleACL = class(TModule)
    14     constructor Create; override;
     14    constructor Create(AOwner: TComponent); override;
    1515    destructor Destroy; override;
    1616  end;
     
    2121{ TModuleACL }
    2222
    23 constructor TModuleACL.Create;
     23constructor TModuleACL.Create(AOwner: TComponent);
    2424begin
    2525  inherited;
    26   Name := 'UserACL';
     26  Identification := 'UserACL';
    2727  Title := 'User ACL';
    2828  Version := '1.0';
  • trunk/Packages/ModularSystem/Demo/UModuleBase.pas

    r89 r105  
    1010type
    1111  TModuleBase = class(TModule)
    12     constructor Create; override;
     12    constructor Create(AOwner: TComponent); override;
    1313    destructor Destroy; override;
    1414  end;
     
    1919{ TModuleUser }
    2020
    21 constructor TModuleBase.Create;
     21constructor TModuleBase.Create(AOwner: TComponent);
    2222begin
    2323inherited;
    24   Name := 'Base';
     24  Identification := 'Base';
    2525  Title := 'Base';
    2626  Version := '1.0';
  • trunk/Packages/ModularSystem/Demo/UModuleUser.pas

    r89 r105  
    1313
    1414  TModuleUser = class(TModule)
    15     constructor Create; override;
     15    constructor Create(AOwner: TComponent); override;
    1616    destructor Destroy; override;
    1717  end;
     
    2121{ TModuleUser }
    2222
    23 constructor TModuleUser.Create;
     23constructor TModuleUser.Create(AOwner: TComponent);
    2424begin
    2525  inherited;
    26   Name := 'User';
     26  Identification := 'User';
    2727  Title := 'User';
    2828  Version := '1.0';
  • trunk/Packages/ModularSystem/ModularSystem.lpk

    r92 r105  
    2020    <Description Value="Modular system"/>
    2121    <License Value="GNU/LGPLv3"/>
    22     <Version Minor="2"/>
     22    <Version Minor="1"/>
    2323    <Files Count="1">
    2424      <Item1>
     
    2828      </Item1>
    2929    </Files>
     30    <i18n>
     31      <EnableI18N Value="True"/>
     32      <OutDir Value="Language"/>
     33      <EnableI18NForLFM Value="True"/>
     34    </i18n>
    3035    <Type Value="RunAndDesignTime"/>
    31     <RequiredPkgs Count="1">
     36    <RequiredPkgs Count="2">
    3237      <Item1>
     38        <PackageName Value="Common"/>
     39      </Item1>
     40      <Item2>
    3341        <PackageName Value="FCL"/>
    34       </Item1>
     42      </Item2>
    3543    </RequiredPkgs>
    3644    <UsageOptions>
  • trunk/Packages/ModularSystem/UModularSystem.pas

    r94 r105  
    66
    77uses
    8   Classes, SysUtils, Contnrs;
     8  Classes, SysUtils, Contnrs, URegistry;
    99
    1010type
     
    1919  TModule = class(TComponent)
    2020  private
     21    FEnabled: Boolean;
    2122    FRunning: Boolean;
    2223    FInstalled: Boolean;
    23     Manager: TModuleManager;
     24    FManager: TModuleManager;
    2425    FVersion: string;
    2526    FIdentification: string;
     
    2930    FDependencies: TStringList;
    3031    FDescription: TStringList;
     32    procedure SetEnabled(AValue: Boolean);
    3133    procedure SetInstalled(AValue: Boolean);
    3234    procedure SetRunning(AValue: Boolean);
     35  protected
     36    procedure BeforeStart; virtual;
     37    procedure AfterStart; virtual;
     38    procedure BeforeStop; virtual;
     39    procedure AfterStop; virtual;
    3340  public
    3441    API: TAPI;
    35     MarkForInstall: Boolean;
    3642    procedure Start; virtual;
    3743    procedure Stop; virtual;
     
    4854    property Running: Boolean read FRunning write SetRunning;
    4955    property Installed: Boolean read FInstalled write SetInstalled;
     56    property Enabled: Boolean read FEnabled write SetEnabled;
    5057  published
     58    property Manager: TModuleManager read FManager;
    5159    property Version: string read FVersion write FVersion;
    5260    property Identification: string read FIdentification write FIdentification;
     
    7987    procedure EnumModulesInstall(Dependencies, ModuleList: TStringList);
    8088    procedure EnumModulesUninstall(ModuleName: string; ModuleList: TStringList);
    81     procedure RegisterModule(Module: TModule; MarkForInstall: Boolean = False);
     89    procedure RegisterModule(Module: TModule; Enabled: Boolean = True);
    8290    procedure UnregisterModule(Module: TModule);
    8391    procedure StartInstalled;
    84     procedure InstallMarked;
     92    procedure InstallEnabled;
    8593    procedure StopAll;
    8694    procedure UninstallAll;
     95    procedure LoadFromRegistry(Context: TRegistryContext);
     96    procedure SaveToRegistry(Context: TRegistryContext);
    8797    constructor Create(AOwner: TComponent); override;
    8898    destructor Destroy; override;
     
    143153  for I := 0 to Dependencies.Count - 1 do begin
    144154    Module := FindModuleByName(Dependencies[I]);
    145     if Assigned(Module) then begin
     155    if Assigned(Module) and Module.Enabled then begin
    146156      if not Module.Running then Module.Start;
    147157    end else raise Exception.CreateFmt(SModuleNotFound, [ModuleName, Dependencies[I]]);
     
    199209  for I := 0 to Dependencies.Count - 1 do begin
    200210    Module := FindModuleByName(Dependencies[I]);
    201     if Assigned(Module) then begin
     211    if Assigned(Module) and Module.Enabled then begin
    202212      if not Module.Installed then Module.Install;
    203213    end else raise Exception.CreateFmt(SModuleNotFound, [ModuleName, Dependencies[I]]);
     
    248258
    249259procedure TModuleManager.RegisterModule(Module: TModule;
    250   MarkForInstall: Boolean = False);
     260  Enabled: Boolean = True);
    251261begin
    252262  Modules.Add(Module);
    253   Module.Manager := Self;
     263  Module.FManager := Self;
    254264  Module.API := API;
    255   Module.MarkForInstall := MarkForInstall;
     265  Module.Enabled := Enabled;
    256266end;
    257267
     
    270280end;
    271281
    272 procedure TModuleManager.InstallMarked;
     282procedure TModuleManager.InstallEnabled;
    273283var
    274284  I: Integer;
     
    276286  for I := 0 to Modules.Count - 1 do
    277287  with TModule(Modules[I]) do
    278     if not Installed and MarkForInstall then Install;
     288    if not Installed and Enabled then Install;
    279289end;
    280290
     
    301311  inherited;
    302312  Modules := TObjectList.Create;
     313  //Modules.OwnsObjects := False;
    303314end;
    304315
     
    307318  StopAll;
    308319  FreeAndNil(Modules);
    309   inherited Destroy;
     320  inherited;
     321end;
     322
     323procedure TModuleManager.LoadFromRegistry(Context: TRegistryContext);
     324var
     325  I: Integer;
     326begin
     327  with TRegistryEx.Create do
     328  try
     329    RootKey := Context.RootKey;
     330    for I := 0 to Modules.Count - 1 do
     331    with TModule(Modules[I]) do begin
     332      OpenKey(Context.Key + '\' + Identification, True);
     333      Running := ReadBoolWithDefault('Run',  Enabled);
     334    end;
     335  finally
     336    Free;
     337  end;
     338end;
     339
     340procedure TModuleManager.SaveToRegistry(Context: TRegistryContext);
     341var
     342  I: Integer;
     343begin
     344  with TRegistryEx.Create do
     345  try
     346    RootKey := Context.RootKey;
     347    for I := 0 to Modules.Count - 1 do
     348    with TModule(Modules[I]) do begin
     349      OpenKey(Context.Key + '\' + Identification, True);
     350      WriteBool('Run', Running);
     351    end;
     352  finally
     353    Free;
     354  end;
    310355end;
    311356
     
    318363end;
    319364
     365procedure TModule.BeforeStart;
     366begin
     367  if Running then Exit;
     368  if not Installed then Install;
     369  Manager.StartDependencies(Identification, Dependencies);
     370end;
     371
     372procedure TModule.AfterStart;
     373begin
     374  FRunning := True;
     375end;
     376
     377procedure TModule.BeforeStop;
     378begin
     379  if not Running then Exit;
     380  FRunning := False;
     381  Manager.StopDependencies(Identification);
     382end;
     383
     384procedure TModule.AfterStop;
     385begin
     386end;
     387
    320388procedure TModule.SetInstalled(AValue: Boolean);
    321389begin
     
    324392end;
    325393
     394procedure TModule.SetEnabled(AValue: Boolean);
     395begin
     396  if FEnabled = AValue then Exit;
     397  FEnabled := AValue;
     398  if not FEnabled and FInstalled then Uninstall;
     399end;
     400
    326401procedure TModule.Start;
    327402begin
    328   if Running then Exit;
    329   Manager.StartDependencies(Identification, Dependencies);
    330   FRunning := True;
     403  BeforeStart;
     404  // Do something
     405  AfterStart;
    331406end;
    332407
    333408procedure TModule.Stop;
    334409begin
    335   if not Running then Exit;
    336   Manager.StopDependencies(Identification);
    337   FRunning := False;
     410  BeforeStop;
     411  // Do something
     412  AfterStop;
    338413end;
    339414
     
    403478begin
    404479  Running := False;
    405   Description.Free;
    406   Dependencies.Free;
    407   inherited Destroy;
     480  FreeAndNil(FDescription);
     481  FreeAndNil(FDependencies);
     482  inherited;
    408483end;
    409484
Note: See TracChangeset for help on using the changeset viewer.