unit ProductDetailScherm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections, Vcl.ExtCtrls, Subscherm, Main, ApplicationContext, ObserverPattern, Vcl.ComCtrls, Vcl.CheckLst, CheckCombo; resourceString GEEN_DATA_CAPTION = 'Geen data om te tonen'; NERGENS_DEEL_VAN_CAPTION = '--Nergens deel van--'; type TFormProductDetail = class(TFormSubscherm) LabelOmschrijving1: TLabel; LabelOmschrijving2: TLabel; Label1: TLabel; LabelProductNaam: TLabel; ListViewVerpakkingen: TListView; GroupBox1: TGroupBox; ButtonNieuw: TButton; ButtonVerwijder: TButton; Label2: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; EditMeta: TEdit; ComboBoxDeelVan: TComboBox; EditBreedte: TEdit; EditDiepte: TEdit; EditHoogte: TEdit; EditMaxCombAantal: TEdit; EditAantal: TEdit; ComboBoxPlaatsing: TComboBox; ComboBoxPositie: TComboBox; ComboBoxRichting: TComboBox; ButtonMeta: TButton; PanelVerpakkingControls: TPanel; Label3: TLabel; EditVolumeVan: TEdit; Label14: TLabel; ComboBoxOptiType: TComboBox; LabelProductNummer: TLabel; Label17: TLabel; ScrollBoxParameters: TScrollBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); private FProductDetailsSubject: TSubject; FProductDetailsSubjectObserver: TSubjectObserver; LabelGeenData: TLabel; CheckComboBoxPositie: TCheckedComboBox; CheckComboBoxRichting: TCheckedComboBox; procedure UpdateGui(Sender: TObject); procedure ToonProductVerpakking(ProductVerpakking: TProductVerpakking); procedure UpdateControlsEnableStatus(); procedure UpdateGuiDataAanwezigheid(Aanwezig: Boolean); procedure LaadEnSelecteerWaardenComboBox(Waarden: TDictionary; ComboBox: TComboBox; GeselecteerdeWaarde: string; DefaultGeselecteerdeWaarde: string; Vertaling: TDictionary); procedure LaadEnSelecteerWaardenCheckComboBox(Waarden: TDictionary; CheckedComboBox: TCheckedComboBox; GeselecteerdeWaarden: TList; DefaultGeselecteerdeWaarden: TList; Vertaling: TDictionary); public Constructor Create(AOwner: TComponent; Navigator: INavigator; ApplicationContext: TApplicationContext; ProductDetailsSubject: TSubject); end; implementation uses OptiServerService, Util, System.StrUtils, CustomPanelVerpakkingParameter; {$R *.dfm} Constructor TFormProductDetail.Create(AOwner: TComponent; Navigator: INavigator; ApplicationContext: TApplicationContext; ProductDetailsSubject: TSubject); begin inherited Create(AOwner, Navigator, ApplicationContext); self.FProductDetailsSubject := ProductDetailsSubject; self.FProductDetailsSubjectObserver := TSubjectObserver.Create(self); self.FProductDetailsSubjectObserver.OnChange := UpdateGui; end; procedure TFormProductDetail.FormCreate(Sender: TObject); begin FProductDetailsSubject.RegisterObserver(FProductDetailsSubjectObserver); // Vervang sommige comboboxen door TCheckedComboBox CheckComboBoxPositie := TCheckedComboBox.Create(self); with CheckComboBoxPositie do CheckComboBoxPositie.Delimiter := ';'; TUtil.VervangControl(ComboBoxPositie, CheckComboBoxPositie); CheckComboBoxRichting := TCheckedComboBox.Create(self); with CheckComboBoxRichting do CheckComboBoxRichting.Delimiter := ';'; TUtil.VervangControl(ComboBoxRichting, CheckComboBoxRichting); end; procedure TFormProductDetail.FormDestroy(Sender: TObject); begin FProductDetailsSubject.UnregisterObserver(FProductDetailsSubjectObserver); end; procedure TFormProductDetail.ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); begin if Selected then if (ListViewVerpakkingen.Selected.Data <> nil) then ToonProductVerpakking(TProductVerpakking(ListViewVerpakkingen.Selected.Data)); end; procedure TFormProductDetail.UpdateGui(Sender: TObject); var GeselecteerdProduct: TProductInformatie; ProductVerpakking: TProductVerpakking; VorigeIndexInList: Integer; begin GeselecteerdProduct := ApplicationContext.ProductsContext.GeselecteerdProduct; if (GeselecteerdProduct = nil) or (ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count = 0) then begin UpdateGuiDataAanwezigheid(False); exit; end else UpdateGuiDataAanwezigheid(True); // 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) ListViewVerpakkingen.Items.BeginUpdate; ListViewVerpakkingen.Clear(); for ProductVerpakking in ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen do begin With ListViewVerpakkingen.Items.Add Do begin Data := ProductVerpakking; // Caption := IntToStr(Product.ProductNr); // Deze casting geeft geen access violation Caption := intToStr(ProductVerpakking.CutOrder); SubItems.Add(ProductVerpakking.MetaCaptionDisplay); 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.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 ProductVerpakking := ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen[0] // Default eerste verpakking selecteren else ProductVerpakking := nil; // Geen verpakking aanwezig if ProductVerpakking <> nil then ToonProductVerpakking(ProductVerpakking); UpdateControlsEnableStatus() end; procedure TFormProductDetail.ToonProductVerpakking(ProductVerpakking: TProductVerpakking); var Item: string; Parameter: TProductVerpakkingParameter; NieuweParameterControl: TCustomPanelVerpakkingParameter; begin // Linkerhelft EditMeta.Text := ProductVerpakking.MetaCaptionDisplay; EditVolumeVan.Text := ProductVerpakking.VolumeVanCaption; // DeelVan ComboBoxDeelVan.Items.Clear(); // ComboBox vullen en item selecteren. for Item in ApplicationContext.ProductVerpakkingContext.GetDeelVanOpties(ProductVerpakking) do begin ComboBoxDeelVan.Items.Add(Item); end; ComboBoxDeelVan.Items.Add(NERGENS_DEEL_VAN_CAPTION); // Item selecteren if ProductVerpakking.DeelVan <> nil then // Index zoeken in lijst van producten ComboBoxDeelVan.ItemIndex := ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.IndexOf (ProductVerpakking.DeelVan) else // Default waarde: 'niks' optie selecteren ComboBoxDeelVan.ItemIndex := ComboBoxDeelVan.Items.Count - 1; // Breedte, Diepte, Hoogte. // Default waarde altijd als placeholder instellen EditBreedte.TextHint := ProductVerpakking.DefaultBreedte; // Default if ProductVerpakking.Breedte <> '' then EditBreedte.Text := ProductVerpakking.Breedte; EditDiepte.TextHint := ProductVerpakking.DefaultDiepte; // Default if ProductVerpakking.Diepte <> '' then EditDiepte.Text := ProductVerpakking.Diepte; EditHoogte.TextHint := ProductVerpakking.DefaultHoogte; // Default if ProductVerpakking.Hoogte <> '' then EditHoogte.Text := ProductVerpakking.Hoogte; // Max.Comb.Aantal, Aantal EditMaxCombAantal.Text := ProductVerpakking.MaxCombinAantal; EditAantal.Text := ProductVerpakking.Aantal; // Parameters TUtil.FreeControlChildrenDeep(ScrollBoxParameters); for Parameter in ProductVerpakking.Parameters do begin NieuweParameterControl := TCustomPanelVerpakkingParameter.Create(ScrollBoxParameters); with NieuweParameterControl do begin Parent := ScrollBoxParameters; ProductVerpakkingParameter := Parameter; end; end; // Rechterhelft // Plaatsing LaadEnSelecteerWaardenComboBox(ApplicationContext.UiInstellingenContext.Plaatsing, ComboBoxPlaatsing, ProductVerpakking.Plaatsing, ProductVerpakking.DefaultPlaatsing, ApplicationContext.UiInstellingenContext.Plaatsing); // Positie LaadEnSelecteerWaardenCheckComboBox(ApplicationContext.UiInstellingenContext.Posities, CheckComboBoxPositie, ProductVerpakking.Posities, ProductVerpakking.DefaultPosities, ApplicationContext.UiInstellingenContext.Posities); // Richting LaadEnSelecteerWaardenCheckComboBox(ApplicationContext.UiInstellingenContext.Richtingen, CheckComboBoxRichting, ProductVerpakking.Richtingen, ProductVerpakking.DefaultRichtingen, ApplicationContext.UiInstellingenContext.Richtingen); // OptiType LaadEnSelecteerWaardenComboBox(ApplicationContext.UiInstellingenContext.OptiTypes, ComboBoxOptiType, ProductVerpakking.OptiType, ProductVerpakking.DefaultOptiType, ApplicationContext.UiInstellingenContext.OptiTypes); end; procedure TFormProductDetail.LaadEnSelecteerWaardenComboBox(Waarden: TDictionary; ComboBox: TComboBox; GeselecteerdeWaarde: string; DefaultGeselecteerdeWaarde: string; Vertaling: TDictionary); var Item: string; begin ComboBox.Items.Clear(); // Vullen for Item in Waarden.keys do ComboBox.Items.AddObject(Vertaling[Item], TObject(Item)); // Items selecteren. Als waarde niet aanwezig is, uit default halen. Als dat niet gaat eerste item selecteren. if (GeselecteerdeWaarde <> '') and (Vertaling.TryGetValue(GeselecteerdeWaarde, Item) = True) then ComboBox.ItemIndex := ComboBox.Items.IndexOf(Item) else if (DefaultGeselecteerdeWaarde <> '') and (Vertaling.TryGetValue(DefaultGeselecteerdeWaarde, Item) = True) then ComboBox.ItemIndex := ComboBox.Items.IndexOf(Item) // Default else if ComboBox.Items.Count > 0 then ComboBox.ItemIndex := 0; // Geen waarde, geen default, eerste item selecteren. end; procedure TFormProductDetail.LaadEnSelecteerWaardenCheckComboBox(Waarden: TDictionary; CheckedComboBox: TCheckedComboBox; GeselecteerdeWaarden: TList; DefaultGeselecteerdeWaarden: TList; Vertaling: TDictionary); var Item: string; TempStr: string; begin CheckedComboBox.Items.Clear(); // CheckComboBox vullen. for Item in Waarden.keys do CheckedComboBox.Items.AddObject(Waarden[Item], TObject(Item)); // Items selecteren. Als waarde niet aanwezig is, uit default halen. if GeselecteerdeWaarden.Count > 0 then begin for Item in GeselecteerdeWaarden do if Vertaling.TryGetValue(Item, TempStr) = True then begin if CheckedComboBox.Items.IndexOf(TempStr) >= 0 then CheckedComboBox.Checked[CheckedComboBox.Items.IndexOf(TempStr)] := True; end; end else // Default waarden for Item in DefaultGeselecteerdeWaarden do if Vertaling.TryGetValue(Item, TempStr) = True then begin if CheckedComboBox.Items.IndexOf(TempStr) >= 0 then CheckedComboBox.Checked[CheckedComboBox.Items.IndexOf(TempStr)] := True; end; end; procedure TFormProductDetail.UpdateControlsEnableStatus(); var VerpakkingAanwezigEnGeselecteerd: Boolean; I: Integer; begin // Details controls enable status aanpassen naargelang er een verpakking geselecteerd is. VerpakkingAanwezigEnGeselecteerd := (ListViewVerpakkingen.Items.Count = 0) or (ListViewVerpakkingen.ItemIndex < 0); for I := 0 to PanelVerpakkingControls.ControlCount - 1 do if Assigned(PanelVerpakkingControls.Controls[I]) then PanelVerpakkingControls.Controls[I].Enabled := VerpakkingAanwezigEnGeselecteerd; ButtonVerwijder.Enabled := VerpakkingAanwezigEnGeselecteerd; // Linkerdeel EditMeta.Enabled := False; EditVolumeVan.Enabled := False; ComboBoxDeelVan.Enabled := (ComboBoxDeelVan.Items.Count > 0) and VerpakkingAanwezigEnGeselecteerd; end; procedure TFormProductDetail.UpdateGuiDataAanwezigheid(Aanwezig: Boolean); var I: Integer; begin if Aanwezig then begin // Skip update als alles al zichtbaar staat. if Assigned(LabelGeenData) = False then exit; // Wel resultaten, toon alles. for I := 0 to self.ControlCount - 1 do if Assigned(self.Controls[I]) then self.Controls[I].Visible := True; LabelGeenData.Visible := False; PanelVerpakkingControls.Refresh(); // Anders verdwijnt label enkel op resize FreeAndNil(LabelGeenData); end else begin // Skip update als melding al getoond wordt en alles onzichtbaar staat. if Assigned(LabelGeenData) then exit; // Geen resultaten, verberg kinderen, toon melding (label) en stop. for I := 0 to self.ControlCount - 1 do if Assigned(self.Controls[I]) then self.Controls[I].Visible := False; // Label tonen LabelGeenData := TLabel.Create(self); with LabelGeenData do begin Parent := self; Caption := GEEN_DATA_CAPTION; Font.Size := 15; // Centreren: https://stackoverflow.com/questions/18545937/make-a-component-appear-in-the-middle-of-form-no-matter-what-screen-resolution Left := (self.Width - Width) div 2; Top := (self.Height - Height) div 2; Anchors := []; // Relatief tegenover parent end; end end; end.