Volgens het MVVM protocol zijn de GUI componenten volledig geschreiden van het control model. Dat betekent dus dat een component als TImage niet als parameter mag worden doorgestuurd naar het control model, maar dat het resultaat teruggeven wordt via een functie naar het viewmodel waar TImage staat. Om het resultaat vanuit de database door te geven krijg je dan dit:
Met de TDatasource.OnChange zal je dan TImage kunnen vullen met het resultaat van ShowPicture.Delphi Code:
function tControlModel.ShowPicture : TPicture; var BlobStream: TStream; begin result := TPicture.create; BlobStream := TMemoryStream.Create; try if not DMModule.MyQuery.FieldByName('afbeelding').IsNull then begin DMModule.MyQuery.GetBlob(DMModule.MyQuery.FieldByName('afbeelding')).SaveToStream(BlobStream); Blobstream.Position := 0; result.loadfromstream(blobstream); end; finally BlobStream.Free; end; end;
Maar TDatasource is eigenlijk een datacomponent, die niet in het viewmodel mag staan.
Eigenlijk ben je met MVVM afhankelijk van livebindings, omdat deze buitenom sommige componenten linkt aan je controlmodel via TBindsourceDB component. Maar eigenlijk is dit een equivalent van TDatasource. Sterker nog; TBindsourceDB heeft een interne TDatasource in zich. Kan je dan spreken over datascheiding?
Is het uberhaubt mogelijk om zonder livebindings gebruik te maken van het MVVM model in Delphi?
Bookmarks