Index: VerpakkingsDefinitie/VerpakkingsDefinitie.dproj =================================================================== diff -u -r556 -r559 --- VerpakkingsDefinitie/VerpakkingsDefinitie.dproj (.../VerpakkingsDefinitie.dproj) (revision 556) +++ VerpakkingsDefinitie/VerpakkingsDefinitie.dproj (.../VerpakkingsDefinitie.dproj) (revision 559) @@ -108,6 +108,7 @@ + Cfg_2 Base Index: VerpakkingsDefinitie/UI/ZoekProductenScherm.dfm =================================================================== diff -u -r557 -r559 --- VerpakkingsDefinitie/UI/ZoekProductenScherm.dfm (.../ZoekProductenScherm.dfm) (revision 557) +++ VerpakkingsDefinitie/UI/ZoekProductenScherm.dfm (.../ZoekProductenScherm.dfm) (revision 559) @@ -84,34 +84,18 @@ object TabSheetIdentificatieNr: TTabSheet Caption = 'Identificatie nr' ImageIndex = 1 - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 end object TabSheetLeveranciersRef: TTabSheet Caption = 'Leveranciers ref' ImageIndex = 2 - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 end object TabSheetTekst: TTabSheet Caption = 'Tekst' ImageIndex = 3 - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 end object TabSheetProductboom: TTabSheet Caption = 'Productboom' ImageIndex = 4 - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 end end end Index: VerpakkingsDefinitie/Main.pas =================================================================== diff -u -r558 -r559 --- VerpakkingsDefinitie/Main.pas (.../Main.pas) (revision 558) +++ VerpakkingsDefinitie/Main.pas (.../Main.pas) (revision 559) @@ -19,6 +19,8 @@ procedure NavigeerNaar(schermId: Integer); end; + TControlArray = Array of TControl; + TFormMain = class(TForm, INavigator) PanelMain: TPanel; procedure FormCreate(Sender: TObject); @@ -27,21 +29,22 @@ FAppContext: TApplicationContext; FUserAgent: TUserAgent; FProductAgent: TProductsAgent; - procedure FreeControlChildrenRec(AControl: TControl); - procedure ConfigureerLayoutGridPanel(GridPanel: TGridPanel); - procedure PlaatsControlOpGrid(GridPanel: TGridPanel; Control: TControl; RowI: Integer; ColI: Integer; RowSpan: Integer = 1; - ColSpan: Integer = 1); public procedure NavigeerNaar(schermId: Integer); end; + TCustomControl = Class(TControl) + + End; + var FormMain: TFormMain; implementation uses - Subscherm, LogInScherm, ZoekProductenScherm, GebruikerScherm; + Subscherm, NavGridPanel, Util, + LogInScherm, ZoekProductenScherm, GebruikerScherm; {$R *.dfm} @@ -67,8 +70,7 @@ procedure TFormMain.NavigeerNaar(schermId: Integer); var NieuwScherm: TControl; - GridPanel: TGridPanel; - NieuweGridControl: TControl; + NavGridPanelStandard: TNavGridPanelStandard; i: Integer; begin Application.ProcessMessages; // Interrupts the execution of an application so that it can process the message queue. @@ -77,31 +79,27 @@ // PanelMain behouden we altijd, the children can be free. for i := 0 to PanelMain.ControlCount - 1 do - FreeControlChildrenRec(PanelMain.Controls[i]); + TUtilControls.FreeControlChildrenRec(PanelMain.Controls[i]); case schermId of NAVHOME, NAVZOEKPRODUCTEN: begin { TODO -cUI : Onderzoeken of 'TSplitter' een beter alternatief is dan volledig een gridview } - // Gebruikersgegevens scherm, zoekscherm, resultaten en detail scherm tonen. - GridPanel := TGridPanel.Create(PanelMain); - NieuwScherm := GridPanel; // Nieuw scherm instellen, de configuratie is grid panel specifiek (daarom andere variabele). - ConfigureerLayoutGridPanel(GridPanel); - // Schermen op GridPanel plaatsen - // PlaatsControlOpGrid(GridPanel; Control; RowI; ColI; (opt) RowSpan; (opt)ColSpan); - // Gebruikersgegevens scherm bovenaan. - NieuweGridControl := TFormGebruiker.Create(GridPanel, Self, FAppContext, FAppContext.UserContext, FUserAgent); - PlaatsControlOpGrid(GridPanel, NieuweGridControl, 0, 0, 1, 2); + + // Gebruikersgegevens scherm, zoekscherm, resultaten en detail scherm inladen. + NavGridPanelStandard := TNavGridPanelStandard.Create(PanelMain); + NieuwScherm := NavGridPanelStandard; + // Gebruikersgegevens scherm bovenaan // Zoekscherm daaronder links - NieuweGridControl := TFormZoekProducten.Create(GridPanel, Self, FAppContext, FProductAgent); - PlaatsControlOpGrid(GridPanel, NieuweGridControl, 1, 0); // Resultaten scherm daaronder links - NieuweGridControl := TFormLogin.Create(GridPanel, Self, FAppContext, FUserAgent); - PlaatsControlOpGrid(GridPanel, NieuweGridControl, 2, 0); // Rechts is helemaal voor detail scherm - NieuweGridControl := TFormLogin.Create(GridPanel, Self, FAppContext, FUserAgent); - PlaatsControlOpGrid(GridPanel, NieuweGridControl, 1, 1, 2); + NavGridPanelStandard.Init(TFormGebruiker.Create(NavGridPanelStandard, Self, FAppContext, FAppContext.UserContext, + FUserAgent), + TFormZoekProducten.Create(NavGridPanelStandard, Self, FAppContext, FProductAgent), + TFormLogin.Create(NavGridPanelStandard, Self, FAppContext, FUserAgent), + TFormLogin.Create(NavGridPanelStandard, Self, FAppContext, FUserAgent)); end; + NAVLOGIN: NieuwScherm := TFormLogin.Create(PanelMain, Self, FAppContext, FUserAgent); end; @@ -111,100 +109,4 @@ NieuwScherm.Show; end; -// Recursieve methode om de kinderen van een TWinControl te free-en (hanging pointers voorkomen) -// Gebaseerd op: https://stackoverflow.com/questions/414928/is-there-any-way-to-get-all-the-controls-on-a-container-control -procedure TFormMain.FreeControlChildrenRec(AControl: TControl); -var - item: TControl; - i: Integer; -begin - if AControl = nil then - Exit; - if AControl is TWinControl then - begin - i := 0; - // Tijden het free-en kan zijn dat er elementen verdwijnen uit de lijst. - // Het aantal elementen moet dus steeds opnieuw gecontroleerd worden (een for-lus berekent dit eenmalig) - while TWinControl(AControl).ControlCount < i do - begin - FreeControlChildrenRec(TWinControl(AControl).Controls[i]); - end; - end; - AControl.Free(); -end; - -procedure TFormMain.ConfigureerLayoutGridPanel(GridPanel: TGridPanel); -const - colLeftSize: Integer = 375; - rowTopSize: Integer = 40; - rowMidSize: Integer = 200; -begin - // Rijen en kolommen toevoegen - - GridPanel.RowCollection.BeginUpdate; - GridPanel.ColumnCollection.BeginUpdate; - - GridPanel.RowCollection.Clear; - GridPanel.ColumnCollection.Clear; - - // Balk bovenaan met vaste hoogte voor gebruikersgegevens - with GridPanel.RowCollection.Add do - begin - SizeStyle := ssAbsolute; - Value := rowTopSize; - end; - - // Daaronder links opzoek scherm met vaste hoogte - with GridPanel.RowCollection.Add do - begin - SizeStyle := ssAbsolute; - Value := rowMidSize; - end; - - // Daaronder het resultaten scherm, dit schaalt automatisch - with GridPanel.RowCollection.Add do - begin - // De Autosize optie zou kijken naar het child. Hier is het de bedoeling dat het Grid Panel maximaal groeit. - SizeStyle := ssPercent; - Value := 100; - end; - - // Linkerhelft van de schermen heeft vaste breedte - with GridPanel.ColumnCollection.Add do - begin - SizeStyle := ssAbsolute; - Value := colLeftSize; - end; - - // Rechterhelft is volledig voor detail scherm - with GridPanel.ColumnCollection.Add do - begin - // De Autosize optie zou kijken naar het child. Hier is het de bedoeling dat het Grid Panel maximaal groeit. - SizeStyle := ssPercent; - Value := 100; - end; - - GridPanel.RowCollection.EndUpdate; - GridPanel.ColumnCollection.EndUpdate; -end; - -procedure TFormMain.PlaatsControlOpGrid(GridPanel: TGridPanel; Control: TControl; RowI: Integer; ColI: Integer; - RowSpan: Integer = 1; ColSpan: Integer = 1); -var - index: Integer; -begin - // Toevoegen aan grid panel op eerste lege plaats (Bij het toevoegen kan dit niet worden gekozen. - // Het wordt in de eerste lege plaats gezet) - Control.Parent := GridPanel; - Control.Visible := true; // Staat default op false - Control.Align := alClient; // Maakt elementen zo groot als het kan - Control.AlignWithMargins := true; // Spacing tussen de schermen - // Positie binnen grid aanpassen - index := GridPanel.ControlCollection.IndexOf(Control); - GridPanel.ControlCollection[index].row := RowI; - GridPanel.ControlCollection[index].RowSpan := RowSpan; - GridPanel.ControlCollection[index].Column := ColI; - GridPanel.ControlCollection[index].ColumnSpan := ColSpan; -end; - end. Index: VerpakkingsDefinitie/UI/NavGridPanel.pas =================================================================== diff -u --- VerpakkingsDefinitie/UI/NavGridPanel.pas (revision 0) +++ VerpakkingsDefinitie/UI/NavGridPanel.pas (revision 559) @@ -0,0 +1,109 @@ +unit NavGridPanel; + +interface + +uses + Vcl.Controls, Vcl.ExtCtrls, System.Classes, + Main, ApplicationContext; + +type + TNavGridPanel = class(TGridPanel) + public + procedure PlaatsControlOpGrid(Control: TControl; RowI: Integer; ColI: Integer; RowSpan: Integer = 1; ColSpan: Integer = 1); + end; + + TNavGridPanelStandard = class(TNavGridPanel) + public + procedure Init(Bovenaan : TControl; Links1:TControl; Links2:TControl; Rechts:TControl); + end; + +implementation + +procedure TNavGridPanel.PlaatsControlOpGrid(Control: TControl; RowI: Integer; ColI: Integer; RowSpan: Integer = 1; + ColSpan: Integer = 1); +var + index: Integer; +begin + // Toevoegen aan grid panel op eerste lege plaats (Bij het toevoegen kan dit niet worden gekozen. + // Het wordt in de eerste lege plaats gezet) + Control.Parent := self; + Control.Visible := True; // Staat default op false + Control.Align := alClient; // Maakt elementen zo groot als het kan + Control.AlignWithMargins := True; // Spacing tussen de schermen + // Positie binnen grid aanpassen + index := self.ControlCollection.IndexOf(Control); + self.ControlCollection[index].row := RowI; + self.ControlCollection[index].RowSpan := RowSpan; + self.ControlCollection[index].Column := ColI; + self.ControlCollection[index].ColumnSpan := ColSpan; +end; + +procedure TNavGridPanelStandard.Init(Bovenaan : TControl; Links1:TControl; Links2:TControl; Rechts:TControl); +// Boven, links, links, rechts +const + colLeftSize: Integer = 375; + rowTopSize: Integer = 40; + rowMidSize: Integer = 200; +begin + // Rijen en kolommen toevoegen + + self.RowCollection.BeginUpdate; + self.ColumnCollection.BeginUpdate; + + self.RowCollection.Clear; + self.ColumnCollection.Clear; + + // Balk bovenaan met vaste hoogte voor gebruikersgegevens + with self.RowCollection.Add do + begin + SizeStyle := ssAbsolute; + Value := rowTopSize; + end; + + // Daaronder links opzoek scherm met vaste hoogte + with self.RowCollection.Add do + begin + SizeStyle := ssAbsolute; + Value := rowMidSize; + end; + + // Daaronder het resultaten scherm, dit schaalt automatisch + with self.RowCollection.Add do + begin + // De Autosize optie zou kijken naar het child. Hier is het de bedoeling dat het Grid Panel maximaal groeit. + SizeStyle := ssPercent; + Value := 100; + end; + + // Linkerhelft van de schermen heeft vaste breedte + with self.ColumnCollection.Add do + begin + SizeStyle := ssAbsolute; + Value := colLeftSize; + end; + + // Rechterhelft is volledig voor detail scherm + with self.ColumnCollection.Add do + begin + // De Autosize optie zou kijken naar het child. Hier is het de bedoeling dat het Grid Panel maximaal groeit. + SizeStyle := ssPercent; + Value := 100; + end; + + self.RowCollection.EndUpdate; + self.ColumnCollection.EndUpdate; + + // Schermen op GridPanel plaatsen + + // PlaatsControlOpGrid(Control; RowI; ColI; (opt) RowSpan; (opt)ColSpan); + // Scherm bovenaan. + self.PlaatsControlOpGrid(Bovenaan, 0, 0, 1, 2); + // Daaronder links + self.PlaatsControlOpGrid(Links1, 1, 0); + // Daaronder links + self.PlaatsControlOpGrid(Links2, 2, 0); + // Rechts is helemaal + self.PlaatsControlOpGrid(Rechts, 1, 1, 2); +end; + +end. Index: VerpakkingsDefinitie/VerpakkingsDefinitie.dpr =================================================================== diff -u -r556 -r559 --- VerpakkingsDefinitie/VerpakkingsDefinitie.dpr (.../VerpakkingsDefinitie.dpr) (revision 556) +++ VerpakkingsDefinitie/VerpakkingsDefinitie.dpr (.../VerpakkingsDefinitie.dpr) (revision 559) @@ -13,7 +13,8 @@ GebruikerScherm in 'UI\GebruikerScherm.pas' {FormGebruiker}, ObserverPattern in 'UI\ObserverPattern.pas', SelectService in 'WS\SelectService.pas', - ProductsAgent in 'WS\ProductsAgent.pas'; + ProductsAgent in 'WS\ProductsAgent.pas', + NavGridPanel in 'UI\NavGridPanel.pas'; {$R *.res} Index: VerpakkingsDefinitie/UI/ZoekProductenScherm.pas =================================================================== diff -u -r558 -r559 --- VerpakkingsDefinitie/UI/ZoekProductenScherm.pas (.../ZoekProductenScherm.pas) (revision 558) +++ VerpakkingsDefinitie/UI/ZoekProductenScherm.pas (.../ZoekProductenScherm.pas) (revision 559) @@ -72,12 +72,8 @@ FProductAgent.ZoekOpMetKortTekst(EditZoek.Text, EditKlantNr.Text, ComboBoxAt.Text, self.ApplicationContext.UserContext, self.ApplicationContext.ProductsContext); - if ApplicationContext.ProductsContext.IsOK then + if ApplicationContext.ProductsContext.IsOK = False then begin - self.Navigator.NavigeerNaar(Main.NAVZOEKPRODUCTEN); - end - else - begin // Opzoeking gefaald ErrorMessage := ApplicationContext.ProductsContext.ErrorMessage; if ApplicationContext.ProductsContext.InternalErrorMessage <> '' then Index: VerpakkingsDefinitie/UI/Util.pas =================================================================== diff -u -r551 -r559 --- VerpakkingsDefinitie/UI/Util.pas (.../Util.pas) (revision 551) +++ VerpakkingsDefinitie/UI/Util.pas (.../Util.pas) (revision 559) @@ -2,15 +2,44 @@ interface -uses System.Types, Vcl.Graphics; // Color lightener +uses + Vcl.Controls, // Free control children + System.Types, Vcl.Graphics; // Color lightener type + TUtilControls = class + class procedure FreeControlChildrenRec(AControl: TControl); + end; + TUtilColorLightener = class - class function LightenColor(RGB: Cardinal; Percentage: Integer): Cardinal;static; + class function LightenColor(RGB: Cardinal; Percentage: Integer): Cardinal; static; end; implementation +// FREE CONTROL CHILDREN +// Recursieve methode om de kinderen van een TWinControl te free-en (hanging pointers voorkomen) +// Gebaseerd op: https://stackoverflow.com/questions/414928/is-there-any-way-to-get-all-the-controls-on-a-container-control +class procedure TUtilControls.FreeControlChildrenRec(AControl: TControl); +var + item: TControl; + i: Integer; +begin + if AControl = nil then + exit; + if AControl is TWinControl then + begin + i := 0; + // Tijden het free-en kan zijn dat er elementen verdwijnen uit de lijst. + // Het aantal elementen moet dus steeds opnieuw gecontroleerd worden (een for-lus berekent dit eenmalig) + while TWinControl(AControl).ControlCount < i do + begin + FreeControlChildrenRec(TWinControl(AControl).Controls[i]); + end; + end; + AControl.Free(); +end; + // COLOR LIGHTENER // https://stackoverflow.com/questions/39569710/how-to-lighten-or-darken-a-specified-tcolor-in-inno-setup-pascal-script function GetRValue(RGB: Cardinal): Byte;