Binäruhr basteln; Fehler beim auslesen der Zahlen

Hey liebe wwwler,

ich arbeite momentan an einem Programm, das dazu in der Lage ist die Uhrzeit im Dualsystem darzustellen. Ich bin mittlerweile bei einem Prototypen angelangt, der dazu in der Lage ist von der Uhrzeit null an zu rechnen. Zumindestens fast, denn aus irgendeinem Grund wird mein erstes Shape (ich benutze Shapes als Punkte, wobei ein roter Punkt eine eins darstellt und ein weißer eine null) nach der ersten Sekunde rot und danach weis, was ja auch noch richtig ist. Doch sollte dann das nächste Feld rot werden und danach das erste wieder rot, dann nur das dritte rot, u.s.w. ich denke ich kann davon ausgehen, dass ihr wisst, wie man im Dualsystem zählt. Nun ja bei mir wird leider stets nur das erste Feld rot, dann weis, dann wieder rot, gleiches passiert übrigens auch bei den minuten und den stunden. Ich selbst habe schon gesucht, jedoch scheine ich den Fehler zu übersehen.

Hier der Quelltext:

unit Binaeruhr;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
procedure ShapesErzeugen;
procedure Zahlenlesen(a:array of integer; Shapes:array of TShape);

var
Form1: TForm1;
minZaehler, stuZaehler:integer;
sek, min, stu:array [0…10] of integer;
sekShapes, minShapes, stuShapes:array of TShape; //Länge:6,6,5

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var clear, Zaehler : integer;
begin
ZaehlerStellen;
for Zaehler:=0 to 9 do
sek[Zaehler]:=Dualzaehlen(sek);
inc(minZaehler);
Zahlenlesen(sek, sekShapes);
if minZaehler=60 then
begin
ZaehlerStellen;
for Zaehler:=0 to 9 do
min[Zaehler]:=Dualzaehlen(min);
inc(stuZaehler);
for clear:=0 to 9 do
sek[clear]:=0;
Zahlenlesen(min, minShapes);
minZaehler:=0;
end;
if stuZaehler=60 then
begin
ZaehlerStellen;
for Zaehler:=0 to 9 do
stu[Zaehler]:=Dualzaehlen(stu);
for clear:=0 to 9 do
min[clear]:=0;
Zahlenlesen(stu, stuShapes);
StuZaehler:=0;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var clear : integer;
begin
minZaehler:=0;
stuZaehler:=0;
ShapesErzeugen;
for clear:= 0 to 9 do
begin
sek[clear]:=0;
min[clear]:=0;
stu[clear]:=0;
end;
end;

procedure ShapesErzeugen;
var i, oben, links:integer;
begin
SetLength(sekShapes, 6);
SetLength(minShapes, 6);
SetLength(stuShapes, 5);
oben:=32;
links:=24;
for i:=0 to 5 do
begin
sekShapes[i]:= TShape.Create(nil);
sekShapes[i].Parent:=Form1;
sekShapes[i].Shape:=stCircle;
sekShapes[i].Top:=oben;
sekShapes[i].Left:=links;
oben:=oben+16;
sekShapes[i].Width:=9;
end;
oben:=32;
links:=88;
for i:=0 to 5 do
begin
minShapes[i]:= TShape.Create(nil);
minShapes[i].Parent:=Form1;
minShapes[i].Shape:=stCircle;
minShapes[i].Top:=oben;
minShapes[i].Left:=links;
oben:=oben+16;
minShapes[i].Width:=9;
end;
oben:=32;
links:=166;
for i:=0 to 4 do
begin
stuShapes[i]:= TShape.Create(nil);
stuShapes[i].Parent:=Form1;
stuShapes[i].Shape:=stCircle;
stuShapes[i].Top:=oben;
stuShapes[i].Left:=links;
oben:=oben+16;
stuShapes[i].Width:=9;
end;
end;

procedure Zahlenlesen(a:array of integer; Shapes:array of TShape);
var lauf, Zahl:integer;
begin
for lauf:= 0 to length(Shapes)-1 do
begin
if a[lauf] = 1 then
Shapes[lauf].Brush.Color:=clred;
if a[lauf] = 0 then
Shapes[lauf].Brush.Color:=clwhite;
end;
end;

end.

unit BinaeruhrHeader;

interface

function Dualzaehlen (a:array of integer): integer;
procedure ZaehlerStellen;

var Nr, Zaehler:integer;

implementation

procedure ZaehlerStellen;
begin
Zaehler:=0;
end;

function Dualzaehlen (a:array of integer):integer;
var lauf:integer;
begin
if Zaehler=0 then
begin
lauf:=-1;
repeat
inc(lauf);
if a[lauf]=0 then
a[lauf]:=1
else
a[lauf]:=0;
until a[lauf]=1;
end;
result:=a[Zaehler];
inc(Zaehler);
end;

end.

Ich weis, dass das ganze noch nicht sehr übersichtlich ist und eigentlich müssten die selbst erstellten procedures auch in die Headerdatei, aber die feinarbeiten erledige ich noch zum Schluss. Wer das gesamte Programm einsehen möchte kann es unter http://rapidshare.com/files/378920275/Bin__ruhr.rar runterladen.

Schon mal im voraus vielen Dank, da ich aus Erfahrung weis, dass man sich auf die Mitglieder dieses Forums verlassen kann.

lg

bluebutton

Hallo,

