AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Zufällige Zahlen im Array + Ausgeben in Stringgrid

Zufällige Zahlen im Array + Ausgeben in Stringgrid

Ein Thema von CShepard · begonnen am 21. Feb 2015 · letzter Beitrag vom 22. Feb 2015
Antwort Antwort
CShepard

Registriert seit: 21. Feb 2015
4 Beiträge
 
#1

Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 21. Feb 2015, 21:52
Guten Abend, ich bräuchte etwas Hilfe bei meiner Hausaufgabe. Eigentlich habe ich alles gemacht, nur ist alles irgendwie verbuggt. Es wäre sehr nett, wenn mir jemand sagen könnte, was ich machen soll, damit das Programm richtig läuft.
______

Genau so steht unsere Aufgabe auf dem Arbeitsblatt da und wir müssen es LEIDER genau so machen:
-> beim Starten des Programmes sollen 20 Zufallszahlen in ein Array eingelesen werden
-> beim Drücken des Buttons "Zahlen einlesen" werden die Zahlen aus dem Array in die 1. Spalte geschrieben.
-> mithilfe des Buttons "Zahl" kann man sich jede beliebige Zahl des Arrays ansehen
-> man soll die Zahlen in der Tabelle ändern können und diese testen
-> welche Zahl erscheint nach dem Ändern nun im Edit-Objekt?
-> Wir brauchen noch den Button "Änderungen merken", damit die Änderung aus der Tabelle im Array abgespeichert werden.
______

Das ist mein Code:

Code:
procedure TForm1.FormCreate(Sender: TObject);
var i:byte;
zufallszahl: array[1..20] of integer;
begin
randomize;
for i:=1 to 20 do
begin
zufallszahl[i]:=random(256);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
zufallszahl: array[1..20] of integer;
begin
for i:=1 to 20 do
begin
stringgrid1.cells[1,i]:=inttostr(zufallszahl[i]);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var z:integer;
zufallszahl: array[1..20] of integer;
begin
z:=strtoint(edit1.Text);
edit2.text:=inttostr(zufallszahl[z]);
end;

procedure TForm1.Button3Click(Sender: TObject);
 var i:integer;
 zufallszahl: array[1..20] of integer;
begin
for i:=1 to 20 do
begin;
zufallszahl[i]:=strtoint(stringgrid1.cells[1,i]);
end;
end;
_______________

Das ist mein Problem:
1.) Für die Zufallszahlen habe ich den Bereich 0-255 gewählt (random(256)), doch es werden größere Zahlen angezeigt.
2.) Die Zahlen in dem Stringgrid ergeben immer das selbe Muster (z.B. tauchen in Zeile 4 und 6 IMMER die 0 auf, in einer anderen Zeile immer -2).
3.) Obwohl ich im Stringgrid eine Zelle ändere und "Änderung merken" klicke, ändern sich nie der zugehörige Wert bei den Array (z.B.:Ändere ich Zelle Nummer 5, ändert sich nicht Zufallszahl[5])

Es sind 2 verschiedene Screenshots im Anhang, damit ihr das Zahlenmuster im Stringgrid, sowie das gesamte Programm von außen seht.
Miniaturansicht angehängter Grafiken
1.jpg   2.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 21. Feb 2015, 22:18
Was fällt dir gleich auf?
Du schreibst die Werte in eine Variable rein und liest sie aus einer ganz anderen Variable aus.
(auf Blatt A drauf schreiben und dann "halbzufällige" Speicherwerte von Blatt B auslesen)

Du wolltest diese Variable doch bestimmt in Form > private deklarieren?



Und sagt dir dein Compiler denn nicht ein paar nette Meldungen? (vonwegen nicht initialisiert und so)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Feb 2015 um 22:21 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#3

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 21. Feb 2015, 23:23
Und beim lesen des Quellcode hab' ich Augenkrebs bekommen.
Das kann man doch Übersichtlicher und lesbarer gestalten:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FZufallsZahl: array[1..20] of Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Byte;
begin
  Randomize;
  for I := 1 to 20 do
   begin
    FZufallsZahl[I] := Random(256);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Byte;
begin
  for I := 1 to 20 do
   begin
    StringGrid1.Cells[1,I] := IntToStr(FZufallsZahl[I]);
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit2.Text := IntToStr(FZufallsZahl[StrToInt(Edit1.Text)]);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to 20 do
   begin;
    FZufallsZahl[I] := StrToInt(StringGrid1.Cells[1,I]);
   end;
end;


end.
Übrigens funktioniert der Code oben, so wie Du es wolltest.
Und noch besser: man kann ihn lesen

Dein Problem war die "Sichtbarkeit" der Variable zufallszahl.

In jeder Prozedur erstellst Du diese Variabel neu und wunderst Dich, warum es nicht so will, wie es soll.

Wenn Du eine Variabel in einer Prozedur erstellst, also im var-Abschnitt der Prozedur, dann ist diese nur in dieser Prozedur gültig, auch wenn sie den gleichen Namen hat wie in einer anderen Prozedur.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 21. Feb 2015, 23:35
Ein weiterer Tipp für mehr Übersichtlichkeit und quasi Dokumentieren durch Programmieren:
Delphi-Quellcode:
TForm1 = class( TForm )
...
private
  procedure InitArrayWithRandomData;
  procedure ShowArrayInGrid;
  procedure StoreGridInArray;
  ...
end;

procedure TForm1.FormCreate( Sender : TObject );
begin
  InitArrayWithRandomData;
end;

procedure TForm1.Button1Click( Sender : TObject );
begin
  ShowArrayInGrid;
end;

procedure TForm1.Button2Click( Sender : TObject );
begin
  StoreGridInArray;
end;
Schon kannst du dir einen grossen Teil der Kommentare sparen und jeder (auch du nach ein paar Tagen/Wochen/Monaten) sieht sofort, welche Aktion beim Klick auf den Button passieren soll bzw. was in der Methode selber vonstatten geht.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 21. Feb 2015, 23:41
Kann man auch, ohne dafür extra Prozeduren zu machen, aber man sollte sowieso den Komponenten ordentliche Namen geben, und damit auch deren Events.
(Button1 und Button1Click sagen ja sowas von garnichts zu dem, was sie machen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
CShepard

Registriert seit: 21. Feb 2015
4 Beiträge
 
#6

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 22. Feb 2015, 18:47
Danke an alle für die Hilfe.
Sorry, ich wusste nicht, wo Arrays deklariert werden müssen. Hab das unter type über private versucht und sonst irgendwo, doch es hat nie geklappt... darum wurde ich etwas erfinderisch und habe den Array immer in jeder Prozedur deklariert. Dann hielt ich es für richtig, da keine Zeile mehr rot war.
Im Unterricht haben wir erklärt bekommen, wie der Syntax aussieht und was Arrays bewirken. Nur WO wir Arrays deklarieren müssen- das wurde nicht erklärt und wir haben dazu auch nichts aufgeschrieben.

@Sir Rufo: Guter Tipp, ich hoffe, ich darf im Unterricht später auch solche Befehle anwenden. Bis jetzt dürfen wir alles nur so aufschreiben, wie wir es gelehrt bekommen haben... leider, denn mit diesen Befehlen spart man etwas Arbeit.

@Baden Power: Tut mir leid, ich verspreche, ich werde beim nächsten Mal mehr auf Anschaulichkeit achten, bin noch neu hier.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 22. Feb 2015, 19:00
@Sir Rufo: Guter Tipp, ich hoffe, ich darf im Unterricht später auch solche Befehle anwenden. Bis jetzt dürfen wir alles nur so aufschreiben, wie wir es gelehrt bekommen haben... leider, denn mit diesen Befehlen spart man etwas Arbeit.
Es sind ja gar keine Befehle, sondern Methoden der Klasse, die du selber schreibst.

Ziel ist es dabei den eigenen Code in besonders übersichtliche und möglichst kleine Häppchen zu teilen und eben keine Happen oder ganze Brocken zu erstellen.

Ich kann mir nicht vorstellen, dass das verboten ist. Das verwechselst du anscheinend mit der Verwendung von irgendwelchen Delphi-Units, wo einiges/vieles schon fertig existiert, ihr aber diese Grundlagen ja lernen sollt -> selber implementieren.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#8

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 22. Feb 2015, 20:46
Im Unterricht haben wir erklärt bekommen, wie der Syntax aussieht und was Arrays bewirken. Nur WO wir Arrays deklarieren müssen- das wurde nicht erklärt und wir haben dazu auch nichts aufgeschrieben.
Es geht hierbei nicht um Array, sondern um alle Variable-Typen.

Wo etwas deklariert wird ist entscheident für die Sichtbarkeit der Variable.

Unten einmal ein kleines Beispiel in welchem ich 3 Variablen mit dem Namen ZufallsZahl erstellt habe, welche jeweils verschiedene Gültigkeitsbereiche haben.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, Forms, Classes, Controls,;

var
  ZufallsZahl: Integer; // gültig in der ganzen Anwendung

type
  TForm1 = class(TForm)
    procedure Button1Click(Sender: TObject);
  private
   ZufallsZahl: Integer; // gültig in der ganzen Klasse Form1
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm.Button1Click(Sender: TObject);
var
  ZufallsZahl: Integer; // nur gültig in diese Procedure
begin
//
end;
Als Laie könnte man meinen, dass dies ein und dieselbe Variable wäre, die ist aber nicht so.

Es sind tatsächlich 3 verschiedene Variablen, welche jeweils einen eigenen Wert haben können.

Durch eine erneute Variabledeklaration mit dem gleichen Namen in einem untergeorneteten Bereich wird die übergeordnete Variable verdeckt.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Zufällige Zahlen im Array + Ausgeben in Stringgrid

  Alt 22. Feb 2015, 23:26
Du hattest noch zeigen können, wie man auf die anderen Varaiblen zugreifen kann, wenn benötigt
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, Forms, Classes, Controls,;

var
  ZufallsZahl: Integer; // gültig in der ganzen Anwendung, wo dise Unit in den uses steht

type
  TForm1 = class(TForm)
    procedure Button1Click(Sender: TObject);
  private
   ZufallsZahl: Integer; // gültig in der ganzen Klasse Form1
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm.Button1Click(Sender: TObject);
var
  ZufallsZahl: Integer; // nur gültig in diese Procedure
begin
  ZufallsZahl := 1; // lokale Variable
  Self.ZufallsZahl := 2; // Feld der Klasse TForm1
  Unit1.ZufallsZahl := 3; // Unit Variable
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz