Svaret, min venn, er å gå med Parameter

The Perpetual Newbie Journal Entry # 2.1 Denne artikkelen ble først publisert i http: //www.undu.comEvery en av oss har hørt gjenbruk av kode mantra. Noen av oss er litt tregere til å ta i bruk ny praksis når gamle praksis er så behagelig som en gammel melodi. Men tidene, de er a-changin ', og det er på høy tid å dyppe en tå i gjenbruk, selv om det er bare å bruke en form.I nylig hatt grunn til å lage en modal skjema for å gjøre noen redigering av en post fra et rutenett. Det var fornuftig å gjøre det til en modal form, slik at brukeren kan se hele den informasjonen på en gang. Ikke noe problem. Jeg refererte MainForm sin datasource.Autoedit: = false og alt fungerte hunky-dory. Den modal formen besto av noen redigeringsfelt, en post-knapp, en avbryt-knapp og tre hendelsesbehandlinger. Foruten innlegget og avbryte handlers, var det et tastetrykk handler som viste trer i faner. Jeg har også slått av bildeteksten-bar exit knappen. Redigering ble initiert av en knapp på utkikk bar på den viktigste formen. Konseptet fungerte veldig bra i revisjons endringer som er gjort i løpet av redigeringsøkten i en historie field.So godt gjorde modal skjema arbeidet som jeg bestemte meg for å doble opp bruk av skjemaet ved å bruke det for å legge en ny rekord i databasen. Alt jeg måtte gjøre var å utøve noen runtime modifikasjoner, endre bildetekst og tweaking noen andre innstillinger før du åpner den opp som en modal form. Mens kunden ID-feltet ble lest bare i modal form, ble den slått av i Legg form. Minst Jeg trodde det var alt det var for det.Jeg oppstått et problem fordi databasen i spørsmålet var en detalj database, knyttet til en master. Ikke noe problem. Jeg ville bare kopiere datakilden og bord til et annet navn (dvs. Kunden CustEdit). Da kunne jeg tilbakestille pekere til kopien er datakilden. Redigerings prosedyren bare måtte inkludere en gotoCurrent funksjon for å harmonisere de to eksemplarer og avslutt med en oppdatering på den opprinnelige å sørge for at alle endringene ble bemerket.Grønne Edit funksjonen var lett å endre: begynne FrmCustomer: = TFrmCustomer.Create (nil ); med FrmCustomer gjøre begynne fldCustNum.readonly: = true; //NYHET Sørg for at du ikke kan endre nøkkelfeltet bildetekst: = 'Rediger kunde'; //NYHET Gjør tittelen indikerer funksjon TblCustEd.gotoCurrent (FrmMain.TblCustomer); //NEW harmon skyggen tabellen med master hvis ikke (sourceCustEd.state i dsEditModes) så TblCustEd.edit; //Sørg for å angi redigeringsmodus prøve ShowModal; //Ta opp skjemaet, bruke det og da mister det endelig Free; slutt; slutt; TblCustomer.refresh; //NEW Update visningsdata med bak kulissene endringer slutten, ting med tillegget ikke fungerte så snart jeg klikket på knappen under utføring. Det produseres en klage på at datasettet ikke var i redigeringsmodus. Jeg satt i stoppunkter. Jeg byttet fra å bruke Append til Sett og tilbake igjen. Programmet holdt bryte på TblCustEdit.append, selv når jeg hevdet umiddelbart før hånd at kilden var i redigeringsmodus umiddelbart før. dvs. begynne FrmCustomer: = TFrmCustomer.Create (null); med FrmCustomer gjøre begynne fldCustNum.readonly: = false; bildetekst: = 'Legg til en kunde'; prøve TblCustEd.Append; //BOMB !!!!!!!!!! bortsett showmessage ('Editing problematisk'); slutt; prøve ShowModal; endelig Free; slutt; slutt; TblCustomer.refresh; end; Hvis jeg plassert og jeg sjekket for dsEditModes over append uttalelse og deretter merket med et stoppunkt, ville debugger IKKE kjøre, det blir optimalisert ut eller endres i plassering av kompilatoren. OG, koden pekte tilbake på buttonclick tilfelle knappen når du fikk ferdig med å svare dialogbokser. Jeg var en forvirret valp. Jeg var på vei til Internett når jeg endelig så hva problemet var. Den newrecord metode for TblCustomer inkludert fire standardinnstillingene felt. Det ble formulert i prosedyren for eksempel som: TblCustomer.fieldByName, ('Carrier ") asString:. =' FedEx '; DETTE BLE KOPIERT VERBATIM til newRecord innen den kopierte datakilden. Jeg så på dette i flere timer før merke at TblCustomer OG TblCustEdit var ikke en og samme [sau-faced grimase]! Problemet ble løst i utgangspunktet bare ved å korrigere navnet avvik. Imidlertid har jeg kommet til den konklusjon at jeg er altfor tilbøyelige til å gjøre denne feilen igjen. Sooooooooo .... Den nye tilnærmingen er å bruke den som ringer parameter i "med" stil. Dvs. . begynne med datasettet gjør begynne fieldByName ('Carrier') asString: = 'FedEx'; fieldByName ('GST') asBoolean:. = true; . fieldByName ('PST') asBoolean: = true; fieldByName (Godkjent) asBoolean:. = False; slutt; ende, jeg har bestemt meg for at jeg kommer til å bruke det ringer parameter oftere. Det kan kreve en kommentar eller to for å være helt tydelig på rask lesing, men jeg lover å bruke den til å dekke mine Butt mot dumhet som jeg har begått mot deadline min her today.Hope dette bidrar til å hindre en furet panne eller to i fremtiden .mer på Sikker Coding Ideasby Gary Mugford - [email protected] artikkelen ovenfor genererte svar fra Ramon Prick og Andy Robinson. Her er min oppfølging: Takk (til Ramon Prick av Nederland) for å forsterke konseptet bak artikkelen min. Det er den type dialog som ofte kan opplysende og nyttig for programmerere i det hele tatt, men ekspertnivå. Det er sant at ideen bak sikker-koding er å eliminere feil ved utelatelse så mye som mulig. Feltnavn endring går på oftere enn jeg ønsker. Ramon foreslo å gå til noen lengde for å unngå å nevne feltnavn av hardkodet navn, foretrakk konstanter eller felt-nivå definisjonene i data modules.Yet jeg har funnet de FBN referanser enkle å finne og forandre seg med hvilken som helst standard grep verktøyet. At konstantene forslag gjør enkel erstatning på et blunk er åpenbar. Men det letthet kommer til en pris, lagringsplass. I en app av anstendig kompleksitet, kan antall feltnavn være betydelig. Og disse må være enhet nivå globale konstanter å ha noen verdi og bør være programdekkende globale konstanter å være så mye verdi som du ønsker. Datamoduler har utnyttelsen som du foreslår, men legge et lag til programkoden. De er ikke alt som er nødvendig i en riktig forvaltet SDI grensesnitt der barnet skjemaer bruker kallet skjemaets datasett der appropriate.All i alt, finner jeg forekomsten av endrede feltnavn (som uønskede lagt navn) forekommer sjelden nok, at jeg velger ikke å betale overhead. I gruppeprogrammeringsinnsats eller i MDI applikasjoner, kan jeg lett se verdien i ditt første forslaget og vil anbefale sin adoption.In en annen e-post, Andy Robinson fra Sør-Afrika viste at han hadde hatt problemer i det siste med nøstede bruk av datasettet parametere. Hans problem var med uendelige løkker: "... i denne slags struktur vil det vises at du ikke kan stole på visse uttalelser f.eks jeg ikke lenger prøve dette ... med dataset1 ikke begynne med dataset2 gjør begynne ..... neste..; ende; ende; ende; Dette er en annen situasjon da den jeg hevdet at hadde en enkelt datasett parameter gått gjennom fra en automatisk metode som AfterInsert Selv om han ikke har hatt tid til å undersøke problemet og pin det ned, denne typen. . av heads-up nå har meg ser veldig nøye på alle nestet med statements.By veien, tillater bruk kode mal for de mest vanlige problemet løsning på looping problem lagt merke til av Andy har jeg en WithEOF mal som typer i: med | gjøre begynner først, mens ikke eof ikke begynne ... neste; ende; ende; Også FBNS å utvide til fieldbyName ("|") asString og FBNI å utvide til fieldByName ("|") asInteger virkelig gjøre underverker når det gjelder.. nøyaktighet og hastighet på kode. Til syvende og sist, som et enmanns butikk, disse farts gevinster fortjener fortsatt bruk av kodepraksis som ikke ville fungere nesten like godt i organisasjonen. Gary Mugford Idea Mechanic Inc Bramalea ON Canada Anmeldelser



Previous:
Next Page: