LiveBindings - Delphi Day 2021

79
speaker: Maurizio Del Magno Brutto anatroccolo o cigno incompreso? LiveBindings

Transcript of LiveBindings - Delphi Day 2021

Page 1: LiveBindings - Delphi Day 2021

speaker: Maurizio Del Magno

Brutto anatroccolo o

cigno incompreso?

LiveBindings

Page 2: LiveBindings - Delphi Day 2021

https://github.com/delphiforce/eInvoice4DeInvoice4D

Maurizio Del MagnoDeveloper

speaker: Maurizio Del Magno

i-ORM

DJSONgithub.com/mauriziodm/iORM

github.com/mauriziodm/DJSON

facebook.com/maurizio.delmagno

iORM + DJSON (group)

[email protected]

[email protected]

Levante software

Membro fondatore

LiveBindings

Brutto anatroccolo o

cigno incompreso?

Page 3: LiveBindings - Delphi Day 2021

Maurizio Del Magno

LIVEBINDINGSBRUTTO ANATROCCOLO O CIGNO INCOMPRESO?

Page 4: LiveBindings - Delphi Day 2021

Maurizio Del Magno

PATTI CHIARI AMICIZIA LUNGA - PRINCIPALE DIFETTO

• Lentezza• Miglioratonelleultimerelease

• Ulteriorimiglioramentiinroadmap

Page 5: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Lentezza• Miglioratonelleultimerelease

• Ulteriorimiglioramentiinroadmap

PATTI CHIARI AMICIZIA LUNGA - PRINCIPALE DIFETTO

Page 6: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Qualcosachepermettedicollegareilvalorediunaproprietàdiunoggettoqualsiasiadun’altraproprietàdiunaltrooggettoqualsiasi

• UnicostrumentodibindinginFiremonkey(FMX)

• DisponibileancheperprogettiVCL

LIVEBINDINGS

Page 7: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Ilconcettodiassociazioneeinterazionetraoggettinonènuovo• ComponentiTDataSet&DBAware• MeccanismodiowningdiTComponenteclassiderivate

• Classiprogettatespecificamentepercollaboraretraloroinmodorigido

• Implementanoproprietàemetodiconcordatiinprecedenza

• Disponibilitàperunnumerolimitatodiclassi

• LaprogrammazioneDataSetorientednonèOOP• Dov’èilsingolopuntodovemetterelabusinesslogic?• Lamanutenibilitàdiventafacilmenteunproblema• Codicedifficilmentetestabile(unittest)

E’ UN CONCETTO NUOVO?

Page 8: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Sipuòcollegarequalsiasicosaaqualsiasialtracosa• Nonsièlimitatiaclassi/componenti/oggettispecifici

• Sipossonomettereinrelazioneoggettianchenonprogettatipercollaboraretraloro

• SipossonobindareTDataSetancheacontrollinonDBAware(ancheVCL)• Sipossonobindareoggetti“vivi”aqualunquecontrollo• RealeprogrammazioneOOPancheinunambienteRAD

• Leclassideldomainmodelincludonoanchelalogicadibusiness• BastacodiceinOnBefore…OnAfter…• Classifacilmentetestabili(unittest)• Codicepiùmanutenibileeriutilizzabile• Interigrafidioggetti,anchecomplessi,comesorgentedidati

LIVEBINDINGS: FA DI PIÙ?

Page 9: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Cosapermettedifare?

• E’customizzabile?

• ComeestendereLiveBindingsperadattarloallemieesigenze?

• Esistonolibreriecheestendonolesuefunzionalità?

DOMANDE…

Page 10: LiveBindings - Delphi Day 2021

Maurizio Del Magno

LIVEBINDINGSCOME È FATTO?

Page 11: LiveBindings - Delphi Day 2021
Page 12: LiveBindings - Delphi Day 2021
Page 13: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Expressionengine• Relationalespressions• Scope• Outputconverters

BASICS

Page 14: LiveBindings - Delphi Day 2021

Maurizio Del Magno

TBINDINGEXPRESSION

Page 15: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Unit:System.Bindings.Expression

• Abstractclass• Incapsulal’expressionengine(System.Bindings.Evaluator)

• TBindingExpressionDefault(èlaclassepiùabassolivellochelaimplementa)

• Input—>propertySource:String(expression)• Apicisingoliodoppi

• CaseSensitive

• Output—>IValue(System.Bindings.EvalProtocol)

TBINDINGEXPRESSION

Page 16: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Unit:System.Bindings.EvalProtocol

• SibasasuTValue• Puòcontenerequalsiasitipodivalore

• Simplevalues(string,integer,float,date&time,boolean…)

• Enumerati

• Oggetti

• Interfacce

• …

IVALUE

IValue = interface ['{A495F901-72F5-4384-BA50-EC3B4B42F6C2}'] function GetType: PTypeInfo; function GetValue: TValue; end;

Page 17: LiveBindings - Delphi Day 2021

Maurizio Del Magno

var

Expr:TBindingExpression;

ExprResult:IValue;

begin

Expr:=TBindingExpressionDefault.Create(nil);

try

Expr.Source:=‘5+3*(2+4)’;

Expr.Compile([],[],[]);

ExprResult:=Expr.Evaluate;

WriteLn(ExprResult.GetValue.ToString);

finally

Expr.Free;

end;

end;

TBINDINGEXPRESSION SAMPLE

Creazioneistanza

Definizionedell’espressione

Compilazione

Valutazione

Esempio:1.1

Page 18: LiveBindings - Delphi Day 2021

Maurizio Del Magno

ISCOPE

Page 19: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Unit:System.Bindings.EvalProtocol

• Rende“visibile”qualcosaall’expressionenginenelcontestodell’espressione

• Oggetti

• Componenti

• Metodi

• Costanti

ISCOPE

IScope = interface ['{DAFE2455-3DB6-40CC-B1D6-1EAC0A29ABEC}'] function Lookup(const Name: string): IInterface; end;

Page 20: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Inpratical’expressionengine(quindil’espressione)vedesoloIScope• DiversespecializzazionidiIScope

• IScopeEx(Lookupnotonlybynamebutobjectstoo)

• ICustomScope(canwrapacustomobject)

• IScopeEnumerator(loops)

• IScopeEnumerable(loops)• …

• Altogradodicustomizzazione

ISCOPE

Page 21: LiveBindings - Delphi Day 2021

Maurizio Del Magno

var

Expr:TBindingExpression;

ExprResult:IValue;

begin

Expr:=TBindingExpressionDefault.Create(nil);

try

Expr.Source:=‘5+3*(2+4)’;

Expr.Compile([],[],[]);

ExprResult:=Expr.Evaluate;

WriteLn(ExprResult.GetValue.ToString);

finally

Expr.Free;

end;

end;

ISCOPE

ArrayofTComponents(accessibileconilnomespecificatonellaproprietà“Name”)ArrayofTBindingAssociationArrayofIScope

Page 22: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Unit:System.Bindings.Methods(staticclass)

• Collezionedimetodipredefiniti(UpperCase,LowerCase,ToStr,Format,IfThen…)

• Possibilitàdiregistrareproprimetodicustom

• FornisceIScopeperrenderevisibiliall’expressionenginealcuniotuttiimetodiregistrati

ISCOPE - TBINDINGMETHODSFACTORY

Esempio:1.2

Page 23: LiveBindings - Delphi Day 2021

Maurizio Del Magno

TBindingMethodsFactory.RegisterMethod(

TMethodDescription.Create(MakeInvokable(

function(Args:TArray<IValue>):IValue

var

StrValue:String;

begin

StrValue:=Args[0].GetValue.AsString;

Result:=TValueWrapper.Create(CapitalizeString(StrValue));

end),

'Capitalize',//Methodidentifier

'Capitalize',//Methodname

'Utilities',//Unitnamewherethemethodisdefined

True,//Enabled

'Capitalizethefirstletterofeverywordinthestring',//Longmethoddescription(Hint)

nil//Method'splatform(TComponent=VCL;TFMXComponent=FMX;nil=both)

)

);

TBINDINGMETHODSFACTORY SAMPLE

Esempio:1.3

Registranuovometodo(parametroTMethodDescription)

CreaunaTMethodDescription(1°parametroIInvokable)

Anonimousmethod(attenzioneaiparametri)

WrapdelrisultatoinunIValue

Wrapdell’anonimomethodinunaIInvokable(parametroTInvokableBody)

Page 24: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• E’possibileaggiungeremetodicustomsenzalafactory(TCustomMethodsFactory)

• TBindingshelperclass(System.Bindings.Helper)

• classfunctionTBindings.CreateMethodScope(constMethodName:string;InvokableMethod:IInvokable):IScope;

ISCOPE - CUSTOM METHOD (NO FACTORY)

Esempio:1.4

var

LScope:IScope;

begin

LScope:=TBindings.CreateMethodScope('PutStars',

MakeInvokable(

function(Args:TArray<IValue>):IValue

begin

Result:=TValueWrapper.Create('***'+Args[0].GetValue.AsString+'***');

end

)

);

end;

CreaunoIScopeperilmetodo(2°parametroIInvokable)

Anonimousmethod(attenzioneaiparametri)

WrapdelrisultatoinunIValue

Wrapdell’anonimomethodinunaIInvokable(parametroTInvokableBody)

Page 25: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• functionWrapObject(AObject:TObject):IScope;(System.Bindings.ObjEval)

• Wrapdell’oggettoinunIScope

ISCOPE - OBJECTS

Esempio:1.5

var

LScope:IScope;

begin

LScope:=WrapObject(TPerson.Create('Mario',‘Rossi','01/07/1980'));

end;

Page 26: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• GliIScopesonogerarchici• Inrealtàl’espressionericevesempreunsoloIScope(rootscope)

• IlrootscopehapoiunaseriediIScopeinnestati

• GliIScopeinnestatipossoalorovoltacontenerealtriIScopeulteriormenteinnestati

• UnagerarchiadiIScopeconunmeccanismodiLookup(multilivello)• TDictionaryScopeèunoIScope(implemental’interfacciaIScope-System.Bindings.EvalSys)

• ContieneunacollezionediIScopeognunoassociatoaunnome

• Lachiavedeldictionaryèancheilnomeconilqualequelloscopesaràvisibilenell’espressione

ISCOPE - TDICTIONARYSCOPE

Page 27: LiveBindings - Delphi Day 2021

Maurizio Del Magno

var

LPerson:TPerson;

LPersonScope:IScope;

LDictionaryScope:TDictionaryScope;

begin

LPerson:=TPerson.Create('Maurizio','DelMagno','22/10/1970');

LPersonScope:=WrapObject(LPerson);

LDictionaryScope:=TDictionaryScope.Create;

LDictionaryScope.Map.Add('Person',LPersonScope);

end;

ISCOPE - TDICTIONARYSCOPE SAMPLE

Esempio:1.6

WrapdiLPersoninunIScope

CreazionedelTDictionaryScope

Aggiungeloscopeallacollezioneassociandogliunnome

Page 28: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Unit:System.Bindings.Expression;

• E’unrecord• Associazioneununoggettoaunnome

• L’oggettosarà“visibile”nelcontestodell’espressioneconquelnome

• DietrolequintevienecomunquecreatounIScope

TBINDINGASSOCIATION

TBindingAssociation=record

public

RealObject:TObject;

ScriptObject:String;

constructorCreate(ARealObject:TObject;constAScriptObject:String);

end;

Page 29: LiveBindings - Delphi Day 2021

Maurizio Del Magno

TBINDINGASSOCIATION SAMPLEvar

LExpr:TBindingExpression;

LPerson:TPerson;

begin

LPerson:=TPerson.Create(‘Mario’,‘Rossi’,’14/08/1972’);

LExpr.Compile([],[TBindingAssociation.Create(LPerson,‘Person’)].[]);

end;

var

LExpr:TBindingExpression;

begin

LExpr.Associations.Add(TPerson.Create(‘Mario’,‘Rossi’,’14/08/1972’),‘Person’);

end;

or

Esempio:1.7

Page 30: LiveBindings - Delphi Day 2021

Maurizio Del Magno

Source

Value

Scopes

IValue

IScope

String

TBINDINGEXPRESSION

TBinding Expression

System.Bindings.Expression

Unit System.Bindings.EvalProtocol; … IValue = interface function GetType: PTypeInfo; function GetValue: TValue; end;

Unit System.Bindings.EvalProtocol; … IScope = interface function Lookup(const Name: string) IInterface; end;

• Ritorna il risultato dell’espressione

• Può contenere qualunque tipo di valore

• String, Integer, TDateTime, Boolean

• Object, Interface, Record, Array

• Enumerated

• Determina la visibilità di “qualcosa" nel contesto dell’espressione

• Metodi, oggetti, variabili, variabili globali ecc.

• Customizzazione, adattamento dell’engine alle mie esigenze

• ‘(6+2)/(5-3)*-1’

• ‘Sono le ore ‘ + ToStr(10)

• Person.FullName+‘ is ‘+ToStr(Person.Age)+‘ years old’

• Source expression: (relational expression)

Page 31: LiveBindings - Delphi Day 2021

Maurizio Del Magno

Source

Value

Scopes

IValue

IScope

String

TBINDINGEXPRESSION

5 IValue

‘3+2’‘3+2’

5 IValue

Page 32: LiveBindings - Delphi Day 2021

Maurizio Del Magno

ToStr(3+5) Source

Value

Scopes

IValue

IScope

String

TBINDINGEXPRESSION

‘5’ IValue

ToStr(3+5)

‘5’ IValue

TFunctions

IScope

UpperCase

LowerCase

ToStrToStr

Custom

Methods

IScope

PutStars

Capitalize

DigitsOnly

Custom

Objects IScope

Person

Pizza

Order

Page 33: LiveBindings - Delphi Day 2021

Maurizio Del Magno

OUTPUT CONVERTERS

Page 34: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Sonodeiparticolarimetodicustom

• Effettuanotrasformazioniditiposulrisultatodellavalutazionediun’espressione

• Nonvengonoinseritiesplicitamentenelleespressioni

• Altogradodicustomizzazione

OUTPUT CONVERTERS

Page 35: LiveBindings - Delphi Day 2021

Maurizio Del Magno

TValueRefConverterFactory.RegisterConversion(TypeInfo(Integer),TypeInfo(String),

TConverterDescription.Create(

procedure(constInValue:TValue;varOutValue:TValue)

begin

OutValue:=InValue.AsString;

end,

'IntToStr',//Methodidentifier

'IntToStr',//Methodname

‘U.Converters’,//Unitnamewherethemethodisdefined

True,//Enabled

‘Convertanintegerintoastring',//Longmethoddescription(Hint)

nil//Converterplatform(TComponent=VCL;TFMXComponent=FMX;nil=both)

)

);

OUTPUT CONVERTERS SAMPLE

Page 36: LiveBindings - Delphi Day 2021

Maurizio Del Magno

HIGH LEVEL COMPONENTS

Page 37: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• TBindingList• MantieneunalistaBindingClasses(espressioni)suunaform

• Methods&OutputConverterscollections

• Expressioneditor

• Bindingclasses• BindingExpressions(TBindExpression,TBindExprItems,NOTTBindingExpression)

• ListLiveBindings

• LinkLiveBindings

• QuickBindings

• Bindsources• TBindSourceDB

• TPrototypeBindSource

• (TAdapterBindSource)

HIGH LEVEL COMPONENTS

Page 38: LiveBindings - Delphi Day 2021

Maurizio Del Magno

BIND SOURCES

Page 39: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Fontedidati

• Qualcosacheesponeall’expressionenginedeidatiprovenientida:

• DataSet(DB)

• Oggetti(singolioliste)

BIND SOURCES

Page 40: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Rende“visibile”unTDataSeteisuoicampinelcontestodiunaespressione(expressionengine)

• IncapsulaunTDataSeteisuoicampiinIScope

• RuolosimileaquellodeiTDataSource

• AncheluisicollegaaunTDataSetedesponeisuoicampiperilbinding(TDataSourceembedded)

• RendepossibilecollegareicampidelDataSetancheacomponentiNONDBAware(unicaopzioneinFiremonkey)

TBINDSOURCEDB

Page 41: LiveBindings - Delphi Day 2021

Maurizio Del Magno

TPROTOTYPEBINDSOURCE

• PermettelaprototipazionedellaUIcondatifake(siaaDTcheaRT)

• Devodefinirecampi(fieldseditor)

• Quantovorròpassareaidatirealidovròfornireunafontedidatirealichesostituiràilgeneratoredifakedata(eventoOnCreateAdapter)(RT)

• SviluppodiunprototipodiUIsenzaavereancoranemmenopensatoallafontedati(DB?,Objects?)ancheprima,ocontemporaneamente,losviluppodellalogicadidominioe/odelDB

Page 42: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Unafontedidati

• Adattaunoggetto(ounalistadioggetti)peresserepoiassegnatoaunTPrototypeBindSourcecomefontedidati

• RealeOOPsenzaperderelecaratteristicheRADdiDelphi

• RuolosimilealTDataSet(State,Edit,Post,Append,Cancel…)

• PostsuoggettinonsuDB(ancheDelete,Append…)

• TObjectBindSourceAdapter/TListBindSourceAdapter

• Nomaster-detail

TBINDSOURCEADAPTER

Page 43: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• L’equivalenteperLiveBindingsdelTDBNavigator

• SicollegaaunBindSource

TBINDNAVIGATOR

Page 44: LiveBindings - Delphi Day 2021

Maurizio Del Magno

BINDING CLASSESI VERI LIVEBINDINGS

Page 45: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• BindingExpressions(TBindExpression,TBindExprItems,NOTTBindingExpression)

• ListLiveBindings

• LinkLiveBindings

• QuickBindings

BINDING CLASSES I VERI LIVEBINDINGS

Page 46: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• ILiveBindingssonocomponenticonunaopiùespressioni

• Leespressionisonovalutatedall’expressionengine,poiiLiveBindingsusanoilrisultatoperfarequalcosa(disolitosetdiunaproprietà)

• AlcuniLiveBindingshannopiùcollezionidiespressioni,possonoquindiavereeffettosupiùproprietà

• Seunaespressioneeseguemetodioppureassegna/leggeproprietàchehannometodiget/setsipossonoavereinteressanti“effetticollaterali”

LIVEBINDINGS VS EXPRESSIONS I VERI LIVEBINDINGS

Page 47: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• E’lapiùsemplicedelleclassiLiveBindings

• Collegaduecomponenti

• IncapsulaunaBindingExpression,creagliIScopenecessariperfar“vedere”glioggettiinteressatiall’engine,valutal’espressioneeassegnailrisultatoalControlComponent

• SourceComponent+SourceExpression

• ControlComponent+ControlExpression

• Direction(SourceToControl,ControlToSource,Bidirectional)• Managed

TBINDEXPRESSION BINDING EXPRESSIONS

Page 48: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDEXPRESSION

Esempio:2.1-2

Page 49: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• PuòcontenerepiùdiunaBindExpression(tipicamenteda1a3)

• 2collezionidiBindExpressions:• Formatcollection:(Espressionicheassegnanounvalorequandoilcomponenteèattivo)

• Clearcollection:(Espressionicheassegnanounvalorequandoilcomponentevienedisabilitato)

• Managed

TBINDEXPRITEMS BINDING EXPRESSIONS

Page 50: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDEXPRITEMS

Esempio:2.3

Page 51: LiveBindings - Delphi Day 2021

Maurizio Del Magno

CUSTOM OUTPUT CONVERTER

(ESEMPIO)

Esempio:3

Page 52: LiveBindings - Delphi Day 2021

Maurizio Del Magno

LIST LIVEBINDINGS

Page 53: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• LavoranoconcomponentibasatisuListe

• Unidirezionali(Sourcetocontrolonly)

• Unmanaged

• UsanoiBindSource

• TBindList

• TBindGridList

LIST LIVEBINDINGS

Page 54: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Target:ComboBox,ListBox,ListView

• 3collezionidiBindExpressions:

• Format(specificamentesullaproprietàTStrings)

• FormatControl(perilControlComponentquandoèattivo)

• ClearControl(perilControlComponentquandovienedisattivato)

• Puòconteneremolteespressioniperassegnarediverseproprietà,siadellaTStringschedelControlComponent

TBINDLIST

Page 55: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDLIST

Esempio:4

Page 56: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Target:Grids(listediliste)

• Legrigliesonocomponentipiùcomplessi,servonomoltepiùespressioni

• 3collezionidiBindExpressions:

• FormatControl(perinizializzareilControlComponentall’attivazione)

• ClearControl(perfinalizzareilControlComponentalladisattivazione)

• Columns(inrealtàèunacollezionedicollezionidicollezionidiespressioni)• ColumnName(FieldName)

• ColFormat(target:colonna)• CellFormat(target:cella)

TBINDGRIDLIST

Page 57: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDGRIDLIST

Esempio:5

Page 58: LiveBindings - Delphi Day 2021

Maurizio Del Magno

LINK LIVEBINDINGS

Page 59: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• ComeiListLiveBindingsusanoiBindSource

• Bidirezionali(read/write)

• Unmanaged

• Rendonopossibileuncomportamentosimil-DBAware(maconqualunquecomponente)

• 4componenti:• TBindLink• TBindPosition• TBindListLink(simileaTBindList)• TBindGridLink(simileaTBindGridList)

LINK LIVEBINDINGS

Page 60: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Collegauncontrollosingle-field(TEdit)conunaltrocomponente(tipicamenteunBindSource)

• Piùspecificamente:possonocollegarecontrollicheimplementanoleinterfacceIEditLinkObserveroppureIEditGridLinkObserver

• 3collezionidiBindExpressions:• Formatcollection:(Espressionicheassegnanounvalorequandoilcomponenteèattivo)

• Clearcollection:(Espressionicheassegnanounvalorequandoilcomponentevienedisabilitato)

• Parsecollection:(EspressionicheunvalorealSourceComponent,ControlToSource)

TBINDLINK

Page 61: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDLINK

Esempio:6.1

Page 62: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• E’ilpiùlimitatodei4LinkLiveBindings

• Solopercomponentiche“esprimono”unconcettodiposizionerelativa

• Icomponentidevonoimplementarel’interfacciaIPositionObserver

• 3collezionidiBindExpressions:• PosControl:(assegnanounaposizionerelativaalControlComponentbasandosisuunaproprietàordinaldelSourceComponent-Es.TStringGrid,TScrollBar)

• PosClearcollection:(FinalizzanoilControlComponentinunaposizione“neutrale”alladisattivazionedelLiveBinding)

• PosSourcecollection:(comelaPosControlmaControlToSource)

• E’l’asteriscodelLiveBindingDesigner,mantienesincronizzateleposizionirelativedelSourceComponenteedelControlComponent

TBINDPOSITION

Page 63: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDPOSITION

Esempio:6.2

Page 64: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• SimilealTBindListmabidirezionale

• Labidirezionalitàcomportalenecessitàdiulterioricollezionidiespressioni

• 6collezionidiBindExpressions:• FormatControlcollection

• ClearControlcollection• Formatcollection(specificamenteperlaproprietàTStrings)

• Parsecollection(comeFormatmaControlToSource)

• PosControlcollection(sincronizzazioneposizioneSourceToControl)• PosSourcecollection(comePosControlmaControlToSource)

TBINDLISTLINK

Page 65: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDLISTLINK

Esempio:6.3

Page 66: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• SimilealTBindGridListmabidirezionale

• E’ilpiùcomplessodeiLinkLiveBindings(maconleconoscenzeacquisitedovrebbeesserefacilecapire)

• 5collezionidiBindExpressions:• FormatControlcollection

• ClearControlcollection• PosControlcollection(sincronizzazioneposizioneSourceToControl)• PosSourcecollection(comePosControlmaControlToSource)

• Columns(inrealtàèunacollezionedicollezionidicollezionidiespressioni)• ColumnName(FieldName)

• ColFormat(target:colonna)• CellFormat(target:cella)

TBINDGRIDLINK

Page 67: LiveBindings - Delphi Day 2021

Maurizio Del Magno

EXPRESSION EDITOR TBINDGRIDLINK

Esempio:6.4

Page 68: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Es:SelectedText(Self)

• VistonelleBindExpressiondellecollezioniCellParse(TBindGridLink)

• Estrarreildatoeditatodauncontrollo

• Ilcontrolloèspecificatodalparametro

• Selfsiriferiscealcontrollonelcontestodell’espressione

• NelcasodiunaStringGridsiriferisceall’InPlaceControldellacellacorrentechenonsarebbealtrimentiraggiungibile

SELECTEDTEXT METHOD

Esempio(rivedere):6.4

Page 69: LiveBindings - Delphi Day 2021

Maurizio Del Magno

QUICK BINDINGS

Page 70: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Sonol’incapsulamentodituttequelleespressionichescriveremmonel95%deicasi

• Ilpiùdellavoltecollegano:• uncampodiunasorgentedatiauncomponenteeviceversa(Edit,ComboBox,ListBox,Grids…)• unaproprietàdiunoggettoauncomponenteeviceversa(Edit,ComboBox,ListBox,Grids…)• uncomponenteaunaltrocomponente

• InquesticasiuseròiQuickBindings,neglialtri(5%)…

• EspressionigenerateautomaticamenteeReadOnly

• CreatiautomaticamentedalLiveBindingDesigner(VisualLiveBindings)odaiWizard

• IlLiveBindingDesignercapiscequalecreareautomaticamente

• Rendonocomodoesemplicel’usodeiLiveBindings

• Nascondonomoltadellacomplessitàsottostante

QUICK BINDINGS

Page 71: LiveBindings - Delphi Day 2021

Maurizio Del Magno

LIVEBINDINGS DESIGNER

• CapiscequaleQuickBindingcreareautomaticamente

• Rendecomodoesemplicel’usodeiLiveBindings

• Nascondemoltadellacomplessitàsottostante

Esempio:7

Page 72: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• NeiQuickBindingsleespressioninonsonomodificabili

• LeproprietàCustomFormateCustomParsepermettonodiformattareildatoaidueestremidellink

• CustomFormatformattailrisultatodellavalutazionedell’espressioneprimachesiaassegnatoalControlComponent(SourceToControl)

• CustomParseformattaildatolettodalControlComponentprimachevengaritornatoalSourceControl(ControlToSource)

• %srappresentailrisultatodellaSourceExpressionchel’enginehagiàvalutatoevienepassatoallaCustomFormatchevienepre-parsataepoieseguitacomeControlExpression(es:UpperCase(%s))

• Perquestomotivoeventualialtricaratteri“%”usatiinfunzionicomela“Format”devonoessereraddoppiati

• es:Format(‘%%.2f%%%%’,%s)vienetradottainFormat(‘%.2f%%’,123.5)cheproduce123,50%

• Se%sèunnumeroevaformattato(es:currency)usareFormat(‘%%m’,Self.AsFloat+0.0)

CUSTOMFORMAT - CUSTOMPARSE

Page 73: LiveBindings - Delphi Day 2021

Maurizio Del Magno

LIVEBINDINGS ACTIONS

Page 74: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• ActionschereplicanosingolarmentelefunzionalitàdelTBindNavigator• First• Last• Prior• Next• Edit• Insert• Post• Cancel• …

LIVEBINDINGS ACTIONS

Page 75: LiveBindings - Delphi Day 2021

Maurizio Del Magno

I-ORM

Page 76: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• InterfacedO.R.M.

• DependencyInjectionContainer

• MVVMframework

• Deepserializer/deserializer(DJSON)

• LiveBindingsExtensions• ActiveBindSourceAdapters(TActiveInterfaceListBindSourceAdapter,TActiveInterfaceObjectBindSourceAdapter,TActiveListBindSourceAdapter,TActiveObjectBindSourceAdapter,TNaturalBindSourceAdapter)

• TioPrototypeBindSource• TioModelPresenter(MVVM)• TioModelBindSource(MVVM)• TioModelDataSet(MVVM)

I-ORM

Page 77: LiveBindings - Delphi Day 2021

Maurizio Del Magno

• Ingradodieffettuarelechiamateall’ORMautonomamente(facoltativo)

• Master-Detail

• AutoLoadData

• AutoPersist

• AutoPost(funziona)

• AutoRefresh

• Selectors

TIOPROTOTYPEBINDSOURCE

PizzaOrder

Page 78: LiveBindings - Delphi Day 2021

Maurizio Del Magno

DOMANDE?

Page 79: LiveBindings - Delphi Day 2021

Maurizio Del MagnoDeveloper

speaker: Maurizio Del Magno

i-ORM

DJSONgithub.com/mauriziodm/iORM

github.com/mauriziodm/DJSON

facebook.com/maurizio.delmagno

iORM + DJSON (group)

[email protected]

[email protected]

Levante software

Membro fondatore

Grazie!!!

https://github.com/delphiforce/eInvoice4DeInvoice4D