Een Windowsprogramma met een 'echte' Windows-interface (dus geen console) werkt met gebeurtenissen. Zo'n gebeurtenis kan bijvoorbeeld zijn dat iemand op een knop drukt. Aan die knop hang je dan een procedure die wordt uitgevoerd telkens als er op die knop wordt gedrukt. Je programma komt daardoor wat anders in elkaar te zitten dan een good old console-applicatie, want de volgorde waarin de dingen gebeuren ligt niet meer volledig vast.
Datzelfde geldt voor het tekenen van objecten. Zo'n knoop 'weet' hoe hij zichzelf moet tekenen. Telkens als hij een Paint-commando ontvangt, tekent hij zichzelf opnieuw op het scherm. Die Paint-commando's kun je zelf in de programmacode geven, maar ze kunnen ook door het Windows-besturingssysteem worden verstuurd, bijvoorbeeld wanneer de venstergrootte wordt aangepast.
Bij jouw grafiek betekent dat, dat hij misschien maar 1 keer of misschien wel 1000 keer op het scherm moet worden getekend, je weet het nooit van tevoren. Daar zul je met je programmastructuur rekening mee moeten houden door al het tekenwerk apart te houden van de user input.
Qua logica gaat je programma er dan als volgt uitzien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| var
Geinitialiseerd: Boolean; // beginwaarde: False
procedure Paint;
begin
{ deze procedure kan op willekeurige momenten worden aangeroepen,
dus niet alleen door VraagUserInput }
if Geinitialiseerd then
begin
{ teken nu de grafiek op het scherm }
end;
end;
procedure VraagUserInput;
begin
{ deze procedure wordt aangeroepen als op een knop wordt geklikt }
{ vraag om user input, bijvoorbeeld via een apart dialoogvenster }
Geinitialiseerd := True;
Paint;
end; |
Je zult de tekenlogica dus moeten scheiden van de user input. Als het rekenwerk voor de grafieken niet de spuigaten uitloopt, kun je dat best verwerken in de tekenprocedure. Kost dat echt te veel rekentijd, dan zul je een andere oplossing moeten kiezen, bijvoorbeeld door alle grafiekpunten alvast vooruit te berekenen.
Ook het tekenwerk vraagt vaak een wat andere benadering, want je bent niet meer aan een vast schermformaat gebonden (al kun je daar wel voor kiezen als je dat wilt). Veel schermcoordinaten liggen daardoor niet meer vast, maar zijn afhankelijk van de venstergrootte. Als je een verticale lijn wilt tekenen op het midden van het scherm, is de schermcoordinaat daardoor zoiets als (Schermbreedte / 2). Je zult dus veel meer met relatieve coordinaten moeten werken. De aanpak om de afzonderlijke pixels op het scherm te tekenen is in Windows-applicaties daardoor meestal niet de handigste.
Ondanks dat het lijkt dat je door deze verschillen met een console-applicatie enorm veel werk voor je kiezen krijgt, zul je merken dat je vaak juist veel
minder code hoeft te schrijven om hetzelfde te bereiken. Dat komt doordat heleboel functionaliteit al standaard aanwezig is. Zo zijn er heleboel kant en klare componenten die prachtige grafieken kunnen tekenen.
Wat zo'n ding moet tekenen moet je natuurlijk zelf aangeven (bijvoorbeeld met een functie die de afzonderlijke grafiekpunten berekent), maar om zaken zoals het tekenen van assenstelsels en dergelijke hoef je je niet meer druk te maken. Dat is gewoon standaardfunctionaliteit in zo'n component.
Het eenmalig ombouwen van een console-applicatie naar een gelikte Windows-interface vergt meestal nogal wat werk, want vaak ben je het beste af door de hele applicatie opnieuw te schrijven. Is dat eenmaal gebeurd, dan is het programma echter veel beter onderhoudbaar en natuurlijk veeeel mooier

.
Een goede grap mag vrienden kosten.