so wird das nichts. Schreib mal Kommentare in Deinen Quellcode. Dann muss man nicht erraten, was Du mit einer bestimmten Aktion bezweckst.

Gruß, Niels

sorry. das hatte ich total vergessen. Okay hier noch schnell der neue link http://rapidshare.com/files/379144884/Bin__ruhr.rar

und hier der kommentierte Quelltext:

unit Binaeruhr;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
procedure ShapesErzeugen;
procedure Zahlenlesen(a:array of integer; Shapes:array of TShape);

var
Form1: TForm1;
minZaehler, stuZaehler:integer;
sek, min, stu:array [0…10] of integer;
sekShapes, minShapes, stuShapes:array of TShape;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var clear, Zaehler : integer;
begin
ZaehlerStellen;
for Zaehler:=0 to 9 do
sek[Zaehler]:=Dualzaehlen(sek);
{auf das array, auf dem die
Sekunden sind wird die neue
Zeit geschrieben}

inc(minZaehler); //stellt fest, wann eine minute um ist
Zahlenlesen(sek, sekShapes);
if minZaehler=60 then//hier passiert das gleiche wie bei sekunden
begin //nur für die minuten
ZaehlerStellen;
for Zaehler:=0 to 9 do
min[Zaehler]:=Dualzaehlen(min);
inc(stuZaehler); //stellt fest, wann die stunde um ist
for clear:=0 to 9 do
sek[clear]:=0; //die sekunden werden wieder auf null gestellt
Zahlenlesen(min, minShapes);
minZaehler:=0;//damit die Zählung bis zur nächsten minute klappt
end;
if stuZaehler=60 then //das selbe, wie bei minuten nur für stunden
begin
ZaehlerStellen;
for Zaehler:=0 to 9 do
stu[Zaehler]:=Dualzaehlen(stu);
for clear:=0 to 9 do
min[clear]:=0;
Zahlenlesen(stu, stuShapes);
StuZaehler:=0;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var clear : integer;
begin
minZaehler:=0; //initialisierung
stuZaehler:=0;
ShapesErzeugen;
for clear:= 0 to 9 do
begin
sek[clear]:=0;
min[clear]:=0;
stu[clear]:=0;
end;
end;

procedure ShapesErzeugen;//macht die benutzung der shapes in schleifen
var i, oben, links:integer;//einfacher, da ich ein Shape mit Shape[]
begin //aufrufen kann
SetLength(sekShapes, 6);
SetLength(minShapes, 6);
SetLength(stuShapes, 5);
oben:=32;
links:=24;
for i:=0 to 5 do //erstellt die Shapes der Sekunden
begin
sekShapes[i]:= TShape.Create(nil);
sekShapes[i].Parent:=Form1;
sekShapes[i].Shape:=stCircle;
sekShapes[i].Top:=oben;
sekShapes[i].Left:=links;
oben:=oben+16;
sekShapes[i].Width:=9;
end;
oben:=32;
links:=88;
for i:=0 to 5 do //erstellt die Shapes für die Minuten
begin
minShapes[i]:= TShape.Create(nil);
minShapes[i].Parent:=Form1;
minShapes[i].Shape:=stCircle;
minShapes[i].Top:=oben;
minShapes[i].Left:=links;
oben:=oben+16;
minShapes[i].Width:=9;
end;
oben:=32;
links:=166;
for i:=0 to 4 do //erstellt die Shapes für die Stunden
begin
stuShapes[i]:= TShape.Create(nil);
stuShapes[i].Parent:=Form1;
stuShapes[i].Shape:=stCircle;
stuShapes[i].Top:=oben;
stuShapes[i].Left:=links;
oben:=oben+16;
stuShapes[i].Width:=9;
end;
end;

procedure Zahlenlesen(a:array of integer; Shapes:array of TShape);
var lauf, Zahl:integer;
begin
zahl:=length(Shapes);
for lauf:= 0 to zahl-1 do
begin
if a[lauf] = 1 then //wenn die momentane zahl eine eins ist
//wird das dazu passende Shape rot
Shapes[lauf].Brush.Color:=clred;
if a[lauf] = 0 then //wenn sie jedoch null ist
Shapes[lauf].Brush.Color:=clwhite;//wird das Shape weiß
end;
end;

end.

unit BinaeruhrHeader;

interface

function Dualzaehlen (a:array of integer): integer;
procedure ZaehlerStellen;

var Nr, Zaehler:integer;

implementation

procedure ZaehlerStellen;
begin
Zaehler:=0; //stellt den zaehler für die function darunter
end;

function Dualzaehlen (a:array of integer):integer;
var lauf:integer;
begin
if Zaehler=0 then//function soll nur beim ersten mal die zeit

erhöhen
begin
lauf:=-1;
repeat
inc(lauf);
if a[lauf]=0 then //wenn die Zahl gleich null ist wird
a[lauf]:=1 //sie eins
else
a[lauf]:=0; //wenn die zahl eins ist wird sie null
until a[lauf]=1; //dann muss sich auch die nächste zahl
end; //erhöhen. deswegen die schleife
result:=a[Zaehler];//am ende werden die einsen und nullen
inc(Zaehler); //an das sekunden-, minuten-

//oder stunden-
end; //feld abgegeben und der zaehler

//erhöht
//sich,damitdienächstezahlgelesen
end. //wird,sobalddie function von der
//Schleifenochmal aufgerufen wird

1 Like

ist Deine Frage noch offen?

nope,

hab das problem gelöst. es hat ein var gefehlt bei einer functions.