Index: VerpakkingsDefinitie/ApplicationContext.pas =================================================================== diff -u -r595 -r596 --- VerpakkingsDefinitie/ApplicationContext.pas (.../ApplicationContext.pas) (revision 595) +++ VerpakkingsDefinitie/ApplicationContext.pas (.../ApplicationContext.pas) (revision 596) @@ -209,17 +209,19 @@ FIsOK: Boolean; FErrorMessage: string; FInternalErrorMessage: string; + + function GetProductVerpakkingenLijst: TReadOnlyList; + procedure SetGeselecteerdeVerpakking(ProductVerpakking: TProductVerpakking); public constructor Create(); procedure NotifyChanged(); - procedure Reset(); - property ProductVerpakkingen: TList read FProductVerpakkingen; - { TODO : - Immutable list type retourneren en functie om item(s) toe te voegen (met Notify) - https://stackoverflow.com/questions/22693154/make-delphi-tlist-immutable } + procedure Reset(Notify: Boolean = True); + + property ProductVerpakkingen: TReadOnlyList read GetProductVerpakkingenLijst; + procedure SetProductVerpakkingen(Collection: TEnumerable); function GetDeelVanOpties(ProductVerpakking: TProductVerpakking): TList; - property GeselecteerdeVerpakking: TProductVerpakking read FGeselecteerdeVerpakking write FGeselecteerdeVerpakking; - { TODO : GeselecteerdeVerpakking setter hierop plaatsen en NotifyChanged() callen } + property GeselecteerdeVerpakking: TProductVerpakking read FGeselecteerdeVerpakking write SetGeselecteerdeVerpakking; + property IsOK: Boolean read FIsOK write FIsOK; property ErrorMessage: string read FErrorMessage write FErrorMessage; property InternalErrorMessage: string read FInternalErrorMessage write FInternalErrorMessage; @@ -357,16 +359,35 @@ self.Change(); end; -procedure TProductVerpakkingenContext.Reset(); +procedure TProductVerpakkingenContext.Reset(Notify: Boolean = True); begin if (FGeselecteerdeVerpakking <> nil) or (FProductVerpakkingen.Count > 0) then begin FProductVerpakkingen.Clear(); FGeselecteerdeVerpakking := nil; - NotifyChanged(); + if Notify then + NotifyChanged(); end; end; +function TProductVerpakkingenContext.GetProductVerpakkingenLijst: TReadOnlyList; +begin + Result := TReadOnlyList.Create(FProductVerpakkingen); +end; + +procedure TProductVerpakkingenContext.SetProductVerpakkingen(Collection: TEnumerable); +begin + FProductVerpakkingen.Clear(); + FProductVerpakkingen.AddRange(Collection); + self.NotifyChanged(); +end; + +procedure TProductVerpakkingenContext.SetGeselecteerdeVerpakking(ProductVerpakking: TProductVerpakking); +begin + FGeselecteerdeVerpakking := ProductVerpakking; + self.NotifyChanged(); +end; + function TProductVerpakkingenContext.GetDeelVanOpties(ProductVerpakking: TProductVerpakking): TList; var ProductVerpakkingTeZoeken: TProductVerpakking; Index: VerpakkingsDefinitie/VerpakkingsDefinitie.dproj =================================================================== diff -u -r594 -r596 --- VerpakkingsDefinitie/VerpakkingsDefinitie.dproj (.../VerpakkingsDefinitie.dproj) (revision 594) +++ VerpakkingsDefinitie/VerpakkingsDefinitie.dproj (.../VerpakkingsDefinitie.dproj) (revision 596) @@ -129,6 +129,7 @@
FormVerpakkingDetail
dfm + Cfg_2 Base Index: VerpakkingsDefinitie/UI/ZoekProductenScherm.dfm =================================================================== diff -u -r595 -r596 --- VerpakkingsDefinitie/UI/ZoekProductenScherm.dfm (.../ZoekProductenScherm.dfm) (revision 595) +++ VerpakkingsDefinitie/UI/ZoekProductenScherm.dfm (.../ZoekProductenScherm.dfm) (revision 596) @@ -34,6 +34,10 @@ TabOrder = 0 object TabSheetKortTekst: TTabSheet Caption = '(K) Kort tekst' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 DesignSize = ( 353 176) @@ -140,6 +144,10 @@ object TabSheetLeveranciersRef: TTabSheet Caption = '(R) Leveranciers ref' ImageIndex = 2 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 DesignSize = ( 353 176) @@ -217,6 +225,10 @@ object TabSheetTekst: TTabSheet Caption = '(T) Tekst' ImageIndex = 3 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 DesignSize = ( 353 176) Index: VerpakkingsDefinitie/UI/NavProductScherm.pas =================================================================== diff -u -r595 -r596 --- VerpakkingsDefinitie/UI/NavProductScherm.pas (.../NavProductScherm.pas) (revision 595) +++ VerpakkingsDefinitie/UI/NavProductScherm.pas (.../NavProductScherm.pas) (revision 596) @@ -58,7 +58,7 @@ TUtil.FreeControlChildren(GridPanelRight); // Reset de data. Na het verwijderen van de schermen zodat deze niet eerst updaten ApplicationContext.ProductsContext.Reset(False); - ApplicationContext.ProductVerpakkingContext.Reset(); + ApplicationContext.ProductVerpakkingContext.Reset(False); // Vul linkergrid TUtil.PlaatsControlOpGrid(GridPanelLeft, TFormZoekProducten.Create(GridPanelLeft, self, ApplicationContext, FProductsAgent), 0, 0); @@ -75,7 +75,7 @@ begin // Vul rechtergrid TUtil.PlaatsControlOpGrid(GridPanelRight, TFormProductDetail.Create(GridPanelRight, self, ApplicationContext, - ApplicationContext.ProductsContext, FProductsAgent), 0, 0); + ApplicationContext.ProductsContext, ApplicationContext.ProductVerpakkingContext, FProductsAgent), 0, 0); TUtil.PlaatsControlOpGrid(GridPanelRight, TFormVerpakkingDetail.Create(GridPanelRight, self, ApplicationContext, ApplicationContext.ProductVerpakkingContext), 1, 0); end; Index: VerpakkingsDefinitie/WS/ProductsAgent.pas =================================================================== diff -u -r595 -r596 --- VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 595) +++ VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 596) @@ -26,19 +26,19 @@ function GeefBruikbareLijnenUitXMLDataSet(DataSetXml: string): TStringList; procedure RegistreerZoekResultaten(ProductsContext: TProductsContext; DataSet: string); overload; procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: SelectService.pxStatus); overload; - procedure RegistreerZoekResultaten(ProductVerpakkingenContext: TProductVerpakkingenContext; - pxBoxDataObj: OptiServerService.pxBoxData); overload; procedure RegistreerMislukteOpzoeking(ProductDetailContext: TProductVerpakkingenContext; pxStatusObj: OptiServerService.pxStatus); overload; - function GetBoxDataIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext): TList; + function GetVerpakkingIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; + function GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; public Constructor Create(); procedure LaadUIInstellingen(UserContext: TUserContext; UiInstellingenContext: TUiInstellingenContext); procedure ZoekOp(UserContext: TUserContext; ProductsContext: TProductsContext; Zoekmethode: TZoekMethode; Zoek: string; KLNr: string; LevNr: string; StockType: string; Taal: string); procedure ZoekProductVerpakkingenMetProductNr(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext); + ProductVerpakkingenContext: TProductVerpakkingenContext); end; implementation @@ -340,8 +340,8 @@ ProductsContext.NotifyChanged(); end; -function TProductsAgent.GetBoxDataIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext): TList; +function TProductsAgent.GetVerpakkingIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; var ZoekData: OptiServerService.GetBoxDataIDsViaProduct; GetBoxDataIDsViaProductResponseObj: OptiServerService.GetBoxDataIDsViaProductResponse; @@ -366,13 +366,18 @@ if GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult <> nil then begin // Mislukt - RegistreerMislukteOpzoeking(ProductDetailContext, GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); + RegistreerMislukteOpzoeking(ProductVerpakkingenContext, GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); Result := ResultaatLijst; exit; end; // Gelukt, Bruikbare informatie uit antwoord halen + // Andere velden juist zetten + ProductVerpakkingenContext.IsOK := True; + ProductVerpakkingenContext.ErrorMessage := ''; + ProductVerpakkingenContext.InternalErrorMessage := ''; + // Producten inladen LijnenBoxDataID := TStringList.Create; Lijnen := GeefBruikbareLijnenUitXMLDataSet(GetBoxDataIDsViaProductResponseObj.varDataSet); @@ -415,134 +420,158 @@ end; procedure TProductsAgent.ZoekProductVerpakkingenMetProductNr(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext); + ProductVerpakkingenContext: TProductVerpakkingenContext); var - ZoekData: OptiServerService.GetBoxDataViaId; - BoxDataIDs: TList; - BoxDataID: string; - GetBoxDataViaIDResponseObj: GetBoxDataViaIDResponse; + VerpakkingIDs: TList; + TempProductVerpakkingen: TList; ProductVerpakking: TProductVerpakking; ProductVerpakkingAndere: TProductVerpakking; begin try - BoxDataIDs := GetBoxDataIDsViaProduct(ProductNr, UserContext, ProductDetailContext); + VerpakkingIDs := GetVerpakkingIDsViaProduct(ProductNr, UserContext, ProductVerpakkingenContext); // Controleren dat er resultaat was - if (BoxDataIDs = nil) or (BoxDataIDs.Count = 0) then + if ProductVerpakkingenContext.IsOK = false then + exit + else if (VerpakkingIDs = nil) or (VerpakkingIDs.Count = 0) then raise Exception.Create('Er zijn geen Box IDs gevonden.'); - // Er was resultaat, data opvragen en toevoegen - ProductDetailContext.ProductVerpakkingen.Clear(); + // Opvragen productverpakkingen + TempProductVerpakkingen := GeefVerpakkingenMetIDs(VerpakkingIDs, UserContext, ProductVerpakkingenContext); + if ProductVerpakkingenContext.IsOK = false then + exit; - for BoxDataID in BoxDataIDs do - begin - // Request - // Met ID, box data opvragen - ZoekData := OptiServerService.GetBoxDataViaId.Create(); - ZoekData.SessionKey := UserContext.SessionKey; - ZoekData.BoxDataID := BoxDataID; - - GetBoxDataViaIDResponseObj := FOptiBoxServerSoap.GetBoxDataViaId(ZoekData); - - // Response - if GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult = nil then - begin - // Gelukt - RegistreerZoekResultaten(ProductDetailContext, GetBoxDataViaIDResponseObj.varBoxData); - end - else - begin - // Mislukt - RegistreerMislukteOpzoeking(ProductDetailContext, GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult); - // Stop wanneer error is opgetreden - exit; - end; - end; // Registreer DeelVan, zoekt de verpakking op met het overeenkomstige DeelVanID = ID // Door gebrek aan custom comparators voor zo'n opzoeking moet dit manueel. O(n�) - for ProductVerpakking in ProductDetailContext.ProductVerpakkingen do + for ProductVerpakking in TempProductVerpakkingen do begin if ProductVerpakking.DeelVanID <> '' then - for ProductVerpakkingAndere in ProductDetailContext.ProductVerpakkingen do + for ProductVerpakkingAndere in ProductVerpakkingenContext.ProductVerpakkingen do if ProductVerpakking.DeelVanID = ProductVerpakkingAndere.ID then ProductVerpakking.DeelVan := ProductVerpakkingAndere; end; - ProductDetailContext.NotifyChanged(); + // Toevoegen aan context + ProductVerpakkingenContext.Reset(false); + ProductVerpakkingenContext.SetProductVerpakkingen(TempProductVerpakkingen); + TempProductVerpakkingen.Clear(); finally - FreeAndNil(BoxDataIDs); - FreeAndNil(ZoekData); + FreeAndNil(VerpakkingIDs); + FreeAndNil(TempProductVerpakkingen); end; end; -procedure TProductsAgent.RegistreerZoekResultaten(ProductVerpakkingenContext: TProductVerpakkingenContext; - pxBoxDataObj: OptiServerService.pxBoxData); +function TProductsAgent.GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; var + BoxDataID: string; + ZoekData: OptiServerService.GetBoxDataViaId; + GetBoxDataViaIDResponseObj: GetBoxDataViaIDResponse; + TempProductVerpakkingen: TList; + + pxBoxDataObj: OptiServerService.pxBoxData; Verpakking: TProductVerpakking; I: Integer; NieuweVerpakkingParameter: TProductVerpakkingParameter; begin - // Andere velden juist zetten - ProductVerpakkingenContext.IsOK := True; - ProductVerpakkingenContext.ErrorMessage := ''; - ProductVerpakkingenContext.InternalErrorMessage := ''; + try + TempProductVerpakkingen := TList.Create(); - Verpakking := TProductVerpakking.Create(); - with Verpakking do - begin - RawData := pxBoxDataObj; - VolumeVanCaption := pxBoxDataObj.VolumeVanCaption; - ID := pxBoxDataObj.ID; - CutOrder := pxBoxDataObj.CutOrder; - Breedte := pxBoxDataObj.Breedte; - Diepte := pxBoxDataObj.Diepte; - Hoogte := pxBoxDataObj.Hoogte; - Aantal := pxBoxDataObj.Aantal; - MaxCombinAantal := pxBoxDataObj.MaxCombinAantal; - Plaatsing := pxBoxDataObj.Plaatsing; - OptiType := pxBoxDataObj.OptiType; + for BoxDataID in VerpakkingIDs do + begin + // Request + // Met ID, box data opvragen + ZoekData := OptiServerService.GetBoxDataViaId.Create(); + ZoekData.SessionKey := UserContext.SessionKey; + ZoekData.BoxDataID := BoxDataID; - Posities.AddRange(SplitString(pxBoxDataObj.Positie, '')); - Richtingen.AddRange(SplitString(pxBoxDataObj.Rotatie, '')); + GetBoxDataViaIDResponseObj := FOptiBoxServerSoap.GetBoxDataViaId(ZoekData); - if pxBoxDataObj.DefaultData <> nil then - begin - DefaultBreedte := pxBoxDataObj.DefaultData.Breedte; - DefaultDiepte := pxBoxDataObj.DefaultData.Diepte; - DefaultHoogte := pxBoxDataObj.DefaultData.Hoogte; - DefaultPlaatsing := pxBoxDataObj.DefaultData.Plaatsing; - DefaultOptiType := pxBoxDataObj.DefaultData.OptiType; + // Response + if GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult <> nil then + begin + // Mislukt + RegistreerMislukteOpzoeking(ProductVerpakkingenContext, GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult); + // Stop wanneer error is opgetreden + Result := TempProductVerpakkingen; + exit; + end; - DefaultPosities.AddRange(SplitString(pxBoxDataObj.DefaultData.Positie, ';')); - DefaultRichtingen.AddRange(SplitString(pxBoxDataObj.DefaultData.Rotatie, ';')); - end; + // Gelukt - // Verpakking parameters. haal waarden uit gewone data en default data. - Parameters.Clear(); - for I := 0 to High(pxBoxDataObj.Params) do - begin - NieuweVerpakkingParameter := TProductVerpakkingParameter.Create(); - NieuweVerpakkingParameter.ID := pxBoxDataObj.Params[I].ID; - NieuweVerpakkingParameter.ProgLabel := pxBoxDataObj.Params[I].ProgLabel; - NieuweVerpakkingParameter.ToolTip := pxBoxDataObj.Params[I].ToolTip; - NieuweVerpakkingParameter.Waarde := pxBoxDataObj.Params[I].Waarde; - if (pxBoxDataObj.DefaultData <> nil) and (High(pxBoxDataObj.Params) = High(pxBoxDataObj.DefaultData.Params)) then - NieuweVerpakkingParameter.DefaultWaarde := pxBoxDataObj.DefaultData.Params[I].Waarde; - Parameters.Add(NieuweVerpakkingParameter); - end; + // Andere velden juist zetten + ProductVerpakkingenContext.IsOK := True; + ProductVerpakkingenContext.ErrorMessage := ''; + ProductVerpakkingenContext.InternalErrorMessage := ''; - DeelVanID := pxBoxDataObj.DeelVanID; - DeelVanCaption := pxBoxDataObj.DeelVanCaption; + pxBoxDataObj := GetBoxDataViaIDResponseObj.varBoxData; - MetaCaption := pxBoxDataObj.MetaCaption; - end; + // Verpakking aanmaken, vullen met data en toevoegen aan temp lijst met productverpakkingen. + Verpakking := TProductVerpakking.Create(); + with Verpakking do + begin + RawData := pxBoxDataObj; + VolumeVanCaption := pxBoxDataObj.VolumeVanCaption; + ID := pxBoxDataObj.ID; + CutOrder := pxBoxDataObj.CutOrder; + Breedte := pxBoxDataObj.Breedte; + Diepte := pxBoxDataObj.Diepte; + Hoogte := pxBoxDataObj.Hoogte; + Aantal := pxBoxDataObj.Aantal; + MaxCombinAantal := pxBoxDataObj.MaxCombinAantal; + Plaatsing := pxBoxDataObj.Plaatsing; + OptiType := pxBoxDataObj.OptiType; - ProductVerpakkingenContext.ProductVerpakkingen.Add(Verpakking); + Posities.AddRange(SplitString(pxBoxDataObj.Positie, '')); + Richtingen.AddRange(SplitString(pxBoxDataObj.Rotatie, '')); + + // Default data instellen als deze aanwezig is. + if pxBoxDataObj.DefaultData <> nil then + begin + DefaultBreedte := pxBoxDataObj.DefaultData.Breedte; + DefaultDiepte := pxBoxDataObj.DefaultData.Diepte; + DefaultHoogte := pxBoxDataObj.DefaultData.Hoogte; + DefaultPlaatsing := pxBoxDataObj.DefaultData.Plaatsing; + DefaultOptiType := pxBoxDataObj.DefaultData.OptiType; + + DefaultPosities.AddRange(SplitString(pxBoxDataObj.DefaultData.Positie, ';')); + DefaultRichtingen.AddRange(SplitString(pxBoxDataObj.DefaultData.Rotatie, ';')); + end; + + // Speciale properties + DeelVanID := pxBoxDataObj.DeelVanID; + DeelVanCaption := pxBoxDataObj.DeelVanCaption; + MetaCaption := pxBoxDataObj.MetaCaption; + + // Verpakking parameters. Haal waarden uit gewone data en default data. + Parameters.Clear(); + for I := 0 to High(pxBoxDataObj.Params) do + begin + NieuweVerpakkingParameter := TProductVerpakkingParameter.Create(); + NieuweVerpakkingParameter.ID := pxBoxDataObj.Params[I].ID; + NieuweVerpakkingParameter.ProgLabel := pxBoxDataObj.Params[I].ProgLabel; + NieuweVerpakkingParameter.ToolTip := pxBoxDataObj.Params[I].ToolTip; + NieuweVerpakkingParameter.Waarde := pxBoxDataObj.Params[I].Waarde; + // Kijken of aantal parameters in default data overeenkomt met die in gewone data. + if (pxBoxDataObj.DefaultData <> nil) and (High(pxBoxDataObj.Params) = High(pxBoxDataObj.DefaultData.Params)) then + NieuweVerpakkingParameter.DefaultWaarde := pxBoxDataObj.DefaultData.Params[I].Waarde; + Parameters.Add(NieuweVerpakkingParameter); + end; + end; + + // Toevoegen aan temp lijst met productverpakkingen + TempProductVerpakkingen.Add(Verpakking); + end; + + Result := TempProductVerpakkingen; + finally + FreeAndNil(ZoekData); + end; end; procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductDetailContext: TProductVerpakkingenContext; pxStatusObj: OptiServerService.pxStatus); begin - ProductDetailContext.ProductVerpakkingen.Clear(); + ProductDetailContext.Reset(false); ProductDetailContext.IsOK := pxStatusObj.IsOK; ProductDetailContext.ErrorMessage := pxStatusObj.Message_; Index: VerpakkingsDefinitie/UI/GevondenProductenScherm.pas =================================================================== diff -u -r595 -r596 --- VerpakkingsDefinitie/UI/GevondenProductenScherm.pas (.../GevondenProductenScherm.pas) (revision 595) +++ VerpakkingsDefinitie/UI/GevondenProductenScherm.pas (.../GevondenProductenScherm.pas) (revision 596) @@ -74,7 +74,7 @@ ListViewProducten.Items.Clear(); ListViewProducten.Items.beginupdate(); - for Product in ApplicationContext.ProductsContext.Producten do + for Product in TProductsContext(Sender).Producten do begin With ListViewProducten.Items.Add Do begin Index: VerpakkingsDefinitie/UI/ProductDetailScherm.pas =================================================================== diff -u -r594 -r596 --- VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 594) +++ VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 596) @@ -12,7 +12,6 @@ resourceString GEEN_DATA_CAPTION = 'Geen product geselecteerd'; - NERGENS_DEEL_VAN_CAPTION = '--Nergens deel van--'; type TFormProductDetail = class(TFormSubscherm) @@ -31,18 +30,23 @@ procedure FormDestroy(Sender: TObject); procedure ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); private - FProductDetailsSubject: TSubject; - FProductDetailsSubjectObserver: TSubjectObserver; + FProductsContextSubject: TSubject; + FProductsContextSubjectObserver: TSubjectObserver; + FVerpakkingenContextSubject: TSubject; + FVerpakkingenContextSubjectObserver: TSubjectObserver; + FProductsAgent: TProductsAgent; LabelGeenData: TLabel; - procedure UpdateGui(Sender: TObject); - procedure UpdateControlsEnableStatus(); - procedure UpdateGuiDataAanwezigheid(Aanwezig: Boolean); + procedure UpdateGuiProduct(Sender: TObject); + procedure UpdateGuiVerpakkingen(Sender: TObject); + procedure LaadProductVerpakkingen(GeselecteerdProduct: TProductInformatie); + procedure UpdateVerpakkingControlsEnableStatus(); + procedure UpdateGuiProductAanwezigheid(Aanwezig: Boolean); public Constructor Create(AOwner: TComponent; Navigator: INavigator; ApplicationContext: TApplicationContext; - ProductDetailsSubject: TSubject; ProductsAgent: TProductsAgent); + ProductsContextSubject: TSubject; VerpakkingContextSubject: TSubject; ProductsAgent: TProductsAgent); end; implementation @@ -51,89 +55,107 @@ {$R *.dfm} Constructor TFormProductDetail.Create(AOwner: TComponent; Navigator: INavigator; ApplicationContext: TApplicationContext; - ProductDetailsSubject: TSubject; ProductsAgent: TProductsAgent); + ProductsContextSubject: TSubject; VerpakkingContextSubject: TSubject; ProductsAgent: TProductsAgent); begin inherited Create(AOwner, Navigator, ApplicationContext); - self.FProductDetailsSubject := ProductDetailsSubject; - self.FProductDetailsSubjectObserver := TSubjectObserver.Create(self); - self.FProductDetailsSubjectObserver.OnChange := UpdateGui; + + self.FProductsContextSubject := ProductsContextSubject; + self.FProductsContextSubjectObserver := TSubjectObserver.Create(self); + self.FProductsContextSubjectObserver.OnChange := UpdateGuiProduct; + + self.FVerpakkingenContextSubject := VerpakkingContextSubject; + self.FVerpakkingenContextSubjectObserver := TSubjectObserver.Create(self); + self.FVerpakkingenContextSubjectObserver.OnChange := UpdateGuiVerpakkingen; + self.FProductsAgent := ProductsAgent; end; procedure TFormProductDetail.FormCreate(Sender: TObject); begin // Registreer bij observer - FProductDetailsSubject.RegisterObserver(FProductDetailsSubjectObserver); + FProductsContextSubject.RegisterObserver(FProductsContextSubjectObserver); + FVerpakkingenContextSubject.RegisterObserver(FVerpakkingenContextSubjectObserver); end; procedure TFormProductDetail.FormDestroy(Sender: TObject); begin - FProductDetailsSubject.UnregisterObserver(FProductDetailsSubjectObserver); + FProductsContextSubject.UnregisterObserver(FProductsContextSubjectObserver); + FVerpakkingenContextSubject.UnregisterObserver(FVerpakkingenContextSubjectObserver); end; -procedure TFormProductDetail.ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); +procedure TFormProductDetail.UpdateGuiProduct(Sender: TObject); +var + GeselecteerdProduct: TProductInformatie; begin - if Selected then + GeselecteerdProduct := ApplicationContext.ProductsContext.GeselecteerdProduct; + if GeselecteerdProduct = nil then begin - ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := TProductVerpakking(ListViewVerpakkingen.Selected.Data); - ApplicationContext.ProductVerpakkingContext.NotifyChanged(); { TODO : Vervangen door notify changed in setter } + UpdateGuiProductAanwezigheid(False); + exit; end; + + // Product is geselecteerd + + // Update met data uit geselecteerd product + LabelOmschrijving1.Caption := GeselecteerdProduct.Omschrijving1; + LabelOmschrijving2.Caption := GeselecteerdProduct.Omschrijving2; + LabelProductNaam.Caption := GeselecteerdProduct.Kol1; + LabelProductNummer.Caption := intToStr(GeselecteerdProduct.ProductNr); + + UpdateGuiProductAanwezigheid(True); + + // Verpakkingen opzoeken horende bij dit geselecteerde product + LaadProductVerpakkingen(GeselecteerdProduct); end; -procedure TFormProductDetail.UpdateGui(Sender: TObject); +procedure TFormProductDetail.LaadProductVerpakkingen(GeselecteerdProduct: TProductInformatie); var - GeselecteerdProduct: TProductInformatie; ErrorMessage: string; - ProductVerpakking: TProductVerpakking; - VorigeIndexInList: Integer; begin - GeselecteerdProduct := ApplicationContext.ProductsContext.GeselecteerdProduct; + // Product informatie ophalen + FProductsAgent.ZoekProductVerpakkingenMetProductNr(GeselecteerdProduct.ProductNr, self.ApplicationContext.UserContext, + self.ApplicationContext.ProductVerpakkingContext); - if GeselecteerdProduct <> nil then + if self.ApplicationContext.ProductVerpakkingContext.IsOK then + // Gelukt + else begin - // Product informatie ophalen - FProductsAgent.ZoekProductVerpakkingenMetProductNr(GeselecteerdProduct.ProductNr, self.ApplicationContext.UserContext, - self.ApplicationContext.ProductVerpakkingContext); + // Opzoeking gefaald + ErrorMessage := self.ApplicationContext.ProductVerpakkingContext.ErrorMessage; + if self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage <> '' then + ErrorMessage := ErrorMessage + sLineBreak + self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage; - if self.ApplicationContext.ProductVerpakkingContext.IsOK then - // Gelukt - Navigator.NavigeerNaar(NAVTOONPRODUCTVERPAKKING) - else - begin - // Opzoeking gefaald - ErrorMessage := self.ApplicationContext.ProductVerpakkingContext.ErrorMessage; - if self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage <> '' then - begin - ErrorMessage := ErrorMessage + sLineBreak + self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage; - end; - - MessageDlg(ErrorMessage, TMsgDlgType.mtInformation, [mbOK], 0, mbCancel); - exit; - end; + MessageDlg(ErrorMessage, TMsgDlgType.mtInformation, [mbOK], 0, mbCancel); end; +end; - if (GeselecteerdProduct = nil) or (ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count = 0) then +procedure TFormProductDetail.ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); +begin + if Selected then begin - UpdateGuiDataAanwezigheid(False); - exit; - end - else - UpdateGuiDataAanwezigheid(True); + if ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking <> + TProductVerpakking(ListViewVerpakkingen.Selected.Data) then + begin + // Product selecteren. Wij doen de selectie en willen dus niet opnieuw worden opgeroepen. + FVerpakkingenContextSubjectObserver.Enabled := False; + ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := + TProductVerpakking(ListViewVerpakkingen.Selected.Data); + FVerpakkingenContextSubjectObserver.Enabled := True; + end; - UpdateControlsEnableStatus(); + Navigator.NavigeerNaar(NAVTOONPRODUCTVERPAKKING); + end; +end; - // Update met data uit ApplicationContext - LabelOmschrijving1.Caption := GeselecteerdProduct.Omschrijving1; - LabelOmschrijving2.Caption := GeselecteerdProduct.Omschrijving2; - LabelProductNaam.Caption := GeselecteerdProduct.Kol1; - LabelProductNummer.Caption := intToStr(GeselecteerdProduct.ProductNr); - - VorigeIndexInList := ListViewVerpakkingen.ItemIndex; - - // List view (grid) +procedure TFormProductDetail.UpdateGuiVerpakkingen(Sender: TObject); +var + ProductVerpakking: TProductVerpakking; +begin + // List view (grid). We vullen de lijst iedere keer opnieuw om wijzigingen aan verpakkingen te reflecteren. ListViewVerpakkingen.Items.BeginUpdate; + ListViewVerpakkingen.Clear(); - for ProductVerpakking in ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen do + for ProductVerpakking in TProductVerpakkingenContext(Sender).ProductVerpakkingen do begin With ListViewVerpakkingen.Items.Add Do begin @@ -144,28 +166,31 @@ SubItems.Add(ProductVerpakking.Breedte + ' x ' + ProductVerpakking.Diepte + ' x ' + ProductVerpakking.Hoogte); SubItems.Add(ProductVerpakking.Aantal); SubItems.Add(ProductVerpakking.MaxCombinAantal); - if ProductVerpakking.DeelVan <> nil then - SubItems.Add(ProductVerpakking.DeelVanCaption) - else - SubItems.Add(''); + SubItems.Add(ProductVerpakking.DeelVanCaption); SubItems.Add(ProductVerpakking.ID); end; end; ListViewVerpakkingen.Items.EndUpdate; - // Kijk of dezelfde verpakking als voor de update opnieuw geselecteerd kan worden - if (VorigeIndexInList >= 0) and (VorigeIndexInList < ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count) then - ProductVerpakking := ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen[VorigeIndexInList] - else if ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count > 0 then - // Default eerste verpakking selecteren - ProductVerpakking := ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen[0] + // Bepaal het geselecteerde item in de list view + if TProductVerpakkingenContext(Sender).GeselecteerdeVerpakking = nil then + begin + // Nog geen verpakking gekozen, selecteer er zelf een. Default de eerste. + if TProductVerpakkingenContext(Sender).ProductVerpakkingen.Count > 0 then + // Default eerste verpakking selecteren + ListViewVerpakkingen.ItemIndex := 0; + end else - ProductVerpakking := nil; // Geen verpakking aanwezig + begin + // Er was reeds een verpakking gekozen, selecteer de juiste index van de ListView + ListViewVerpakkingen.ItemIndex := TProductVerpakkingenContext(Sender) + .ProductVerpakkingen.IndexOf(TProductVerpakkingenContext(Sender).GeselecteerdeVerpakking); + end; - ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := ProductVerpakking; + UpdateVerpakkingControlsEnableStatus; end; -procedure TFormProductDetail.UpdateControlsEnableStatus(); +procedure TFormProductDetail.UpdateVerpakkingControlsEnableStatus(); var VerpakkingAanwezigEnGeselecteerd: Boolean; begin @@ -174,7 +199,7 @@ ButtonVerwijder.Enabled := VerpakkingAanwezigEnGeselecteerd; end; -procedure TFormProductDetail.UpdateGuiDataAanwezigheid(Aanwezig: Boolean); +procedure TFormProductDetail.UpdateGuiProductAanwezigheid(Aanwezig: Boolean); var I: Integer; begin Index: VerpakkingsDefinitie/UI/ObserverPattern.pas =================================================================== diff -u -r583 -r596 --- VerpakkingsDefinitie/UI/ObserverPattern.pas (.../ObserverPattern.pas) (revision 583) +++ VerpakkingsDefinitie/UI/ObserverPattern.pas (.../ObserverPattern.pas) (revision 596) @@ -12,9 +12,9 @@ FEnabled: Boolean; FOnChange: TNotifyEvent; protected - procedure Change; + procedure Change(Subject: TObject); public - constructor Create(AOwner: TComponent);override; + constructor Create(AOwner: TComponent); override; published property Enabled: Boolean read FEnabled write FEnabled; property OnChange: TNotifyEvent read FOnChange write FOnChange; @@ -39,10 +39,10 @@ self.FEnabled := True; end; -procedure TSubjectObserver.Change; +procedure TSubjectObserver.Change(Subject: TObject); begin if Assigned(FOnChange) then - FOnChange(self); + FOnChange(Subject); end; constructor TSubject.Create(); @@ -60,7 +60,7 @@ begin Obs := FObservers[I]; if Obs.Enabled then - Obs.Change; + Obs.Change(self); end; end; @@ -71,7 +71,7 @@ FObservers.Add(Observer); // Update nieuwe observer if Observer.Enabled then - Observer.Change; + Observer.Change(self); end; end; Index: VerpakkingsDefinitie/VerpakkingsDefinitie.dpr =================================================================== diff -u -r594 -r596 --- VerpakkingsDefinitie/VerpakkingsDefinitie.dpr (.../VerpakkingsDefinitie.dpr) (revision 594) +++ VerpakkingsDefinitie/VerpakkingsDefinitie.dpr (.../VerpakkingsDefinitie.dpr) (revision 596) @@ -22,7 +22,8 @@ CustomPanelVerpakkingParameter in 'UI\CustomPanelVerpakkingParameter.pas', NavProductScherm in 'UI\NavProductScherm.pas' {FormProductNav}, Navigator in 'UI\Navigator.pas', - VerpakkingDetailScherm in 'UI\VerpakkingDetailScherm.pas' {FormVerpakkingDetail}; + VerpakkingDetailScherm in 'UI\VerpakkingDetailScherm.pas' {FormVerpakkingDetail}, + ReadOnlyList in 'Other\ReadOnlyList.pas'; {$R *.res} Index: VerpakkingsDefinitie/UI/ProductDetailScherm.dfm =================================================================== diff -u -r594 -r596 --- VerpakkingsDefinitie/UI/ProductDetailScherm.dfm (.../ProductDetailScherm.dfm) (revision 594) +++ VerpakkingsDefinitie/UI/ProductDetailScherm.dfm (.../ProductDetailScherm.dfm) (revision 596) @@ -153,8 +153,6 @@ TabOrder = 0 ViewStyle = vsReport OnSelectItem = ListViewVerpakkingenSelectItem - ExplicitWidth = 663 - ExplicitHeight = 151 end object ButtonNieuw: TButton Left = 698 @@ -164,7 +162,6 @@ Anchors = [akTop, akRight] Caption = 'Nieuw' TabOrder = 1 - ExplicitLeft = 682 end object ButtonVerwijder: TButton Left = 698 @@ -174,7 +171,6 @@ Anchors = [akTop, akRight] Caption = 'Verwijder' TabOrder = 2 - ExplicitLeft = 682 end end end