6. Eventstyret programmering og Windows



Relaterede dokumenter
Hjælpemenu tasten åbner for forskellige muligheder for redigering, alt afhængig af, hvilket et program der arbejdes med.

Genvejstaster eller museskade?

Åbn Paint, som er et lille tegne- og billedbehandlingsprogram der findes under Programmer i mappen Tilbehør. Åbn også Word.

Genvejstaster til Windows

Genvejstaster til Windows

Styresystemet er den del af softwaren, der sammenkæder hardware og brugerprogrammer, således at de kan arbejde sammen.

Gadwin PrintScreen Version 3,5

Microsoft Word thoremil.dk

Delphi - CrackMe og Keygen

Microsoft Word 2010 Huskesedler

Arrangementer i Listevisning

Windows Vista 1. Side 1 af 10

MS Visual Studio Basic En kort vejledning

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

HUMANWARE BRAILLIANT INSTALLATIONSVEJLEDNING

CD-ORD. CD-Ords værktøjslinje: Sådan læses op med CD-Ord

Skrifttype og størrelse

Open Office Tekst

Fang Prikkerne. Introduktion. Scratch

G-MAIL (GOOGLE)

Billedvideo med Photo Story

Coloris. Programmet fungere på den måde at man vælger det billede man ønsker at arbejde med ved at klikke på det under menupunktet Projekter.

Mircobit Kursus Lektion 4 (Du skal her vælge Lets Code Og herefter Block Editor.)

Større skriftlige opgaver i Microsoft Word 2007 Indhold

Velkommen til IT for let øvede

WINDOWS LIVE MAIL

Genvejstaster i COSMIC

Scratch. - introduktionshæfte

Fable Kom godt i gang

Vejledning til Photofiltre nr.128 Side 1

En lille vejledning i at bruge Paint Win 98 og Win XP Indhold

Lær hvordan du: Sådan virker din kalorieberegner

REDIGERING AF REGNEARK

APPENDIX A INTRODUKTION TIL DERIVE

Indlæsning af licensfil og oprettelse af regnskab

Sådan starter du PowerPoint vha. Start-knappen

Brug af Word til matematik

Handlinger du kan foretage er f.eks at du kan : - Oprette, - markere og kopiere, klippe og slette filer eller mapper.

Et oplæg med PowerPoint bliver til.

How to do in rows and columns 8

Fable Kom godt i gang

Installation Windows 7

ViKoSys. Virksomheds Kontakt System

Kom godt i gang med Fable-robotten

1. Opbygning af et regneark

AgroSoft A/S AgroSync

I denne vejledning lærer du de mest grundlæggede funktioner i PowerPoint: Hvad er en præsentation?...3. Eksempel på en præsentation...

Billedbehandling med XnView.

Spil Master Mind. Indledning.

MICROSOFT OUTLOOK 2010

Tastevejledning Windows XP

Motto-Captura ApS, Ordblinde PDA. Lyt - lær - husk. Motto-Captura ApS, info@motto-captura.eu

1. Større opgaver i word

Guide til Umbraco CMS

Kommuniker: Gennem Valg

LÆSE- OG SKRIVEHJÆLP BRUGERVEJLEDNING

ViTal. Når ViTal er startet, kan du få læst tekst højt på flere måder - Du kan bl.a. bruge knapperne i ViTal Bjælken.

Installer nyt image på din PC - Windows 7

ALMINDELIGT ANVENDTE FUNKTIONER

Modul 12, Word 1 Grundlæggende funktioner

Kilder: Troldspejlets Spilskolen, yoyogames.com

Vejledning til Politikens Retskrivnings- og Betydningsordbog

Tastekombinationer i Genveje. KAPITEL 6 Genveje

Billeder på hjemmeside

Vejledning til Kilometer Registrering

Se Billeder i Picasa.

Tilpasning af din tastaturgenveje

Multimediepræsentation PowerPoint

Genveje i Excel. Herunder ser du en liste over nyttige genveje i Excel, skimt den igennem og se hvilke der er vigtigst for dig.

Brugervejledning. ClaroRead fra Dictus -PC

Kom-i-gang vejledning opmålingsprogram

Kapitel 4 Løkker i C#

Mindmaps med Freemind

Opsætning af 60 dags regel

Til at starte med vil jeg lige vis nogle små ændringer på opsætningen som jeg har lavet.

Kapitel 3 Betinget logik i C#

Vejledning til Photofiltre nr. 105 Side 1

Rapporter. Family Tree Maker Rapporter

I denne manual kan du finde en hurtig introduktion til hvordan du:

Vejledning KPK Online Prøverum

Camtasia guide. Redigering af video. Trin for trin guide til redigering af video i Camtasia.

I denne vejledning lærer du de mest grundlæggede funktioner i PowerPoint 2003: Hvad er en præsentation? Eksempel på en præsentation...

Tyngdekraft i Scratch

Geometrimodulet generelt

Quick guide til Condes 8.

Nogle tips til Explorer 7

I. SMART Board. I. SMART Board... 1 II. Forord... 2 III. Smartboard værktøjskasse IV. Turorials... 3 V. SMART Notebook... 4

Adgang til WebGraf. 1. Start Microsoft Internet Explorer. 2. Skriv:

Når du på Pro2tal Bager s hjemmeside: klikker på ikonet

Microsoft PowerPoint 2010

ØVELSESRÆKKE OG VEJLEDNING TIL CD-ORD 5

Indholdsfortegnelse. Vokal Command v.1 manual

Brugermanual til Assignment hand in

Transkript:

6. Eventstyret programmering og Windows Indsigt i events og styresystemets rolle I det følgende skal vi se på en række mere tekniske ting vedrørende Delphi og Windows, nemlig hvordan programmer styres af hændelser. Vi har set, hvordan vores Delphiprogrammer består af en række event-procedurer, f.eks. Clickprocedurer til knap eller menupunkt. Programmets udførelse er altså bestemt af modtagelsen af hændelser (eng: events) bl.a. fra mus og tastatur. Når vi med musen klikker på en knap, fanger styresystemet (i vores tilfælde Windows) dette museklik og sender besked til programmet om, at der er klikket med musen. Programmet sørger for, at netop den knap, der er klikket, på får udført sin Click-procedure. Hensigten med dette afsnit er at give en nærmere forståelse af, hvordan disse hændelser behandles, og at vise, at et moderne styresystem er nødt til at være hændelsesstyret (eng: eventdriven). Først skal vi med nogle små eksempler se, hvordan disse hændelser fungerer i Delphiprogrammer. Dette afsnit giver også en øget forståelse for, hvordan Windows og Windowsprogrammer virker. Musehændelser Øvelse 6.1 MouseDown, MouseUp, Click Indtil nu har vi kun beskrevet musehændelsen OnClick. Vi skal se på nogle små programmer, der undersøger andre musehændelser. Hent fra Web/CD EVENTS\MEVENTS. Skærmbilledet ser således ud: Formen indeholder 6 labels, hvis Caption ændres ved visse musehændelser. Dan dig overblik over programmet ved at køre det: klik et par gange dels på Button1 eller dels i Formen uden for de to knapper. 1

Til knappen Button1" er knyttet tre events, nemlig MouseDown, MouseUp og Click. Hver af disse events tilføjer et x til de tre labels, der beskriver de tre hændelser: procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); LabelNedKnap.Caption:=LabelNedKnap.Caption+'x' procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); LabelOpKnap.Caption:=LabelOpKnap.Caption+'x' procedure TForm1.Button1Click(Sender: TObject); LabelKlikKnap.caption:=LabelKlikKnap.Caption+'x' Til formen er der knyttet samme tre events: procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); LabelNedForm.Caption:=LabelNedForm.Caption+'x' procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); LabelOpForm.Caption:=LabelOpForm.Caption+'x' procedure TForm1.FormClick(Sender: TObject); LabelKlikForm.Caption:=LabelKlikForm.Caption+'x' Prøv nu at undersøge disse tre musehændelser nærmere. Tryk museknappen ned i Button1; bemærk det nye kryds. Slip knappen i Button1. Bemærk, at der registreres to hændelser: MouseUp og Click. Tryk museknappen ned i Button1, før musen uden for Button1 og slip den. Bemærk, at der nu ikke registreres en Click hændelse. 2

Tryk museknappen ned et tomt sted i Form1. Bemærk det nye kryds. Slip knappen et tomt sted. Bemærk, at der registreres to hændelser: MouseUp og Click. Tryk museknappen ned et tomt sted i Form1, før musen ind i Button1 og slip den. Læg nøje mærke til hvilke musehændelser der registreres, og hvilken komponent der får dem. Prøv endelig at bruge højre museknap og læg mærke til hændelserne. MouseMove Hent fra Web/CD EVENTS\MMOVE. Kør programmet. Og før langsomt musen som angivet ved pilen på følgende figur, og bemærk hvordan caption på form, knap og panel ændres: tallet tælles op med én hver gang, der kommer en MouseMove hændelse. Form, knap og panel har alle en MouseMove-eventprocedure, dvs. en eventprocedure, der kaldes, når musen flyttes. De tæller alle en variabel op med en og sætter Caption for komponenten til den nye værdi konverteret til en streng. Alle tre captions viser derfor hele tiden, hvor mange MouseMove hændelser, der er modtaget. Eventprocedurerne ser således ud procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); Inc(Form1MM); Form1.Caption:=IntToStr(Form1MM); procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); Inc(Panel1MM); Panel1.Caption:=IntToStr(Panel1MM); 3

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); Inc(Button1MM); Button1.Caption:=IntToStr(Button1MM); Gentag det samme med hurtig bevægelse af musen. Det er helt åbenbart, at der nu modtages færre MouseMove hændelser. Forklaringen er, at behandlingen af hver af vores tre eventhandlere tager tid, så der er et lille tidsrum, hvor Windows ikke aflæser musen. Derfor bør de eventprocedurer, man selv skriver være så korte og hurtige som mulige. Iøvrigt ses fænomenet ved mange Windowsprogrammer og Windows selv: vi har alle oplevet, at skærmen i et øjeblik mangler at blive opdateret, eller at en menu ruller ned med nogen forsinkelse, fordi programmet er i færd med noget, som tager lidt tid. Øvelse 6.2 Museknap og position Måske har du lagt mærke til, at MouseDown- og MouseUp-procedurerne har en parameter der hedder Button af typen TMouseButton og to integerparametre, der hedder X og Y. Button har en af værdierne mbright, mbleft, mbmiddle, svarende til de tre museknapper. X og Y er musens position i det øjeblik, knappen blev trykket ned eller sluppet. Det skal vi se udnyttelsen af i et lille Delphiprojekt. Hent fraweb/cd EVENTS\MKNAPPOS og kør det. Hvilken museknap, der blev betjent, vises i venstre Editkomponent og musens position i højre Editkomponent. En bemærkning: Visse mus har en facilitet som muliggør programmering af knapperne. F.eks. kan midterste museknap programmeres til at svare til et dobbeltklik. Hvis det er gjort vil et Delphiprogram modtage et dobbeltklik, når der trykkes på midterste knap. Formens MouseDown-proceduren har følgende udseende procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); case Button of mbleft: Edit1.Text:='Venstre'; mbmiddle: Edit1.Text:='Midt'; mbright: Edit1.Text:='Højre'; Edit2.Text:='('+IntToStr(x)+','+IntToStr(y)+')'; Knappens MouseDown er knyttet til Formens MouseDown, den netop viste procedure er derfor fælles for Button1 og Form1. Denne metode fritager programmøren for at skrive samme kode to 4

gange. Leg lidt med programmet, klik og tryk ned både i form og på Button1. Bemærk at koordinaterne refererer til den komponent, der modtager hændelsen. Vi kunne have lavet en lignende MouseUp eventprocedure. I senere afsnit skal vi bruge musepositionen i et tegneprogram og i et puslespil. Tastaturhændelser og fokus for komponenter Det er helt åbentbart, at en musehændelse går til den komponent, musen peger på. Tastaturhændelser kan være nedtrykning af tast, indtastning af tegn eller, at en tast slippes. Disse er forskellige ligesom MouseDown, Click og MouseUp; men de er ikke knyttet til et punkt på skærmen. For at program og bruger kan vide, hvilken komponent der modtager en tastaturhændelse, har man i Windows indført, at blandt komponenterne i et vindue er der netop én komponent, der har fokus. At en komponent har fokus betyder, at det er denne komponent, der modtager en evt. tastaturhændelse. Hent Web/CD EVENTS\KEYEVENT. Dette projekt indeholder et skærmbillede med mange komponenter. Skærmbilledet viser, at Button1 er den komponent, der har i øjeblikket har fokus. Det ses ved, at Button1-knappen har et stiplet rektangel. Brugeren kan skifte fokus til andre komponenter på flere måder: 1) ved at klikke med musen på den komponent, der skal have fokus, 2) trykke på Alt+genvejstast, der knyttet til komponenten, denne genvejstast er vist ved understregning. F.eks. vil Alt+2 skifte til editkomponent med label Edit2", eller 3) man kan skifte mellem komponenterne ved at trykke Tab eller skift+tab. 5

