Generic Rutine å velge Fet Elements

The SelectBoldElement funksjonen gir en gjenbrukbar og fleksibel måte å velge objekter eller lists.function SelectBoldElement (Root: TBoldElement; sOCL: string; params: Array of const; eClass: ExceptClass; errmsg: string; Container: TBoldElement = nil; INPS: Boolean = false; Vars: TBoldExternalVariableList = null): TBoldElement; konst cLastElement = $ FFFF; Var OCL: string; id: TBoldIndirectElement; ReturnListElementX: Boolean; Element: Integer; begynne resultat: = null; Element: = 0; ReturnListElementX: = False; hvis Root = null deretter rot: = TBoldSystem.DefaultSystem; Hevde (ikke (Container er TBoldObject), 'SelectBoldElement kan ikke returnere BoldObjects i beholderen parameter'); Hevde (Assigned (Root), Avslutning å velge uten et åpent system '); id: = TBoldIndirectElement.Create; prøv OCL: = Format (sOCL, Params); //Denne koden gjør at denne rutinen til transparent velge en "første" eller "siste" objekt i PS if (store bokstaver (Copy (OCL, Lengde (OCL) -6, 8)) = '- > FØRSTE') og ( INPS) da begynne SetLength (OCL, Lengde (OCL) 7); ReturnListElementX: = true; slutt; if (store bokstaver (Copy (OCL, Lengde (OCL) -5, 8)) = '- > LAST') og (INPS) da begynne SetLength (OCL, Lengde (OCL) -6); ReturnListElementX: = true; Element: = cLastElement; slutt; Root.EvaluateExpression (OCL, id, INPS, Vars); //Hvis ingenting ble valgt, komme seg ut, enten ved å heve den bruker levert feil, eller stille if (ikke Assigned (id.Value)) eller ((id.Value er TBoldList) og (TBoldList (id.Value) .Count = 0)) så hvis Assigned (eClass) deretter heve EClass.Create (errmsg) annet Exit; //Ikke noe å vende tilbake, komme seg ut //Eies verdier kan ikke bli returnert i resultat, så må ha en container, med mindre dette er en INPS utvalg (ReturnListElementX) hvis id.OwnsValue og (ikke Assigned (Container)) og (ikke ReturnListElementX) deretter //Det kan være lurt å bytte ut denne feilen klassen med noe mer spesifikt for å gjøre det lettere å felle heve Exception.CreateFmt ('SelectBoldElement kan ikke returnere valgt type% s', [id.Value.ClassName]); hvis id.Value er TBoldObject deretter begynne //BoldObjects eies av systemet og kan bare gå tilbake i resultat resultat: = id.Value; ender annet hvis id.Value er TBoldObjectReference deretter begynne //SingleLinks hold eid gjenstander som går tilbake i resultat resultat: = (id.Value som TBoldObjectReference) .BoldObject; ende else if (id.Value er TBoldList) da begynne //Noen lister er eid og kan gå tilbake i resultatet dersom ikke id.OwnsValue da resultere: = id.Value; //En INPS utvalg alltid returnerer en liste, hvis innringeren ønsket det første elementet, vil dette bli satt hvis ReturnListElementX deretter begynne Assert (TBoldList (id.Value) .Count > 0, 'Logic svikt, SelectBoldElement'); hvis Element = cLastElement da resultere: = TBoldList (id.Value) [TBoldList (id.Value) .Count-1] annet resultat: = TBoldList (id.Value) [0]; //Tilfellet med null telling var allerede tatt vare på slutten ellers //Hvis brukeren har passert en beholder for resultatet, satte den der hvis (Container er TBoldList) så TBoldList (Container) .AddList (TBoldList (id.Value) ); ende else if (id.Value er TBoldAttribute) da begynne hvis Assigned (Container) og (Container er TBoldAttribute) da //dette avhenger av den som ringer for å få klassene rett, vil heve et unntak hvis feil TBoldAttribute (Container) .Assign ( id.Value); Resultatet: = id.Value; slutt; endelig id.Free; ende, slutt; SelectBoldElement kan brukes direkte, men det er nyttig å lage pakke å forenkle å kalle det. For eksempel, hvis man ofte behov for å hente heltallsverdiene fra et enkelt velger, en funksjon som følgende ville være nyttig: function SelectInteger (sOCL: string; Standard: Integer = 0): Integer; Var anInt: TBAInteger; begynne anInt: = TBAInteger.Create; prøve prøve SelectBoldElement (null, sOCL, [], Unntak, '', anInt); Resultatet: = anInt.AsInteger; unntatt resultat: = Standard; slutt; endelig anInt.Free; end, end; //Dette eksempelet søker en produktdatabase av UPC og PLU, viser //bruk av eClass parameter.class funksjon TProduct.GetProduct (PLU, UPC: string;): TProduct; const cPLUOCL = 'Product.allInstances - > Velg (PLU = ''% s '') - > først '; cUPCOCL = 'Product.allInstances- > Velg (UPC =' '% s' ') - > første'; begynne //forsøk på å finne med UPC første resultatet: = SelectBoldElement (null, cUPCOCL, [UPC], nil, '') som TProduct; hvis ikke Assigned (resultat) så //Fant ikke UPC, prøv PLU resultat: = SelectBoldElement (null, cPLUOCL, [PLU], EProductNotFound, 'Produkt ikke funnet ") som TProduct; //Dette inkluderer et unntak klasse, så hvis produktet fortsatt ikke er funnet, //den EProductNotFound feilen vil bli hevet og håndteres elsewhereend; //Denne dumme metoden for håndtering tillatelser demonstrerer valg med //en annen enn systemet rot .function TEmployee.GetPermissions (Kategori: string): TPermissionList; konst COCl = 'permissions- > Velg (kategori =' '% s' ')'; begynne SelectBoldElement (selv, COCl, [kategori], nil, '', resultat); end; Anmeldelser



Previous:
Next Page: