LiveBindings - Delphi Day 2021
Transcript of LiveBindings - Delphi Day 2021
speaker: Maurizio Del Magno
Brutto anatroccolo o
cigno incompreso?
LiveBindings
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)
Levante software
Membro fondatore
LiveBindings
Brutto anatroccolo o
cigno incompreso?
Maurizio Del Magno
LIVEBINDINGSBRUTTO ANATROCCOLO O CIGNO INCOMPRESO?
Maurizio Del Magno
PATTI CHIARI AMICIZIA LUNGA - PRINCIPALE DIFETTO
• Lentezza• Miglioratonelleultimerelease
• Ulteriorimiglioramentiinroadmap
Maurizio Del Magno
• Lentezza• Miglioratonelleultimerelease
• Ulteriorimiglioramentiinroadmap
PATTI CHIARI AMICIZIA LUNGA - PRINCIPALE DIFETTO
Maurizio Del Magno
• Qualcosachepermettedicollegareilvalorediunaproprietàdiunoggettoqualsiasiadun’altraproprietàdiunaltrooggettoqualsiasi
• UnicostrumentodibindinginFiremonkey(FMX)
• DisponibileancheperprogettiVCL
LIVEBINDINGS
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?
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Ù?
Maurizio Del Magno
• Cosapermettedifare?
• E’customizzabile?
• ComeestendereLiveBindingsperadattarloallemieesigenze?
• Esistonolibreriecheestendonolesuefunzionalità?
DOMANDE…
Maurizio Del Magno
LIVEBINDINGSCOME È FATTO?
Maurizio Del Magno
• Expressionengine• Relationalespressions• Scope• Outputconverters
BASICS
Maurizio Del Magno
TBINDINGEXPRESSION
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
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;
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
Maurizio Del Magno
ISCOPE
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;
Maurizio Del Magno
• Inpratical’expressionengine(quindil’espressione)vedesoloIScope• DiversespecializzazionidiIScope
• IScopeEx(Lookupnotonlybynamebutobjectstoo)
• ICustomScope(canwrapacustomobject)
• IScopeEnumerator(loops)
• IScopeEnumerable(loops)• …
• Altogradodicustomizzazione
ISCOPE
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
Maurizio Del Magno
• Unit:System.Bindings.Methods(staticclass)
• Collezionedimetodipredefiniti(UpperCase,LowerCase,ToStr,Format,IfThen…)
• Possibilitàdiregistrareproprimetodicustom
• FornisceIScopeperrenderevisibiliall’expressionenginealcuniotuttiimetodiregistrati
ISCOPE - TBINDINGMETHODSFACTORY
Esempio:1.2
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)
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)
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;
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
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
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;
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
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)
Maurizio Del Magno
Source
Value
Scopes
IValue
IScope
String
TBINDINGEXPRESSION
5 IValue
‘3+2’‘3+2’
5 IValue
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
Maurizio Del Magno
OUTPUT CONVERTERS
Maurizio Del Magno
• Sonodeiparticolarimetodicustom
• Effettuanotrasformazioniditiposulrisultatodellavalutazionediun’espressione
• Nonvengonoinseritiesplicitamentenelleespressioni
• Altogradodicustomizzazione
OUTPUT CONVERTERS
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
Maurizio Del Magno
HIGH LEVEL COMPONENTS
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
Maurizio Del Magno
BIND SOURCES
Maurizio Del Magno
• Fontedidati
• Qualcosacheesponeall’expressionenginedeidatiprovenientida:
• DataSet(DB)
• Oggetti(singolioliste)
BIND SOURCES
Maurizio Del Magno
• Rende“visibile”unTDataSeteisuoicampinelcontestodiunaespressione(expressionengine)
• IncapsulaunTDataSeteisuoicampiinIScope
• RuolosimileaquellodeiTDataSource
• AncheluisicollegaaunTDataSetedesponeisuoicampiperilbinding(TDataSourceembedded)
• RendepossibilecollegareicampidelDataSetancheacomponentiNONDBAware(unicaopzioneinFiremonkey)
TBINDSOURCEDB
Maurizio Del Magno
TPROTOTYPEBINDSOURCE
• PermettelaprototipazionedellaUIcondatifake(siaaDTcheaRT)
• Devodefinirecampi(fieldseditor)
• Quantovorròpassareaidatirealidovròfornireunafontedidatirealichesostituiràilgeneratoredifakedata(eventoOnCreateAdapter)(RT)
• SviluppodiunprototipodiUIsenzaavereancoranemmenopensatoallafontedati(DB?,Objects?)ancheprima,ocontemporaneamente,losviluppodellalogicadidominioe/odelDB
Maurizio Del Magno
• Unafontedidati
• Adattaunoggetto(ounalistadioggetti)peresserepoiassegnatoaunTPrototypeBindSourcecomefontedidati
• RealeOOPsenzaperderelecaratteristicheRADdiDelphi
• RuolosimilealTDataSet(State,Edit,Post,Append,Cancel…)
• PostsuoggettinonsuDB(ancheDelete,Append…)
• TObjectBindSourceAdapter/TListBindSourceAdapter
• Nomaster-detail
TBINDSOURCEADAPTER
Maurizio Del Magno
• L’equivalenteperLiveBindingsdelTDBNavigator
• SicollegaaunBindSource
TBINDNAVIGATOR
Maurizio Del Magno
BINDING CLASSESI VERI LIVEBINDINGS
Maurizio Del Magno
• BindingExpressions(TBindExpression,TBindExprItems,NOTTBindingExpression)
• ListLiveBindings
• LinkLiveBindings
• QuickBindings
BINDING CLASSES I VERI LIVEBINDINGS
Maurizio Del Magno
• ILiveBindingssonocomponenticonunaopiùespressioni
• Leespressionisonovalutatedall’expressionengine,poiiLiveBindingsusanoilrisultatoperfarequalcosa(disolitosetdiunaproprietà)
• AlcuniLiveBindingshannopiùcollezionidiespressioni,possonoquindiavereeffettosupiùproprietà
• Seunaespressioneeseguemetodioppureassegna/leggeproprietàchehannometodiget/setsipossonoavereinteressanti“effetticollaterali”
LIVEBINDINGS VS EXPRESSIONS I VERI LIVEBINDINGS
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
Maurizio Del Magno
EXPRESSION EDITOR TBINDEXPRESSION
Esempio:2.1-2
Maurizio Del Magno
• PuòcontenerepiùdiunaBindExpression(tipicamenteda1a3)
• 2collezionidiBindExpressions:• Formatcollection:(Espressionicheassegnanounvalorequandoilcomponenteèattivo)
• Clearcollection:(Espressionicheassegnanounvalorequandoilcomponentevienedisabilitato)
• Managed
TBINDEXPRITEMS BINDING EXPRESSIONS
Maurizio Del Magno
EXPRESSION EDITOR TBINDEXPRITEMS
Esempio:2.3
Maurizio Del Magno
CUSTOM OUTPUT CONVERTER
(ESEMPIO)
Esempio:3
Maurizio Del Magno
LIST LIVEBINDINGS
Maurizio Del Magno
• LavoranoconcomponentibasatisuListe
• Unidirezionali(Sourcetocontrolonly)
• Unmanaged
• UsanoiBindSource
• TBindList
• TBindGridList
LIST LIVEBINDINGS
Maurizio Del Magno
• Target:ComboBox,ListBox,ListView
• 3collezionidiBindExpressions:
• Format(specificamentesullaproprietàTStrings)
• FormatControl(perilControlComponentquandoèattivo)
• ClearControl(perilControlComponentquandovienedisattivato)
• Puòconteneremolteespressioniperassegnarediverseproprietà,siadellaTStringschedelControlComponent
TBINDLIST
Maurizio Del Magno
EXPRESSION EDITOR TBINDLIST
Esempio:4
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
Maurizio Del Magno
EXPRESSION EDITOR TBINDGRIDLIST
Esempio:5
Maurizio Del Magno
LINK LIVEBINDINGS
Maurizio Del Magno
• ComeiListLiveBindingsusanoiBindSource
• Bidirezionali(read/write)
• Unmanaged
• Rendonopossibileuncomportamentosimil-DBAware(maconqualunquecomponente)
• 4componenti:• TBindLink• TBindPosition• TBindListLink(simileaTBindList)• TBindGridLink(simileaTBindGridList)
LINK LIVEBINDINGS
Maurizio Del Magno
• Collegauncontrollosingle-field(TEdit)conunaltrocomponente(tipicamenteunBindSource)
• Piùspecificamente:possonocollegarecontrollicheimplementanoleinterfacceIEditLinkObserveroppureIEditGridLinkObserver
• 3collezionidiBindExpressions:• Formatcollection:(Espressionicheassegnanounvalorequandoilcomponenteèattivo)
• Clearcollection:(Espressionicheassegnanounvalorequandoilcomponentevienedisabilitato)
• Parsecollection:(EspressionicheunvalorealSourceComponent,ControlToSource)
TBINDLINK
Maurizio Del Magno
EXPRESSION EDITOR TBINDLINK
Esempio:6.1
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
Maurizio Del Magno
EXPRESSION EDITOR TBINDPOSITION
Esempio:6.2
Maurizio Del Magno
• SimilealTBindListmabidirezionale
• Labidirezionalitàcomportalenecessitàdiulterioricollezionidiespressioni
• 6collezionidiBindExpressions:• FormatControlcollection
• ClearControlcollection• Formatcollection(specificamenteperlaproprietàTStrings)
• Parsecollection(comeFormatmaControlToSource)
• PosControlcollection(sincronizzazioneposizioneSourceToControl)• PosSourcecollection(comePosControlmaControlToSource)
TBINDLISTLINK
Maurizio Del Magno
EXPRESSION EDITOR TBINDLISTLINK
Esempio:6.3
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
Maurizio Del Magno
EXPRESSION EDITOR TBINDGRIDLINK
Esempio:6.4
Maurizio Del Magno
• Es:SelectedText(Self)
• VistonelleBindExpressiondellecollezioniCellParse(TBindGridLink)
• Estrarreildatoeditatodauncontrollo
• Ilcontrolloèspecificatodalparametro
• Selfsiriferiscealcontrollonelcontestodell’espressione
• NelcasodiunaStringGridsiriferisceall’InPlaceControldellacellacorrentechenonsarebbealtrimentiraggiungibile
SELECTEDTEXT METHOD
Esempio(rivedere):6.4
Maurizio Del Magno
QUICK BINDINGS
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
Maurizio Del Magno
LIVEBINDINGS DESIGNER
• CapiscequaleQuickBindingcreareautomaticamente
• Rendecomodoesemplicel’usodeiLiveBindings
• Nascondemoltadellacomplessitàsottostante
Esempio:7
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
Maurizio Del Magno
LIVEBINDINGS ACTIONS
Maurizio Del Magno
• ActionschereplicanosingolarmentelefunzionalitàdelTBindNavigator• First• Last• Prior• Next• Edit• Insert• Post• Cancel• …
LIVEBINDINGS ACTIONS
Maurizio Del Magno
I-ORM
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
Maurizio Del Magno
• Ingradodieffettuarelechiamateall’ORMautonomamente(facoltativo)
• Master-Detail
• AutoLoadData
• AutoPersist
• AutoPost(funziona)
• AutoRefresh
• Selectors
TIOPROTOTYPEBINDSOURCE
PizzaOrder
Maurizio Del Magno
DOMANDE?
Maurizio Del MagnoDeveloper
speaker: Maurizio Del Magno
i-ORM
DJSONgithub.com/mauriziodm/iORM
github.com/mauriziodm/DJSON
facebook.com/maurizio.delmagno
iORM + DJSON (group)
Levante software
Membro fondatore
Grazie!!!
https://github.com/delphiforce/eInvoice4DeInvoice4D