Øvelse 6.3 Prøv alle disse muligheder for at skifte fokus, og bemærk, hvordan fokus vises enten ved et stiplet rektangel eller ved, at der er en skrivemarkør i komponenten. Undersøg, hvordan disse genvejstaster sættes i Delphi: en label har en property, FocusControl, den kan sættes til en komponent i formen. Iøvrigt vises det understregede bogstav ved, at man i Caption skriver et &-tegn foran bogstavet. De tre korte Edit-komponenter kan ikke gives fokus, idet de alle har deres Enabled-property sat til false. Den mest anvendelige Event til en Edit-komponent er formodentlig OnChange. I eksemplet ovenfor har de tre store Edit-komponenter hver en Change-procedure, der viser, hvordan programmet kan skifte fokus til anden komponent; hvis længden af Edit-komponentens Text er over 2, skiftes til næste Edit-komponent. Prøv at køre programmet; med fokus i Edit1 skriver du Abekatten og bemærker, hvordan fokus skifter efter hver 3. bogstav. Inden dette focusskift vises længden af Text en i Edit-komponenten bagved. procedure TForm1.Edit1Change(Sender: TObject); Edit4.Text:=IntToStr(Length(Edit1.Text)); if Length(Edit1.Text)>2 then Edit2.SetFocus procedure TForm1.Edit2Change(Sender: TObject); Edit5.Text:=IntToStr(Length(Edit2.Text)); if Length(Edit2.Text)>2 then Edit3.SetFocus procedure TForm1.Edit3Change(Sender: TObject); Edit6.Text:=IntToStr(Length(Edit3.Text)); if Length(Edit3.Text)>2 then Edit1.SetFocus Rækkefølgen for skift mellem komponenterne, når der trykkes på Tab-tasten, er bestemt af komponenternes TabOrder-property. Den kan enten sættes direkte i Object Inspector eller lettere med en dialogboks: vælg i menuen Edit TabOrder, så er det let at ændre TabOrder ved at ændre rækkefølgen. Den komponent, der står øverst i dialogboksen, har fokus ved programstart. Bemærk også TabStop-propertien, som er True, hvis komponenten er med i rækkefølgen, og False hvis der ikke skal stoppes ved komponenten. Øvelse 6.4 Prøv at eksperimentere med TabOrder og TabStop for komponenterne i formen. 6

En anden vigtig tastaturhændelse er OnKeyPress. Den giver mulighed for at reagere på et tastetryk. Vi skal i det følgende undersøge anvendelsen heraf. Start et nyt projekt i Delphi og lav en KeyPress-procedure til Form1: procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); ShowMessage('Du har tastet '+Key); Kør projektet og tryk på en bogstav-tast. Prøv også at trykke på en pil-tast eller PageUp: programmet reagerer kun på almindelige taster. Ofte ønsker man, at programmet kun reagerer på bestemte tastetryk. Hvis ShowMessage ovenfor kun skal vises, hvis brugeren trykker på a eller A, skal proceduren ændres til: procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); * if (Key='a') or (Key='A') then ShowMessage('Du har tastet '+Key); Indsæt nu en Memo i formen og kør igen programmet. Nu reagerer programmet ikke mere på tastetryk. Forklaringen er at Memo'en har fokus, og den får derfor tastetrykket i stedet for formen. Imidlertid er det ofte ønskeligt, at formen modtager tastetryk, så man undgår at skrive KeyPress-procedurer til alle komponenter i formen. Derfor kan man indstille formen til at modtage tastetryk, før de leveres videre til den komponent i formen, der har fokus: Sæt Form1's KeyPreview-property til true. Kør igen programmet og læg mærke til, at det igen reagerer på tastetryk. Hvis komponenten med fokus også har en KeyPress-procedure, vil såvel Form1 som komponenten modtage tastetrykket; formen modtager det bare først. Ønsker du at programmet reagerer på særlige taster, skal du bruge OnKeyDown-events. Disse hændelser kommer idet tasten trykkes ned. Hændelsen OnKeyUp kommer når en tast slippes. Gentegning af skærmbillede Et program, der kører under Windows, kan få sit skærmbillede gemt helt eller delvist bag et andet vindue. Om dette sker, afhænger af, hvad brugeren foretager sig. Generelt bør ethvert Windowsprogram kunne gentegne sit skærmbillede, når det får besked herom fra Windows. Delphi sørger automatisk for gentegning af alle sine komponenter. Men har et program selv tegnet i en komponents canvas, skal programmet selv kunne gentegne denne canvas. 7

Hent fra Web/CD EVENTS\PAINT. Start programmet, og klik på Tegn-knappen. Så får du følgende skærmbillede. Klik nu på Vis Form2-knappen, så vises Form2 oven i Form1. Luk igen Form2. Du ser nu, at tegningen er delvis ødelagt; men at de to knapper er gentegnet. Delphi komponenterne sørger selv for gentegning; medens en canvas ikke gentegnes automatisk. Det skal programmøren derfor selv sørge for. Dette er nødvendigt, Delphi kan jo ikke vide, hvordan formens indhold skal være, f.eks. efter formen har ændret størrelse. Når Windows opdager, at et vindue skal gentegnes, sender det en OnPaint-hændelse til den pågældende form. Vi skal derfor gentegne vores canvas, når denne hændelse indtræffer. Afslut programmet og se på paintu-uniten: Click-proceduren til Tegnknappen kalder en selvdefineret procedure Tegn, som tegner figuren i canvas en. (Form1 indeholder en TPaintBox, 8

og det er dennes canvas, der tegnes i. På den måde begrænses canvasens størrelse, så den ikke dækker hele formen; men det er en detalje). Lav en procedure til Paint-procedure i Form1: Vis i ObjectInspector events for Form1; dobbeltklik på OnPaint. Lav et kald af proceduren Tegn i denne Event-procedure: procedure TForm1.FormPaint(Sender: TObject); Tegn Kør programmet igen. Du bemærker nu, at figuren tegnes straks ved programstart, uden du har trykket på Tegn-knappen. Det skyldes, at Form1 får en OnPaint-event, når Formen skal tegnes på skærmen. Vis Form2 og luk den igen: Form1gentegnes nu helt. Tilføj nu en linie til FormPaint-proceduren: procedure TForm2.FormPaint(Sender: TObject); Tegn; * Messagebeep(1) Der kommer nu et beep, hver gang OnPaint-eventen behandles. Kør programmet igen og bemærk beep. Prøv også at flytte Form2 medens den er vist: der kommer nu en lang række beep, idet Form1 hele tiden gentegnes. Som vi nu har set, vil Windows hele tiden generere en enorm mængde hændelser, som sendes videre til det relevante program. Man kan undre sig over, at Windows normalt fungerer rimelig hurtigt, når alle disse hændelser skal genereres, sendes videre og behandles i de enkelte programmer. Det er uden tvivl et sted, hvor programmørerne har lavet mest mulig effektiv kode, så det foregår hurtigst muligt. Bemærk i vørigt, at mange af programmerne i dette afsnit viser, hvordan man simpelt kan undersøge virkningen af Delphi, hvis man er i tvivl om, hvordan noget fungerer, f.eks. ved at sætte MessageBeep eller ShowMessage ind passende steder i programkoden. Nødvendigheden af hændelsesstyret programmering Med moderne styresystemer er det blevet absolut nødvendigt at gå over til hændelsesstyret programmering. Dette indses ved at betragte et muligt skærmbillede i Windows. Nedenstående skærmbillede viser, der er startet tre programmer:, WordPerfect 6.1, Explorer (fra en engelsk Windows 95) samt Minestryger (fra Windows 3.x). 9

WordPerfect er det aktive program. Lad os tænke igennem, hvad brugeren kan foretage sig. Han kan skifte til et af de andre programmer eller klikke i tastbaren (Proceslinie). Det ville ikke være hensigtsmæssigt, hvis WordPerfect skulle holde øje med, om brugeren klikkede med musen uden for dets eget vindue. I så tilfælde skulle WordPerfect nemlig sende museklikket til et andet program. Derfor er det styresystemet Windows, der aflæser museklikket og sender det til det program, der skal modtage det. Dette program, som således modtager musehændelsen, har en komponent med en event-procedure, som behandler hændelsen. (Hvis ikke det har, virker museklikket ikke!) Selvom brugeren bliver i WordPerfect, er det stadig en utrolig mængde ting, brugeren kan foretage sig: 1) Taste et nyt tegn, der skal indsættes i teksten, evt. kan han trykke på Delete eller Backspace for at slette tegn eller bruge piletasterne. 2) Vælge i menuen ved først at trykke på Alt-tasten for at aktivere menuen med tasteturet og efterfølgende bruge piletaster og Enter-tast. 3) Vælge i menuen ved at klikke med musen. 4) Vælge i menuen ved at trække med musen. 5) Vælge i menuen med et genvejstryk: Ctrl+g (betyder Gem i WordPerfect 6.1) 10

