Avatar billede hugopedersen Nybegynder
18. juni 2011 - 12:08 Der er 17 kommentarer og
1 løsning

Eksperimenter med classer

Jeg sidder og prøver at få tiden til at gå og er så begyndt at rette lidt i nogle af mine Delphi programmer.

Jeg har en klasse med grundindstillinger som jeg bruger i næset alle mine programmer (sådan noget som hostnavne på POP3 og SMTP m.m.)
Så har jeg en anden som hedder HamSettings som er alle de indstillinger der har med gruppen af radioamatør-programmer at gøre. Den er defineret som Class(TBaseSettings)
Endelig har jeg klassen Settings som er defineret som Class(HamSettings) Her har jeg alle de funktioner der bruges af det enkelte program til at hente og gemme settings enten i en .ini fil eller i registry.

Nu vil jeg så gerne om man kunne definere type og konstanter på en eller anden måde så de er tilgængelige i hele kæden.

Det vil nemlig betyde at jeg kan smide mine databaseindstillinger ind i BaseSettings også (de er i en seperat klasse nu)

Det kan godt være det lyder som sludder, men bær over med en gammel mand.
Avatar billede martinlind Nybegynder
18. juni 2011 - 12:56 #1
hvis du skal se noget gennem hele kæden skal det jo være en del af din "root" klasse
men er det ikke smartes at lave en unit "MyConstTypes" og så lægge dem der, den kan du jo use over det hele :-)
Avatar billede hrc Mester
18. juni 2011 - 14:00 #2
Du kan jo lægge konstanter og typer inde i klassedefinitionen, men det er en balancegang. Den store fordel er at typer og konstanter er lokale, men man kan lave noget værre rod.

type
  TMyClass = class
  const
    MYCONST = 1;
  type
    TMySubType = class
    end;
  private
  end;

I øvrigt har jeg lavet en ret smart løsning på det i mine programmer (IMHO). Jeg har en settings-cache som indlæses ved start. Nye eller rettede indstillinger skrives øjeblikkeligt (en cache skulle egentlig først skrive senere, men det var smartest sådan).

Jeg har en TSetting-klasse der indeholder en kategori og et navn og en variant som værdi

Disse TSettings ligger i en TSettingsList som sørger for indlæsning via unittens initialization (og frigivelse via finalization). Listen ligger under implementation-delen, så al mekanikken er skjult for de andre udviklere (dvs. JEG HAR AL MAGTEN). Så har jeg et par offentlige funktioner SetSetting(const aCategory: TCategoryTypes; const aName: string; aValue: variant); og GetSetting(const aCategory: TCategoryTypes; const aName: string): variant;

Grunden til jeg har en kategori er fordi jeg gerne vil kunne genbruge de gode navne, eksempelvis "login" og "password".

Jeg plejer at undgå varianter, for det er noget skod, men her er det relevant. Du kan gemme en boolean, en streng, et tal eller sågar et objekt i en variant. Man skal dog være opmærksom på at en variant kan være undefined (der findes et globalt flag hvorved man kan sætte en undefined til at returnere en default-værdi). Hvis en variant er undefined så ved du ikke hvilken typen den er; den er nemlig undefined - og det giver fejl.

P.t. her gemmer vi i en database, men det er let at rette det til at gemme i fil eller i registreringsdatabasen (sidstnævnte skal dog vejes op mod pladsbehovet) da alle indstillinger streames via TReader og TWriter
Avatar billede martinlind Nybegynder
18. juni 2011 - 14:19 #3
TComponent streaming ruls :-)

Lavede engang en lille tlf-bog med rent RTTI styring, nyt felt i db-klassen rettede sig selv til i hele gui'en og db-filen.... meget sjovt og lærerigt at lege med :-)
Avatar billede hrc Mester
18. juni 2011 - 14:31 #4
Ja, det er tæt på genialt. Jeg bruger det selv i et password-bibliotek hvor man kan siderne i forhold til hvad man gemmer (blev træt af, at felterne aldrig passede til hvad jeg havde brug for). Skal man gemme dankort-oplysningerne så sætter man bare de felter på osv. Det hele streames og hældes gennem en AES kryptering inden det ender i en fil.
Avatar billede hugopedersen Nybegynder
18. juni 2011 - 15:08 #5
martinlind-> det er vel ikke en telefonbog du vil dele ud af :-) jeg er altid på jagt efter noget at lære efter.

HRC-> din løsning på settings lyder også avanceret men helt sikkert 'fremtidssikret'. Men om jeg kan lave noget der ligner tvivler jeg lidt på :-)

Det jeg gerne ville opnå er at få mine database indstillinger flyttet med over i min generelle settings. Men da databasenavnene er forskellige fra program til program (arrDBName: array[TDBType] of string = ('finances', 'finances', 'finances.db3', 'finances.mdb');) og det array bruges i DBSettings, så kan det ikke lade sig gøre at lave noget generelt så vidt jeg kan se.
Avatar billede martinlind Nybegynder
18. juni 2011 - 15:57 #6
jo, hvis jeg kan finde koden :-), din hjemmeside virkede ikke ? har du en mail
Avatar billede hugopedersen Nybegynder
19. juni 2011 - 18:39 #7
Virkede min hjemmeside ikke? Det lyder ikke godt men jeg har dog oplevet en del problemer hos web10 de sidste måneder.

oz8hp  snabelting  hotmail  punktum  com
Avatar billede hrc Mester
19. juni 2011 - 18:51 #8
Det med forbindelsesparametrene er et tilbagevendene problem. Det løser jeg ved at have parametrene (i realiteten en komplet connectectionstring) gemt i en krypteret fil der hedder det samme som  programmet. Alt andet ligger i databasen.
Nu har jeg altså en krypteret fil ved siden af exe-filen, men overvejede at føje de data i enden af programfilen for kun at have én. Lod være da jeg forventede alverdens virusscannere gå amok.

Jeg tror ikke jeg kan finde koden længere; der har været en del hardwareskift siden. Programmet er over 10 år gammelt (noget er derfor ret grimt lavet, men det med komponenterne var jeg tilfreds med). Jeg kan da prøve at lave det igen. Det kan være det skal være en 64-bit version :-)
Avatar billede hugopedersen Nybegynder
19. juni 2011 - 19:04 #9
Grunden til at jeg har lavet det med databasen som jeg har gjort er at det skulle være nemt for alle at skifte database. Jeg har op til 4 forskellige typer som programmerne kan bruge og det kan rettes enten i programmet eller ved at rette i .ini filen (password tastes som tekst første gang og programmet 'krypeterer' det og gemmer det - det er et andet punkt jeg skal have kigget på. Den kryptering jeg bruger er hjemmelavet og ikke særlig sofistikeret)

Men jeg skal have hele U_DBSettings med rundt til hvert program og det var smartere om jeg kunne lave en standard og så bare en lille stump der variere fra program til program. Men det må jeg se på til vinter.
Avatar billede hugopedersen Nybegynder
20. juni 2011 - 08:26 #10
I samme forbindelse kom jeg til at tænke over om det er den rigtige måde jeg bruger til at gemme de sektionsnavne jeg bruger når jeg gemmer i registry eller ini.

jeg gemmer dem i min BaseSettings klasse som f.eks.
public
  const SectionSystem = 'SYSTEM';
Så kan jeg få fat på den som Settings.SectionSystem læneger oppe i systemet.
Avatar billede hugopedersen Nybegynder
20. juni 2011 - 09:24 #11
Som yderligere forklaring har jeg lagt en kopi af filerne op på
Http://www,hugopedersen.dk/content/files/settings.zip

De kan ikke compile da U_Settings.pas er afhængig af en del andre filer. Men de forklarer nok bedre end jeg kan skrive hvad det er jeg har gang i :-)
Avatar billede hugopedersen Nybegynder
20. juni 2011 - 09:25 #12
Der kom vist et komma i linket i stedet for et punktum

http://www.hugopedersen.dk/content/files/settings.zip
Avatar billede hugopedersen Nybegynder
28. juni 2011 - 19:01 #13
martinlind-> jeg har ikke set nogen mail fra dig.

hrc-> du har vel ikke en offentlig kodefil der viser hvardan du har lavet det der med settings?

begge-> smid lige et svar så jeg kan lukke her.
Avatar billede hugopedersen Nybegynder
06. juli 2011 - 11:04 #14
Vil de herrer ikke være venlige at smide et svar så jeg kan lukke?
Avatar billede hrc Mester
06. juli 2011 - 12:17 #15
Jeg har arbejdet i dobbeltskift de seneste par uger men nu står ferien for døren. Overskuddet med 1½ uge af gns. 12 timers arbejde (weekenden inklusiv), har været ret minimalt, men nu får jeg tid igen. Er du stadig interesseret i at se min Syst-unit (som gemmer parametrene i databasen) eller den anden (som gemmer i en krypteret fil)?
Avatar billede hugopedersen Nybegynder
06. juli 2011 - 12:23 #16
Meget gerne begge 2 :-)
Ja jeg har 11 dage tilbage på den strimmel vi klipper en dag af hver morgen før der står 'Afrejse' på den :-)

Og i mellemtiden kom jeg til at rode med at få lavet noget så jeg kan checke for opdateringer til programmer.
Avatar billede hugopedersen Nybegynder
07. juli 2011 - 15:16 #17
Hvilken kryptering bruger du?
Jeg har en jeg selv har lavet til kryptering af registreringsoplysninger til et par programmer. Men den er ikke så smart en samme text altid kommer ud som samme resultat når den er krypteret. Så den er ikke så svær at bryde :-)
Avatar billede hugopedersen Nybegynder
19. juli 2011 - 10:40 #18
Jeg har lukket dette med HRC's svar

Men jeg håber stadig at modtage et par filer fra begge med guldkorn til inspiration.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester