124
Tags:
delphi
Skrevet af
Bruger #1474
@ 16.11.2003
-= START =-Da vi nu gerne skulle havde en idé om, hvordan OpenGL fungere i forhold til vores applikation og Windows, er det på tide at se noget kode. Først vil vi se på, hvordan vi kan lave en context til en, hvilken som helst visuel delphi komponent. Vi får både brug for en renderings context og en device context, der begge er af typen THandle. Så hvorfor ikke definere en record der består af disse:
type
TContext = record
RenderContext, DeviceContext : THandle;
end;
Nu ville det være smart at lave en funtion der kan returnere en sådan record ud til os, hvis bare vi fortæller den, hvilken Delphi komponent vi vil havde lavet vores context for:
function SetupContext(Sender : TObject) : TContext;
var
PFD: PixelFormatDescriptor;
I : Integer;
begin
with TWinControl(Sender) do
Result.DeviceContext := GetDC(Handle);
ZeroMemory(@PFD,SizeOf(PFD));
with PFD do
begin
nSize := Sizeof(PixelFormatDescriptor);
nVersion := 1;
dwFlags := pfd_Support_OpenGL or pfd_Draw_to_Window or pfd_DoubleBuffer;
iPixelType := pfd_Type_RGBA;
cColorBits := 24;
cDepthBits := 32;
iLayerType := pfd_Main_Plane;
end;
I := ChoosePixelFormat(Result.DeviceContext,@PFD);
if I = 0 then
Exit;
if not SetPixelFormat(Result.DeviceContext, I, @PFD) then
Exit;
Result.RenderContext := wglCreateContext(Result.DeviceContext);
if Result.RenderContext = 0 then
Exit;
if not wglMakeCurrent(Result.DeviceContext, Result.RenderContext) then
Exit;
end;
PixelFormatDesciptor er en Windows type og indeholder beskrivelsen for en pixel type. nSize er såmænd bare storrelsen på sin egen type. Desuden fortæller vi at den skal uderstøtte OpenGL og tegne til et vindue (Visuel komponent) og at OpenGL's DoubleBuffer skal være tilgængeligt ved dwFlags, og at pixel typen er en RGBA (Red, Green, Blue, Alpha). Til sidst bliver vores nye context aktiveret. Da vi kun skal lave vores context én gang, vil det vaere oplagt at skrive det i vores forms OnCreate property:
var
Context : TContext;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Referere til vores funktion, der vil returnere en context til vores form
Context := SetupContext(Form1);
end;
Lad os nu se om det overhovedet virker, ved at farve OpenGL's Color buffer og bytte den med Windows (GDI) buffer. Vi skriver derfor følgende i vores forms OnPaint property:
procedure TForm1.FormPaint(Sender: TObject);
begin
//Definere farven der skal overskrive Color bufferen
glClearColor(0,0,0,0);
//Overskriver Color bufferen
glClear(gl_Color_Buffer_Bit);
//Bytter OpenGL's Color buffer med Windows (GDI'en)
SwapBuffers(Context.DeviceContext);
end;
Prøver vi at kompile, skulle vi gerne se at vores form er blevet helt sort. glClear() fortæller OpenGL hvilken farve Color bufferen skal farves med når den bliver overskrevet (0,0,0,0) - hvilket er sort! glClear() fortæller hvilke buffers der skal overskrives - i vores tilfælde er det kun gl_Color_Buffer. Grunden til at vi overskriver en buffer er selvfølgelig for at forberede en ny rendering. Husk på at spil bliver renderet som om det var en film. Der bliver hele tiden tegnet nye billeder (også kaldet for Frames) for hvert sekund. Ofte har vi en frame rate - FPS (Frames Per Second) på ca. 60 + 75. Afhaengig af dit hvad dit system tillader. Prøv nu eventuelt at tage en TPanel og lav en context til den i stedet for din Form, eller en hvilket som helst anden visuel Delphi komponent (Det kan være du bliver nødt til at maksimere din Form, når din applikation er eksekveret for at se et resultatet). I de kommende eksempler bliver der antaget at der er blevet lavet en context til din Form!
OpenGL har forskellige måder at definere RGB(A) farver på. I funktionen glClearColor() bruger vi float (Singles) til at definere farven med, hvor imod Windows altid definere RGB farver som bytes. Her er en lille sammenligning mellem disse to farve defineringer:
RGB( Rød Grøn Blå) OPENGL ( Rød , Grøn , Blå , Alpha) FARVE
-----------------------------------------------------------------------------
RGB( 255 , 255 , 255 ) glClearColor( 1 , 1 , 1 , 0 ) Hvid
RGB( 128 , 128 , 128 ) glClearColor( 0.5 , 0.5 , 0.5 , 0 ) Grå
RGB( 0 , 0 , 0 ) glClearColor( 0 , 0 , 0 , 0 ) Sort
RGB( 255 , 0 , 0 ) glClearColor( 1 , 0 , 0 , 0 ) Rød
RGB( 0 , 255 , 0 ) glClearColor( 0 , 1 , 0 , 0 ) Grøn
RGB( 0 , 0 , 255 ) glClearColor( 0 , 0 , 1.0 , 0 ) Blå
RGB( 255 , 255 , 0 ) glClearColor( 1 , 1 , 0 , 0 ) Gul
RGB( 255 , 64 , 0 ) glClearColor( 1 , 0.63 , 0 , 0 ) Brun
RGB( 0 , 255 , 255 ) glClearColor( 0 , 1 , 1 , 0 ) Turkis
RGB( 255 , 0 , 255 ) glClearColor( 1 , 0 , 1 , 0 ) Lilla
Da vi nu ved, hvordan vi skal arbejde med OpenGL med Delphi, vil vi prøve at rendere noget geometri. Men før vi koder et eksempel er det meget vigtigt at forstå, hvordan 3D modeller er bygget op. Da det handler om at simplificér alt i 3D, arbejder vi derfor også med meget simple primitiver, så som prikker, streger og trekanter. Har vi to trekanter som en primitiv kaldes det en Quad (firkant) og har vi flere end to trekanter i en primitiv, kalder vi den for en polygon. Men vigtigst er det at vide at alt stort set er bygget op af trekanter også begreber som NURBS! Da 3D er vektor baseret grafik, vil en figur meget logisk være opbygget af punkter også kaldet for vertexer. Hver af disse punkter indeholder 3 koordinater (X,Y,Z) som er af typen float (Singles). Hvis vi vil tegne en enkelt trekant kan vi derfor gøre det således:
glBegin(gl_Triangles);
glVertex3f(0 ,+1,0);
glVertex3f(+1,-1,0);
glVertex3f(-1,-1,0);
glEnd;
Som du kan se, har vi defineret en primitiv via glBegin() og afslutter med glEnd, og hver vertex med glVertex3f(). Hvis vi sætter det sammen med koden i vores FormPaint procedure, vil det være mest fornuftig at skrive koden efter vi overskriver Color bufferen og før vi bytter Color bufferen:
procedure TForm1.FormPaint(Sender: TObject);
begin
glClearColor(0,0,0,0);
glClear(gl_Color_Buffer_Bit);
//Tegner en trekant med gl_Triangles
glBegin(gl_Triangles);
glVertex3f(0, +0.5, 0);
glVertex3f(+0.5, -0.5, 0);
glVertex3f(-0.5, -0.5, 0);
glEnd;
SwapBuffers(Context.DeviceContext);
end;
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (58)
WooooW... Her kan jeg ikke sig andet en flot arbejde... Det er fandme en Nice artikel... Du har ændret 2 ting i mit liv:
1. Du har lært mig om mulighederne med OpenGL
2. Du har givet mig MEGET lyst til at prøve Delphi
Fandme en flot artikel
Den har sQ nok taget langtid om at lave men jeg har fandme fået løst til at sætte mig til OpenGL istedet at programmere programmere browsere .mm
Mange tak skal I havde...
En rigtig, rigtig god artikel. Tak for det!
Håber virklig der kommer flere artikler fra dig af med OpenGL
God, enkel og detaljeret artikel :o)
Virkelig god artikel! Håber meget på at vi snart får nogle flere af den slags - spilprogrammering må vist være noget af det mest populære man kan skrive om
. Keep up the good work!
Endnu engang mange tak for rosen! Jeg vil lige nævne at hele kildekoden jeg brugte til denne artikel, kan downloades fra min site. Det kan måske være lettere at overskue de mange procedure i en Delphi unit.
Fed artikel!!
Men jeg har et problem... Hvis jeg sætter min forms WindowState til WsMaximized bliver gulvet, loftet og vægen usynelige.. hvorfor??
Jeg har undladt at nævne det i denne artikel, Da jeg syntes den allerede fyldte ret meget. Men jeg burde nok havde inkluderet den, siden flere har spurgt mig. Det er beskrevet som det første i den NYE artikel, (som jeg er halvvejs med). Så hvis du kan leve med det indtil da
Det er helt i orden
Så øver jeg mig bare lidt mere i OpenGL i mellem tiden...
Jeg synes virkelig denne artikel er meget god! Og den fortjener virkelig at få top karakter. Jeg glæder mig til at komme videre med mit spil
Håber der snart kommer en efterfølger af dig! Bliv ved med det!
Imponerende artikel!
Præcist, hvad skal man bruge til denne her tutorial??? jeg har Delphi, men hvad ellers???
jeg er lidt af en n00b
Det er det eneste! En Delphi kompiler er såmænd nok
Det er blandt andet derfor jeg foretrækker OpenGL!
Så mangler vi bare at der er en der omskriver artiklen til os der programere c++ i borland
Kanon artikel ellers
"Jeg vil lige nævne at hele kildekoden jeg brugte til denne artikel, kan downloades fra min site. " - Hvorhenne på din side? Jeg kan ikke lige finde den...
Men, fandme en nice artikel! Hvis alle skrev sådanne artikler, havde der overhovedet ikke været behov for rating system, da alle ville ligge til et 13-tal (5-tal, men altså
)
!
Så til Søren Klit Lambæk: Godt arbejde, og bliv endelig ved med det
Sidst i artiklen er en link til den! ellers er det:
http://www.opengl-delphi.dkDet glæder mig meget at I kan bruge min artikel! Det er ikke tit man ser artikler om 3D udvikling på dansk, men nu ved jeg, at det i hvert fald IKKE er fordi, at folk ikke værdsætter det
Gerne direkte link, kan ikke lige finde kildekoden
Kunne ikke forstå et eneste ord.
Det her er det jeg ikke forstår:'
1) for ikke at hvide hvor komomenterne ligger...
2) Den første kode er et elle andet sted hvor der står type. Hvor er det...
3) Nr. 2's sted skriver du navnet på de 2 kompomenter. Kan ikke skrive det før at kompomenterne er fundet.
Resten læste jeg ikke da det ikke ville hjælpe mig.
Kan i ikke lige hjælpe mig...
Tak
Theis>> Helt ærligt så ved jeg ikke hvad du mener! Hvis du er usikker med at programmere Delphi, så vil denne artikel være en stor mundfuld for dig, så det kan være at du skal vente til du ved lidt mere om Delphi.
Jeg har i ligevel prøvet at besvare så godt jeg kunne forstå:
1-2) En Type skal selvfølig altid defineres før selve typen blive anvendt i en kodesammensætning. Præcis hvor en type skal defineres er meget afhænig af dit formål med typen. I dette eksempel ville en global definering være meget indelysende!
3) Jeg ved ikke hvad det er for nogen 2 komponenter du mener!
NB: Prøv ar være mere præcis næste gang
)
Tja...
Søren Klit Lambæk
Vis du syns at jeg skal vænte efter jeg har læst en bog på 500 sider, en anden på 200 og en 3'ge på 140 sider, vil jeg sige nej.
Jeg ved udmærket meget om delphi.
Men jeg fårstår ikke rigtigt hvor de første 2 koder skal insættes...
Der er måske ikke 2 komomenter men jeg kunne bare ikke få det til at virke...
Kan i hjælpe???????
He he det var bestemt ikke for at fornærme dig, men siden du ikke er sikker på hvor det første kode skal skrives fik jeg den opfattelse at du ikke var helt inde i Delphi - hvilket jo ville havde været en ærlig sag
Du kan downloade kildekoden fra min site:
http://www.opengl-delphi.dk/source1.zipDer vil du hurtig kunne overskue hvordan jeg har sat det sammen.
Men det gør faktisk ligemeget hvor du implementere de 2 første kode eksempler, så længe de kan identificeres af din forms OnCreate property!
NB: Desuden vil jeg sige at en bog på 500 sider, en bog på 200 og en på 140 ikke er særligt meget! Jeg har 7 x 500 siders bøger liggende omkring Delphi, og føler stadig jeg mangler at vide meget endnu!
Søren Klit.
Im sorry. Det var ikke negativt ment. Det er sådan, at jeg bare godt tror at jeg ville kunne klare det. Jeg får også somme tider hjælp af en ekspert jeg kender...
Og jo 500 side, 200, 150 er ikke helt utrolig meget. Men jeg syns dog at det er nok til dette.
Jeg syns heller ikke selv at jeg ved nok om delphi. Men dog en masse...
Jeg kigger lidt på hjemmesiden...
Kanon artikel! Det må jeg sige... Klart et 5 tal herfra! Synes der er 1 ting som er dårligt! Det er at du kun har fået 2000 UP for den! Come on Admin's, den er da mindst 10.000 værd!
Kepp Up The Good Work!!!!!
Hej Søren Klit Lambæk.
Nu prøver jeg igen efter at have kigget på noget andet.
Dog har jeg et spr. efter dine første 30 linier.
Det lyder jo let. Og jeg kan fortå at jeg bare skal skrive det der (mener det er
OpegGL i user listen.
Men da jeg læste den ble jeg usikker om der er noget kompoment der skal fides frem fra kompomentpalleten? Er der det. Der står ingen adresse så det skal i såfald ikke hentes...
Nå Men Tak
type
TContext = record
RenderContext, DeviceContext : THandle;
end;
--------
Skal denne ikke ned i vores kode der oppe vor der allerede står
type
TForm1 = class(TForm)?
Vis ja, skal jeg slætte TForm1 = class(TForm). For så vil jo den ikke starte. Det er klart?
Bleger det ikke altid at være en liste over vilke kompoments der er brugt der står der oppe?
Hvis ja, hvor ligger så de kompomenter?
Engang for ALLE! Nej, der er ikke brug for komponenter eller at installere nogen komponenter, eller hentes findes nogen frem fra komponentpanelleten, for at bruge OpenGL i mine artikler! Så er det vist sat på plads! Alt du skal gøre for at kunne benytte OpenGL kald er at tilføje "OpenGL" under uses, som jeg har nævnt op til flere gange!
Når man skriver noget under uses, linker man en unit (.pas eller .dcu) til sit projekt! Dette er ikke nogen komponent, det er bare en anden unit med noget kode!
Du må selv om hvor du definere dine typer og varianter, så længe de kan identifiseres af de forskellige procedure og funktioner der har brug for dem!
Du skal ikke på nogen måder slette din forms klasse! Hvis du gør det vil du jo ikke havde nogen form, og dermed ikke kunne se grafikken! Du skal forøvrigt slet ikke slette noget af det kode som din Delphi kompiler for-skriver for dig!
Hvilken Delphi kompiler bruger du? Jeg har hørt at der skulle være problemer med de helt nye kompiler fra Borland, da de bruger et helt nyt filsystem! Men hvis du har en kompiler fra version 7 og ned efter, skulle der ikke være nogen problemer overhovedet!
Med venlig hilsen
Søren Klit Lambæk
Tillykke.
Jeg bruger Delphi 7 Enterprice (eller hvad det hedder).
Du behøver ikke at hisse dig op. Husk på at jeg spør da jeg er en noob. Og jeg må indrømme at jeg burde kunne havde lidt mere viden om hvad du taler om, får at jeg kan arbejde med det.
Men en 13 årigs drøm er da 100% at kunne lave fede 3d spil. Så jeg kan ikke vændte.
Men vis du syns det er irrigterende at jeg spør. Så må du lade vær at svare. Som dog ikke er pænt og jeg vil heller ikke blive glad.
Men så har jeg da heller ikke spurt så meget.
Men er det så umuligt at få lavet OpenGL med mit delphi version igennem din artikel.
Så må du da lave en for de folk som ejer den nyeste version.
Ellers må jeg da købe en af de gamle.
MEN SÅ ER JEG SUR VIS DET IKKE VIRKER!!!
Den er i såfald ikke glad for den første kode...
Tag det roligt.
Hilsen Theis F. Hinz (Shafh)
Jeg har bestemt ikke hidset mig op (Så skulle du høre når jeg hidser mig rigtigt op he he...)
Jeg er ikke træt af at folk spørger og slet ikke noob, men det kan måske være lidt trættende at få samme spørgsmål igen og igen... når jeg ikke kan gøre det mere klart end - INGEN KOMPONENTER!
Nå, men nok om det!
Selvom man er 13 år skal man selvfølgelig også havde en chance for at lave sine egne 3D Spil. Denne artikel henvender sig derfor til alle uanset alder, køn og race!
Du bruger Delphi 7, og den skulle altså hvad jeg har fået fortalt virke til mine artikler. Men du kan selv tjekke det ved at se hvad efternavne dine projekt filer hedder. Hvis de enten hedder DCR, PAS eller DCU skulle der være rimlig garanti for at det virker. Men hvis du siger at mit kode ikke virker så gør den det jo selvfølgelig ikke! Jeg har aldrig haft version 7 selv (bruger den gamle version 4 standard), så jeg kan med gode grunde ikke vide det med sikkerhed!
Prøv at oprette et nyt projekt og skriv "OpenGL" under uses, uden at skrive andet. Hvis det viser sig at din kompiler allerede brokker sig der er der noget galt!
Hvis den skriver: "OpenGL.Pas unidentified" eller lign. er det fordi filen OpenGL.pas ikke ligger, hvor den skal eller slet ikke findes!
OpenGL.Pas filen er en interface til OpenGL32.DLL filen som Windows bruger til at få kontakt til dit grafikkort med. OpenGL.pas filen skulle følge med din kompiler som standard! Ellers prøv at lade Windows foretage en fil-søgning efter denne fil!
Hvis det viser sig at du ikke kan finde denne fil kan du helt sikkert downloade den fra nettet. Der findes en anden fil kaldet OpenGL12.Pas det er ikke den! Det er en nyere version, og bliver ikke brugt i mine artikler, men den kan dog fint bruges, hvis man har lidt forstand på OpenGL!
Hvis intet af dette virker, så spørg igen. Og vi vil finde ud af en anden løsning! For 3D udvikling er noget af det sjoveste der findes, og det må du ikke gå glip af, hvis du hat lyst til det!
Held og Lykke
Med venlig hilsen
Søren Klit Lambæk
Tak.
det var et dejligt svar.
Men det virker med OpenGL i user listen.
Men koderne du skriver på artiklen virker ikke...
Men mine filer er også: .dmf, .dpr og .Pas.
Jeg prøver mig at andskaffe en gratis udgave af delphi 4, 5 eller 6.
Du behøver ikke at svare.
Du har været til fantastisk hjælp, og jeg kan ikke vendte til at prøve!!!
Svare måske om en et godt stykke tid, og siger om det virker.
Du behøver ikke at skifte kompiler! Det skulle virke, jeg har fundet ud af at jeg kender en som bruger Delphi 7, og han kan sagtens kompile min artikel!
Prøv at downloade kildekoden fra artiklen!
kopiere indholdet fra .pas filen men KUN det jeg skriver i artiklen, og ikke noget af det der er pre-skrevet af Delphi! og tilføj derefter OpenGL under uses!
Så skulle det virke! Kom tilbage, hvis det ikke virker, og fortæl mig præcis det din Delphi kompiler skriver af fejlbesked!
Jeg tror grunden er at Delphi 7 bruger nogle units filer som Delphi 4 ikke behøver! Så hvis du kopiere hele min .pas fil og vil kompile det i Delphi 7, mangler den nogle af de units!
Theis tror du ikke du skulle passe lidt på med at sige at dine artiklens koder ikke virker!...
Somregl er det jo en selv som har tastet forkert...
Jeg ved godt du har læst 999999999 sider om delphi... det er også godt... men kan du bruge alt det du har lært? eller har du bare læst det?...
Jeg har arbejdet med delphi i ca. 1, 2 uger nu... sådan for sjovt.... og jeg kan sagtens få denne artikel til at virke...
jeg bruger også Delphi 7 EnterPrise...
Så der skulle ikke være noget der!
Men tænk lige en ekstre gang når du siger at en kode ikke virker!
måske er det dig som har lavet fejlen!
Til Søren.....
Damn en god artikel! kan det gøres bedre?
Jo, tak.
Men nu har jeg også fået delphi 6. Men det virker ikke.
Jeg vil meget gerne sende dig et screenshot af det. Men alt det du skriver har jeg gjordt...
Kasper Svendsen>> Mange tak
Theis>> Send mig lige din kildekode! Der må absolut være noget du helt har misforstået med denne artikel eller Delphi generalt!
Kan jeg skrive det i en mail, ellers vil det fylde total meget. Og det vil både fylde på din artikel, og gør det måske lidt ufedt. Og også da det ikke interresere andre. Kan du ikke give en mail?
Heyyyy.
Jeg har fundet ud af det sådan set.
Fedt.
Og Søren jeg må undskylde alt den tid jeg har brugt....
Har kommet langt i denne artikel (helt hen og fået lavet en firkant.¨
Men mystisk nok at efter jeg har fået lavet det første med en firkant (den der er lidt lang), og jeg bliver ved med at bruge artiklen, vil den i de næste koder i artikelen kun komme den sorte baggrund på formen nå jeg afprøver det.
Why?
Men tak...
Nu er jeg kommet længere igen.
Jeg undskylder...
Men er der en der kan forklare hvordan idle kan laves i delphi 6 og 7?
har fundet ud af det igen...
Hej Drenge og Piger,
Sidder lige en sen Lørdag nat, og prøver denne fantastiske tutorial... men der kommer et problem jeg aldrig har set før.... Jeg er nogenlunde kendt i delphi, men har lige set det her før, er nået til første compile, og så kommer fejlen: EResNotFound???
Hvad er det og hvor kommer det fra, er det en fejl i installationen af Delphi? Eller er det mig
God weekend!
HA HA typist.... havde kommet til at slette linien: {$R *.dfm}
Undskyld drenge og piger..!!!
Hav en god aften...
I lige maade... Det var da godt at du fandt ud af problemet selv!
Hejsa igen drenge og piger, hvis I bare ønsker at BitMappet skal være i det samme bibliotek som dit program (EXE fil) så skal I skrive følgende ved LoadTexture delen:
Bitmap.LoadTexture('./Gulv.Bmp');
rigtig god artikel. men jeg har et lille problem,
min væg og mit loft er helt hvidt.
Kan du hjælpe?
Hejsa Tobias... Det kan vi jo ikke ha' ;-) Send lige dit kode til min mail, og jeg vil straks se på sagen!
Søren
jeg tror jeg har løst det selv.
Hej Søren,
Virkelig god artikel, men når man nu først kigger på artiklen nu her, og egentlig gerne ville se HELE koden, som du tidligere har haft liggende på dit website, er dette jo ikke muligt. Har du mulighed for at lægge koden op på nettet igen?
Med venlig hilsen
Daniel Juhl Mogensen
Jeg har skiftet hjemmeside da jeg ikke laengere bruger Delphi som mit hovedsprog! Jeg vil proeve at finde koden frem igen og evt. uploade den til mit nye site! Jeg skriver igen naar dette er sket!
Ikke for at skynde på dig, Søren, men det burde ikke tage over et år at finde en kode frem
Thomas>> ehhh, ikke helt sikker paa hvad du mener??? Har jeg lovet noget jeg ikke har holdt?
Naa, oki nu tror jeg at jeg er med igen! He he... du mener hele kilde koden for denne artikel? Ja, det har jeg altsaa fuldstaendigt glemt drenge! Er faktisk ikke sikker paa at jeg har den laengere!
Pyt med det
Hvad er dit nye hovedsprog?
Mit hovedsprog er C/C++. Jeg bruger stadig Delphi men dog i begrænset omfang. Egenligt kan jeg godt lide begge sprog på hver deres måde. Når det kommer til stykket er de stort set meget ens! Jeg er derfor ved at udvikle en spil motor der understøtter begge sprog. Det kan være jeg en dag skriver et par artikler/tutorials om hvordan man bruger den med de forskellige programmerings sprog. Hvis du er interesseret så kig en smut forbi
http://www.pixie3d.com
Rigtig godt skrevet!!
Kunne ikke gøres bedre
Dit Pixie3D projekt ser rigtigt interessant ud, og jeg tror at jeg vil tjekke det ud
Du skal være
logget ind for at skrive en kommentar.