Avatar billede rozh Nybegynder
31. maj 2004 - 15:53 Der er 2 kommentarer og
1 løsning

overskrive en event ?

Hej

Jeg har et component, som varetager noget sql kørsel (i stil med DBExpress). Dette component hedder MySQLDataSet og findes her:
http://www.scibit.com/products/mysqlcomponents/index.htm

Dette component har en event der hedder: OnExecSQL. Eventen kører hver gang, lige før komponenten sender sql sætninger til MySQL serveren.

Jeg har deriveret et component fra dette ovenstående. Jeg vil gerne, i mit eget component, køre noget kode lige før eventen OnExecSQL kører.

Hvordan gør jeg det ?
Avatar billede nico26 Nybegynder
31. maj 2004 - 17:13 #1
hvis komponenten er lavet ordentligt, er der en protected virtuel metode, der fyrer eventen af - den hedder sikkert ExecSQL. I din specialicerede komponent overrider du denne metode - og kører først din nye kode, hvorefter du kalder inherited ExecSQL
Avatar billede rozh Nybegynder
01. juni 2004 - 13:31 #2
Tak for dit svar nico26. Men jeg kan desværre ikke rigtigt bruge den metode!!

Der er nemlig en method der hedder ExecSQL, men den laver 3 ting:
1- Den Parser SQL sætningen
2- kalder eventen
3- sender sql-sætning til MySQL serveren

jeg vil gerne skrive min kode ved punkt 2, dvs efter at sql-sætningen er parset, men før den sendes til serveren. Og dertil kan jeg ikke bruge den beskrivne metode, idet hvis jeg sætter min kode før "Inherited", så er SQL-sætningen ikke parset endnu, og sætter jeg min kode efter, ja så er det jo ligsom for sent.

Jeg har prøvet at finde en "DoExecSQL", men uden held.
Jeg har disassembleret dcu'en for komponentet i håb om at finde en method som udelukkende trigger eventen, men kunne ikke rigtigt gennemskue og finde sådan en.

Jeg vil sætte stor pris på det, hvis der var andre forslag ???
Avatar billede rozh Nybegynder
02. juni 2004 - 13:25 #3
jeg har fundet en løsning

1- man skjuler den oprindelige event, så den ikke kommer med i den klasse men selv laver. Altså programmøren som bruger den deriverede klasse vil ikke kunne bruge den event. For at skjule en event se: http://www.eksperten.dk/spm/504916

2- man assigner selv den skjulte event (in dette tilfælde OnExecSQL) til en procedure (i dette tilfælde har jeg kaldt den DoBeforeExecSQL)

nu er det sådan at hver gang den oprindelige event (OnExecSQL) bliver trigget, kalder den proceduren DoBeforeExecSQL (som jo er en method). En programmører der bruger komponentet kan ikke lave om på dette, idet han ikke kan assigner noget til den oprindelige event OnExecSQL (se ovenævnte link for at forstå hvorfor).

3- Tilsidst laver jeg en ny event: BeforeExecSQL, som bliver kaldt fra DoBeforeExecSQL. Og mission accomplished

grunden til at jeg laver en method: DoBeforeExecSQL, og ikke bare kalder BeforeExecSQL direkte fra OnExecSQL, er:
at, hvis jeg senere fik bruge for at derivere endnu en klasse og fik brug for at ændre i dens event, så kan jeg jo bare override DoBeforeExecSQL og ikke køre alt det jeg nu kørte endnu engang.
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