6) Aktivere en knap med et museklik. 7) Klikke med musen i scrollbaren (mange muligheder). 8) Trække en blok i teksten med musen. 9) Klikke med musen i teksten for at flytte markøren. 10) Minimere vinduet ved et musetryk 11) Flytte vinduet med musetræk Hvis programmet skulle foretage denne detaljerede aflæsning af mus og tastatur, ville programmet blive ret kompliceret. I stedet kan vi med hændelsesstyret programmering i Delphi sammenknytte hændelser og procedurer. Når vi skriver en Click-procedure til en knap eller menupunkt, har vi angivet, hvad der skal ske, når en sådan hændelse indtræffer; men vi skal aldrig selv undersøge, hvornår hændelsen indtræffer; og det er en stor fordel. Naturligvis undgås den komplicerede aflæsning af musen ikke. Windows og de grundliggende dele af Delphi skal kunne foretage denne aflæsning og omdirigere hændelsen til den komponent, der skal modtage den. Men det er et kæmpe fremskridt, for så er det kun Microsofts og Borlands programmører, der skal løse disse problemer. Vi andre er helt fritaget for det. I DOS-programmer får man overhovedet ingen hjælp fra styresystemet, så i DOS-programmer skal programmet selv uafbrudt foretage aflæsning af musen. At styresystemet arbejder på denne måde, betyder også, at vores egne programmer ikke uden videre må foretage sig egne ting i lang tid, for så forhindrer det styresystemet i at modtage nye hændelser imedens. Men det er egentlig fordi styresystemet (Windows 3.x og Windows95, for så vidt angår 16-bit applikationer) er for dårligt: det kunne jo bare afbryde programmet og behandle hændelser, og så lade programmet fortsætte. Så var det kun programmet selv, der virkede dødt, ikke hele styresystemet. Øvelse 6.5 Blokering af program og styresystem. Hent fra Web/CD EVENTS\BREAK. Programmet har en Kør og en Stop knap. Efter klik på Kør tælles Caption i den label, der er til venstre, op fra 0 til 4000; men hvis brugeren trykker på Stop-knappen skal løkken afbrydes. Event-procedurerne til de to knapper er procedure TForm1.ButtonRunClick(Sender: TObject); UserBreak:=False; Process; procedure TForm1.ButtonStopClick(Sender: TObject); UserBreak:=True; MessageBeep(1) 11

I ButtonRunClick sættes boolean-variablen UserBreak til false. Og vi starter proceduren Process, som tæller Caption op for vores label. ButtonStopClick sætter UserBreak til true og vores løkke i proceduren Process tester hele tiden, om UserBreak er blevet sand; hvis det er tilfældet, hoppes ud af proceduren. procedure TForm1.Process; var i: Integer; for i:=1 to 4000 do Label1.Caption:=IntToStr(i)+' '; Label1.Refresh; if UserBreak then Exit; { hop ud hvis UserBreak er sand } Imidlertid virker vores program ikke efter hensigten. Når proceduren process starter, blokerer den så at sige for modtagelse af hændelser. Bemærk iøvrigt hvordan hele styresystemet er blokeret: du kan f.eks. ikke skifte til et andet program eller minimalisere Formen medens løkken i Process kører; først når løkken er færdig, virker din kommando. Problemet løses ved i vores lange for-løkke at lade Windows behandle hændelser. Det gøres med sætningen Application.ProcessMessages; så Process bliver til procedure TForm1.Process; var i: integer; for i:=1 to 4000 do * Application.ProcessMessages; Label1.Caption:=IntToStr(i)+' '; Label1.Refresh; if UserBreak then exit; { hop ud hvis UserBreak er sand } Application.ProcessMessages lader Windows aflæse hændelser fra mus eller tastatur. Hvis brugeren trykke på Stop-knappen, bliver ButtonStopClick derfor udført, og vores program stopper. Tilføj denne linie til programmet, kør igen og afbryd nu ved klik på Stop-knappen. 12

Det ses, at programmet nu kører mærkbart langsommere. Det tager nemlig tid at udføre Application.ProcessMessages Man kan forbedre programmet lidt ved at lave den om til if i mod 10=0 then Application.ProcessMessages Så lader man kun for hver tiende værdi af i Windows aflæse hændelser. Iøvrigt kan løkken også afbrydes af et tryk på ESC. De interesserede kan se på event-proceduren hertil. 13