Lus onderbreken in Delphi

Status
Niet open voor verdere reacties.

Rednalsaw

Gebruiker
Lid geworden
6 mrt 2004
Berichten
67
Ben vroeger onder DOS op ''hobbyniveau'' nogal intensief bezig geweest met programmeren in TurboPasal en ben net begonnen me te verdiepen in Delphi. Ik moet zeggen dat ik het razend ingewikkeld vind en ik kan me nog geen goed beeld vormen van de essentie van het object georienteerd programmeren.

Maar afgezien daarvan heb ik het volgende probleem. Ik heb een programmaatje geschreven die alle kleuren genereert die er zijn.

for R:=1 to max (255) do
for G:=1 to max do
for B:=1 to max do
Canvas.Color:=RGB(R,G,B).

Hoe kun je er voor zorgen dat je in die lus invloed uit kunt oefenen? Vroeger nam ik een statement met KeyPressed in de lus op zodat ik het programma kon onderbreken, uit de lus kon komen. Maar Delphi kent dit dus niet (meer).
 
een component bestaat uit data en code. data zijn waarden, zoals 'height = 140' en code is lopend programma.

je hoeft in Delphi geen stukjes code te schrijven die steeds kijken of er een toets is ingedrukt. Delphi compileert hiervoor per component een standaard 'event handler'. zo heeft elk component een eigen Click handler, voor als er met de muis op wordt geklikt, en ook een eigen OnKeyDown handler voor toetsindruk.

ik heb een demootje voor je gemaakt. als je het goed doorneemt denk ik dat je er in ieder geval van leert. je hebt een Button1 en een Memo1 nodig op je form. je hoeft geen properties te veranderen, enkel de code toe te voegen zodat jouw unit er hetzelfde uitziet als de zometeen volgende.



de standaard event handler TForm1.FormCreate krijg je op je scherm door op je form te dubbelklikken. hierin komt in de regel alle initialisatie.

de standaard event handler TForm1.Button1Click krijg je op je scherm door op Button1 te dubbelklikken. hierin staat wat Windows moet doen als de gebruiker op de delphi-knop drukt.

de standaard event handler TForm1.Button1KeyDown krijg je op je scherm door de knop te selecteren in de Object Inspector, naar de tab 'Events' te gaan en daar vlak rechts van OnKeyDown in het wit te dubbelklikken.
hierin staat wat Windows moet doen als de gebruiker tijdens de tellende lus plotseling op een toets drukt. Hier zou je de twee handlers die ik hiervoor noemde ook kunnen krijgen door naast het OnClick event te dubbelklikken.



typ de aanvullende code in de code zodat het er als volgt uit komt te zien:
---------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
t: Integer;
ContLoop: Boolean;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ContLoop := true;
t := 0
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
repeat
Application.ProcessMessages; //nodig om de processor te dwingen
//te kijken of er events hebben plaatsgevonden
Memo1.Lines.Add(IntToStr(t));
Inc(t);
until (t > 4999) or (ContLoop = false)
end;

procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
ContLoop := False
end;

end.
 
Bedankt voor je reactie. Ziet er goed (hoopvol) uit. Ik ga het uitproberen en ik zal nog wel laten weten hoe het is gegaan.

Ik gebruik FormCreate zoals ik vroeger een hoofdprogramma gebruikte. (Het regelcentrum van waaruit beginnen wordt). Maar ik weet niet of dit wel de bedoeling is van FormCreate.

Initialisiaties (toekennen van beginwaarden) kan je volgens mij doen door boven de laatste end in de unit achter het gereserveerde woord initialize deze waarden toe te kennen.
 
Captain, Bedankt voor je demo. Het werkt en is inderdaad leerzaam. Nog een paar vragen. Ik heb het een beetje aangepast als volgt:

TForm1.Button1KeyDown (deed niks, moet reageren op pijlnaarbeneden?)

vervangen door een tweede knop:

procedure Tform1.Button2Click(Sender : TObject);
begin
ContLoop:=False;
end;

en

procedure TForm1.Button1Click(Sender : TObject);
begin
ContLoop:=False; {zo kun je na onderbreken lus weer verder gaan}
REPEAT
Application.ProcessMessages;
Memo1.Lines.Add(InToStr(t));
Inc(t);
UNTIL (t>4999) or (ContLoop=False);
end;

Domme vraag misschien, maar zorgt Application.ProcessMessages er voor dat terwijl de lus ''in werking'' is er gekeken wordt naar ''gebeurtenissen'' die buiten/tijdens doorlopen van lus plaatsvinden?

Hoe krijg je in Delphi het zelfde effect als in Pascal Halt?

Vriendelijke groet, Jan
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan