Raadsel

Status
Niet open voor verdere reacties.

ingenieur

Gebruiker
Lid geworden
16 nov 2010
Berichten
8
Ik wil een programma schrijven waarmee je wat met kleuren kunt 'spelen'. Code:

procedure TForm1.LinksClick(Sender: TObject);
begin
dec(teller);
if teller<1 then teller:=nKleuren;
UitvoerschermKleur.Color:=kleur[teller];
UitvoerschermKleurnummer.Text:=IntToStr(teller);
end;

procedure TForm1.RechtsClick(Sender: TObject);
begin
inc(teller);
if teller>nKleuren then teller:=1;
UitvoerschermKleur.Color:=kleur[teller];
UitvoerschermKleurnummer.Text:=IntToStr(teller);
end;
Dit werkt.

Nu wil ik dat in een uitvoerveld alle mogelijke rgb combinaties worden weergegeven:

procedure TForm1.UpClick(Sender: TObject);
const max=255;
var R,G,B: Byte;
begin
for R:=1 to max do
begin
for G:=1 to max do
begin
for B:=1 to max do
begin
Canvas.Brush.Color := RGB(R,G,B);
Canvas.Rectangle(1,30,400,500);
Canvas.Brush.Color := clWhite;
Canvas.TextOut(430,100,'R: '+IntToStr(R)+' ');
Canvas.TextOut(430,120,'G: '+IntToStr(G)+' ');
Canvas.TextOut(430,140,'B: '+IntToStr(B)+' ');

UitvoerschermRoodWaarde.Text:=IntToStr(r);
UitvoerschermGroenWaarde.Text:=IntToStr(g);
UitvoerschermBlauwWaarde.Text:=IntToStr(b);
UitvoerschermKleur.Color:=RGB(r,g,b);
Sleep(0);
end;
end;
end;
end;


De Canvas opdrachten dienen ter controle en die werken goed. Maar ik wil ze vervangen door de uitvoeropdrachten. Maar die doen ogenschijnlijk niets. Alleen als de lus helemaal is afgerond worden de waarden van de r, g, en b variabelen in de Edit vensters geplaatst. Net zo als de kleur. Maar tijdens het uitvoeren gebeurt er niets. Hoe kan dat vraag ik me af. Ik ben hier al uren mee bezig en ik kom er niet uit.

Ook wil ik graag dat als ik op een muisknop klik de lus wordt onderbroken met exit. Dus iets als If MouseDown then Exit. Is er zoiets dat een muisklik een booleaanse waarde genereert? Ook hier heb ik naar gezocht maar ik ben net begonnen met Delphi en de hoeveelheid informatie is overweldigend.

Als iemand me kan helpen dan graag.
 
Wat krijg je als je op de plek van

Code:
UitvoerschermRoodWaarde.Text:=IntToStr(r);

een ShowMessage(IntToStr(r)) ertussen zet?
 
KleurenScreenShot.JPG

Dank voor je reactie. Er gebeurt, in mijn ogen, iets heel geks (zie bijlage). Ik moet telkens op ok klikken om de lus verder te laten lopen. Dit moet door ShowMessage veroorzaakt worden. Maar waarom? Als SM er niet tussen staat wordt de lus ook wel doorlopen, maar worden de opdrachten om de kleur te veranderen en de r waarde in het venster te plaatsen niet uitgevoerd. Ik ben benieuwd welke conclusie je eventueel kunt trekken :rolleyes:
 
Dit klinkt alsof je niet weet waar ShowMessage voor bedoeld is.
 
Nee, dit weet ik inderdaad niet. Maar weet jij nu waarom er tijdens her doorlopen van de lus geen text in het edit venster wordt geplaatst en de kleur van een ander edit venster niet wordt getoond?
 
ShowMessage('Hello world') toont een boodschap aan de gebruiker (jij dus) en de gebuiker moet deze boodschap wegklikken voordat de code verder loopt.

Dit levert een manier op om te debuggen. Als je wilt weten of een variabele wel een correcte waarde heeft op een bepaalde plek in je code, dan kun je daar tijdelijk het volgende statement in je code plaatsen:

Code:
... code ...
ShowMessage(Mijnvariabele);
... code ...

Mijn voorstel is dat jij op deze manier jouw code debugt, zodat je er achter komt welke waarde r, g en b hebben aan het einde van één iteratie in jouw loop.
 
Goed. Code:

procedure TFormKleuren.KnopRandomClick(Sender: TObject);
begin
for i:=1 to max do
begin
Randomize; r:=Random(max)+1; g:=Random(max)+1; b:=Random(max)+1;
UitvoervensterR.Text:=IntToStr(r);
UitvoervensterG.Text:=IntToStr(g);
UitvoervensterB.Text:=IntToStr(b);
UitvoervensterK.Color:=RGB(r,g,b);
If CheckBox then Formkleuren.Color:=RGB(r,g,b);
ShowMessage(IntToStr(i));
end;
end;

Ik heb de oorspronkelijke lus waarbij alle 255^3 kleuren worden gegenereerd veranderd in bovenstaande. Maar qua principe maakt dat niet uit. Elke keer als ik op ok klik wordt i met 1 verhoogd en krijg ik een willekeurige kleur in het UitvoervensterK. En als ik ShowMessage(IntToStr(i)); er tussen uit haal moet ik telkens op KnopRandomClick klikken om de iteratie te vervolgen. Dus Met of zonder ShowMessage(IntToStr(i)); wacht iets in de loop op een 'actie'. Als ik alle Uitvoervenster.Text er uit haal moet ik blijven klikken. Ook als ik Uitvoervenster.Color er uit haal en de .Text niet moet ik blijven klikken. Als elk venster op een klik wacht zou ik 4x moeten klikken, maar dat is ook niet zo. Ik snap het niet. Als je de zelfde loop met Canvas uitvoert werkt het allemaal wel. Maar dat vind ik niet mooi en bovendien wil ik weten waarom het zo blijkbaar niet kan. Vraag blijft waarom de edit vensters in een lus zich op een voor mij onlogische manier gedragen.

Ik heb nog een vraag. Het is misschien wat te veel van het goede maar dat merk ik dan wel. Ik kan ook met drie scrollbars de RGB waarden instellen. Maar als ik een willekeurige kleur genereer met bovenstaande procedure dan worden de actuele RGB waarden wel in de editvensters getoond maar de schuifjes in de drie bars veranderen niet van positie.

Code voor regeling van de R waarde:

procedure TFormKleuren.ScrollBarRScroll(Sender: TObject;
ScrollCode: TScrollCode; var p: Integer);
begin p:=r;
UitvoervensterR.Text:=IntToStr(p);
UitvoervensterG.Text:=IntToStr(g);
UitvoervensterB.Text:=IntToStr(b);
UitvoervensterK.Color:=RGB(r,g,b);
If CheckBox then Formkleuren.Color:=RGB(r,g,b);
r:=p;
end;

Pas als ik in de bar klik schiet het schuifje naar de juiste waarde. Vanuit de procedure boven aan dit bericht zou bovenstaande moeten worden aangeroepen. Maar bovenstaande wordt alleen uitgevoerd bij onScroll. Dus hoe krijg je zoiets voor elkaar? :eek: In ieder gevak bedankt voor je reactie :)
 
Zou je je project willen posten?
Dan kan ik allicht een poging doen om wat te gaan uitproberen.

Eerst nog een wild guess:
Het statement 'application.processmessages' kun je in je loop plaatsen,
dat zorgt er doorgaans voor dat je applicatie de tijd neemt om achter de schermen wat zaken af te handelen. Misschien worden die edits daardoor bijgewerkt?
 
... !!! Het werkt! 'application.processmessages' lost het op. Hoe kan dat? Ik zal eens zoeken. Heel erg bedankt. Dit is de interface en code:

ScreenShotKleuren.JPG

Code:
unit Kleuren;

interface

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

type
  TFormKleuren = class(TForm)
    KnopRandom:            TButton;
    UitvoervensterR:       TEdit;
    UitvoervensterB:       TEdit;
    UitvoervensterG:       TEdit;
    UitvoervensterK:       TMemo;
    ScrollBarG:            TScrollBar;
    ScrollBarB:            TScrollBar;
    ScrollBarRGB:          TScrollBar;
    PanelR:                TPanel;
    PanelG:                TPanel;
    PanelB:                TPanel;
    PanelK:                TPanel;
    Panel1:                TPanel;
    Panel2:                TPanel;
    CheckBox1:             TCheckBox;
    procedure KnopRandomClick(Sender: TObject);
    procedure ScrollBarRScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure FormActivate(Sender: TObject);
    procedure ScrollBarGScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure ScrollBarBScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure ScrollBarRGBScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure CheckBox1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

const max=255;
var
  FormKleuren : TFormKleuren;
  r,g,b,i     : Byte;
  CheckBox    : Boolean;

implementation

{$R *.dfm}

procedure TFormKleuren.CheckBox1Click(Sender: TObject);
begin
  If CheckBox=True then CheckBox:=False else
    CheckBox:=True;
  FormKleuren.Color:=RGB(235,235,235);
end;

procedure TFormKleuren.KnopRandomClick(Sender: TObject);
begin
   for i:=1 to max do
      begin
        Randomize; r:=Random(max)+1; g:=Random(max)+1; b:=Random(max)+1;
        UitvoervensterR.Text:=IntToStr(r);
        UitvoervensterG.Text:=IntToStr(g);
        UitvoervensterB.Text:=IntToStr(b);
        UitvoervensterK.Color:=RGB(r,g,b);
        If CheckBox then Formkleuren.Color:=RGB(r,g,b);
        application.processmessages;
        sleep(100);
      end;
end;

procedure TFormKleuren.ScrollBarRScroll(Sender: TObject;
 ScrollCode: TScrollCode; var p: Integer);
begin
  UitvoervensterR.Text:=IntToStr(p);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(b);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  r:=p;
end;

procedure TFormKleuren.ScrollBarGScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(p);
  UitvoervensterB.Text:=IntToStr(b);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  g:=p;
end;

procedure TFormKleuren.ScrollBarBScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(p);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  b:=p;
end;

procedure TFormKleuren.ScrollBarRGBScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin
  UitvoervensterR.Text:=IntToStr(p);
  UitvoervensterG.Text:=IntToStr(p);
  UitvoervensterB.Text:=IntToStr(p);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  r:=p; g:=p; b:=p;
end;

procedure TFormKleuren.FormActivate(Sender: TObject);
begin
  r:=1; g:=1; b:=1; CheckBox:=False;
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(b);
  UitvoervensterK.Color:=RGB(r,g,b);
end;

end.
 
.. ik geloof dat alles opgelost is. Ik kan nu ook met een andere knop de lus stoppen. Zo is het geworden:

Code:
unit Kleuren;

interface

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

type
  TFormKleuren = class(TForm)
    KnopRandomStart: TButton;
    UitvoervensterR:       TEdit;
    UitvoervensterB:       TEdit;
    UitvoervensterG:       TEdit;
    UitvoervensterK:       TMemo;
    ScrollBarG:            TScrollBar;
    ScrollBarB:            TScrollBar;
    ScrollBarRGB:          TScrollBar;
    PanelR:                TPanel;
    PanelG:                TPanel;
    PanelB:                TPanel;
    PanelK:                TPanel;
    Panel1:                TPanel;
    Panel2:                TPanel;
    CheckBox1:             TCheckBox;
    CheckBoxR:             TCheckBox;
    CheckBoxG:             TCheckBox;
    CheckBoxB:             TCheckBox;
    KnopRandomStop: TButton;
    ScrollBarSleep: TScrollBar;
    procedure KnopRandomStartClick(Sender: TObject);
    procedure ScrollBarRScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure FormActivate(Sender: TObject);
    procedure ScrollBarGScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure ScrollBarBScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure ScrollBarRGBScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBoxRClick(Sender: TObject);
    procedure CheckBoxGClick(Sender: TObject);
    procedure CheckBoxBClick(Sender: TObject);
    procedure KnopRandomStopClick(Sender: TObject);
    procedure ScrollBarSleepScroll(Sender: TObject;
      ScrollCode: TScrollCode; var p: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

const max=255;
var
  FormKleuren      : TFormKleuren;
  s                : integer;
  r,g,b,i          : byte;
  Rood,Groen,Blauw : boolean;
  CheckBox         : boolean;
  CheckBoxRood     : boolean;
  CheckBoxGroen    : boolean;
  CheckBoxBlauw    : boolean;
  MetLusDoorgaan   : boolean;

implementation

{$R *.dfm}

procedure TFormKleuren.CheckBox1Click(Sender: TObject);
begin
  If CheckBox=True then CheckBox:=False else
    CheckBox:=True;
  FormKleuren.Color:=RGB(235,235,235);
end;

procedure TFormKleuren.CheckBoxRClick(Sender: TObject);
begin
   If CheckBoxRood=True then CheckBoxRood:=False else
    CheckBoxRood:=True;
end;

procedure TFormKleuren.CheckBoxGClick(Sender: TObject);
begin
   If CheckBoxGroen=True then CheckBoxGroen:=False else
    CheckBoxGroen:=True;
end;

procedure TFormKleuren.CheckBoxBClick(Sender: TObject);
begin
  If CheckBoxBlauw=True then CheckBoxBlauw:=False else
    CheckBoxBlauw:=True;
end;

procedure TFormKleuren.KnopRandomStartClick(Sender: TObject);
begin
   REPEAT
      Randomize; r:=Random(max)+1; g:=Random(max)+1; b:=Random(max)+1;
      UitvoervensterR.Text:=IntToStr(r);
      UitvoervensterG.Text:=IntToStr(g);
      UitvoervensterB.Text:=IntToStr(b);
      UitvoervensterK.Color:=RGB(r,g,b);
      If CheckBox then Formkleuren.Color:=RGB(r,g,b);
      application.processmessages;
      sleep(s);
   UNTIL Not MetLusDoorgaan;
   MetLusDoorgaan:= Not MetLusDoorgaan;
   Rood:=true; Groen:= true; Blauw:=true;
end;

procedure TFormKleuren.KnopRandomStopClick(Sender: TObject);
begin
  MetLusDoorgaan:=false;
end;

procedure TFormKleuren.ScrollBarSleepScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin s:=p; end;

procedure TFormKleuren.ScrollBarRScroll(Sender: TObject;
 ScrollCode: TScrollCode; var p: Integer);
begin if Rood then p:=r;
  UitvoervensterR.Text:=IntToStr(p);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(b);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  r:=p; Rood:=not Rood;
end;

procedure TFormKleuren.ScrollBarGScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin if Groen then p:=g;
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(p);
  UitvoervensterB.Text:=IntToStr(b);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  g:=p; Groen:= not Groen;
end;

procedure TFormKleuren.ScrollBarBScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin if Blauw then p:=b;
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(p);
  UitvoervensterK.Color:=RGB(r,g,b);
  If CheckBox then Formkleuren.Color:=RGB(r,g,b);
  b:=p; Blauw:= not Blauw;
end;

procedure TFormKleuren.ScrollBarRGBScroll(Sender: TObject;
  ScrollCode: TScrollCode; var p: Integer);
begin
  if CheckBoxRood then
    begin r:=p;
       UitvoervensterK.Color:=RGB(r,g,b);
       if CheckBox then FormKleuren.Color:=RGB(r,g,b);
    end;
   if CheckBoxGroen then
    begin g:=p;
       UitvoervensterK.Color:=RGB(r,g,b);
       if CheckBox then FormKleuren.Color:=RGB(r,g,b);
    end;
   if CheckBoxBlauw then
    begin b:=p;
       UitvoervensterK.Color:=RGB(r,g,b);
       if CheckBox then FormKleuren.Color:=RGB(r,g,b);
    end;
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(b);
end;

procedure TFormKleuren.FormActivate(Sender: TObject);
begin
  r:=1; g:=1; b:=1; s:=0;
  Rood          :=false;
  Groen         :=false;
  Blauw         :=false;
  CheckBox      :=false;
  CheckBoxRood  :=false;
  CheckBoxGroen :=false;
  CheckBoxBlauw :=false;
  MetLusDoorgaan:=true;
  UitvoervensterR.Text:=IntToStr(r);
  UitvoervensterG.Text:=IntToStr(g);
  UitvoervensterB.Text:=IntToStr(b);
  UitvoervensterK.Color:=RGB(r,g,b);
end;

end.

.. dit was me zonder jouw reactie niet gelukt. Dank je wel :thumb:
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan