StringGrid-Array

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
WeHei
Beiträge: 11
Registriert: So 30. Okt 2016, 08:03

StringGrid-Array

Beitrag von WeHei »

Geschätzte Forumsmitglieder.
Das Folgende Programm sollte den Zufallsgenerator testen.
Ein Würfelspiel wird simuliert. Die Anzahl der geworfenen Augen wird in einem String z[a] gezählt.- (z[3]enthält die Anzahl der geworfenen 3er)-s[a] ist der der Zahl s[a] entsprechende String. Die Werte s[1]..s[6] sollen in einer Stringgrid-Tabelle ausgegeben werden.
F7.. Das Programm läuft bis zur Ausgabe richtig.
F9.. Die s[i] werden nicht ausgegeben.StringGrid nimmt den Array nicht an. Eine Ausgabe mit Edit ist auch nicht möglich.
Ich bitte um Hilfe
Kubuntu, Lazarus 1.6

unit uzuza;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Grids;

type

{ TForm1 }
Geschätzte Forumsmitglieder.
Das Folgende Programm sollte den Zufallsgenerator testen.
Ein Würfelspiel wird simuliert. Die Anzahl der geworfenen Augen wird in einem String z[a] gezählt.- (z[3]enthält die Anzahl der geworfenen 3er)-s[a] ist der der Zahl s[a] entsprechende String. Die Werte s[1]..s[6] sollen in einer Stringgrid-Tabelle ausgegeben werden.
F7.. Das Programm läuft bis zur Ausgabe richtig.
F9.. Die s[i] werden nicht ausgegeben.StringGrid nimmt den Array nicht an. Eine Ausgabe mit Edit ist auch nicht möglich.
Ich bitte um Hilfe
Kubuntu, Lazarus 1.6

unit uzuza;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Grids;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;

StringGrid1: TStringGrid;
procedure aus(Sender: TObject);
procedure ZuZa_erzeugen(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.aus(Sender: TObject);
begin
Application.Terminate
end;

procedure TForm1.ZuZa_erzeugen(Sender: TObject);
var i,j:byte;
a:Integer;t:string;
z:array[1..20] of integer;
s:array[1..20] of string;


Procedure GridInit; //Beschriftung
var y:integer;
begin
with Form1.StringGrid1 do begin
for y:=1 to 6 do Cells[0,y]:='Ziffer '+IntToStr(y);
Cells[1,0]:='mal';
end;
end;

begin

for j:=1 to 20 do begin z[j]:=0;s[j]:=''; end;

for i:=1 to 10 do
begin
Randomize;
a:=Random(6)+1;
z[a]:=z[a]+1;
s[a]:=IntToStr(z[a]);

end;

with form1.StringGrid1 do
for i:=1 to 6 do
cells[1,i]:=s[i];

GridInit; //Beschriftung den Tabelle

end;
end.

DANKE
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;

StringGrid1: TStringGrid;
procedure aus(Sender: TObject);
procedure ZuZa_erzeugen(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.aus(Sender: TObject);
begin
Application.Terminate
end;

procedure TForm1.ZuZa_erzeugen(Sender: TObject);
var i,j:byte;
a:Integer;t:string;
z:array[1..20] of integer;
s:array[1..20] of string;


Procedure GridInit; //Beschriftung
var y:integer;
begin
with Form1.StringGrid1 do begin
for y:=1 to 6 do Cells[0,y]:='Ziffer '+IntToStr(y);
Cells[1,0]:='mal';
end;
end;

begin

for j:=1 to 20 do begin z[j]:=0;s[j]:=''; end;

for i:=1 to 10 do
begin
Randomize;
a:=Random(6)+1;
z[a]:=z[a]+1;
s[a]:=IntToStr(z[a]);

end;

with form1.StringGrid1 do
for i:=1 to 6 do
cells[1,i]:=s[i];

GridInit; //Beschriftung den Tabelle

end;
end.

DANKE

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: StringGrid-Array

Beitrag von wp_xyz »

Oje - da ist einiges beim Reinkopieren schief gelaufen...

Beim nächsten mal umschließe Code doch bitte mit den Symbolen [ code=laz] und [ /code], um das Syntaxhighlighting zu aktivieren, damit ist dein Code leichter lesbar. (Dabei das Leerzeichen nach der öffnenden Klammer weglassen, das ich hier einsetzen muss, damit die Forumssoftware diese Tags überhaupt anzeigt).

Zu deinem Problem: Du hast vergessen, die Größe des Grid einzustellen. Außer der Titelzeile hast du 6 Zeilen für die Augen, deshalb musst du, bevor du etwas ins Grid schreibst, dessen RowCount auf 7 setzen. Die Zahl der Spalten ist zu groß, bewirkt aber zumindest keinen Absturz, richtig wäre StringGrid.ColCount := 2

Außerdem weiß ich aufgrund deiner eigenen Bezeichnungen für die OnClick-Ereignisse der Buttons nicht, ob diese Event-Handler richtig eingebunden sind und evtl. gar nicht aufgerufen werden. Um das zu sehen, wäre es besser gewesen, du hättest das komplette Projekt gepostet: Einfach die .pas, lfm, lpr und lpi-Dateien in ein gemeinsames Zip packen und als Dateianhang hochladen.

Egal: Wenn du den Button für die Zufallszahlenerzeugung anklickst und dir im Objektinspector auf der Seite "Ereignisse" die Zeile "OnClick" ansiehst, so muss dort die Prozedur ZuZa_Erzeugen eingetragen sein. Wenn nicht, geh auf den Abwärtspfeil und wähle diese Prozedur aus der aufklappenden Liste aus. Genauso mit der Prozedur "Aus", die anscheinend dem anderen Button zugeordnet werden soll.

Randomize muss nur 1x aufgerufen werden, am besten im OnCreate-Ereignis des Formulars.

Das String-Array s würde ich nicht in der Schleife, in der die Zufallszahlen gezählt werden, füllen, weil es hier ja sofort wieder überschrieben wird. Genaugenommen, brauchst du es überhaupt nicht, du kannst in der Ausgabeschleife das Summen-Array z direkt in den Strings für die Grid-Zellen umwandeln.

Dies ist mein korrigierter Code:

Code: Alles auswählen

procedure TForm1.aus(Sender: TObject);
begin
  Close;
  // Application.Terminate
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;
 
procedure TForm1.ZuZa_erzeugen(Sender: TObject);
var
  i,j:byte;
  a:Integer;
  t:string;
  z:array[1..20] of integer;
//  s:array[1..20] of string;
 
  Procedure GridInit; //Beschriftung
  var y:integer;
  begin
    with StringGrid1 do begin
      for y:=1 to 6 do Cells[0,y]:='Ziffer '+IntToStr(y);
      Cells[1,0]:='mal';
    end;
  end;
 
begin
  for j:=1 to 20 do begin
    z[j]:=0;
    s[j]:='';
  end;
 
  for i:=1 to 10 do   // du könntest hier übrigens dieselbe Laufvariable verwenden wie oben
  begin
//  Randomize; 
    a:=Random(6)+1;
    z[a]:=z[a]+1;
//    s[a]:=IntToStr(z[a]);
  end;
 
  with StringGrid1 do
  begin
    RowCount := 7;
    ColCount := 2;
    for i:=1 to 6 do
      cells[1,i]:= IntToStr(z[i]); //s[i];
  end;
 
  GridInit; //Beschriftung den Tabelle
 
end;

WeHei
Beiträge: 11
Registriert: So 30. Okt 2016, 08:03

Re: StringGrid-Array

Beitrag von WeHei »

Hallo wp_xyz
Ich habe Deine empfohlenen Vereinfachungen durchgeführt, das Programm läuft trotzdem noch nicht perfekt weil:

wenn ich RANDOMIZE in FormCreat festlege, erhalte ich bei jedem Programmdurchlauf 001513 für die Anzahl der gewürfelten Augen,

setze ich RANDOMIZE in die ZuZa_erzeugen Procedure erhalte ich stets 000 10 00 (10 an unterschiedlichen Stellen)

setze ich vor ZuZa_erzeugen einen Haltepunkt und durchlaufe die Schleife mit F7 erhalte ich für die z[a] öplausieble Werte, diie aber nicht ausgegeben werden.

StringGrid und array arbeite nicht korrekt zusammen (Edit statt StringGrid klappt auch nicht).

Als Anhang das komprimierte Projekt.

Bitte um Hilfe,
danke WeHei
Dateianhänge
LazForum.zip
(6.11 MiB) 98-mal heruntergeladen

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: StringGrid-Array

Beitrag von wp_xyz »

Ja, wenn man FormCreate nicht aufruft...

Es reicht nicht, eine Methode FormCreate zu schreiben, sondern diese muss auch ins Programm eingebunden sein, so dass sie aufgerufen wird. Dazu musst du im Objektinspector auf die Seite "Ereignisse" gehen, die Zeile "OnCreate" anwählen und dort doppelt oder auf die drei Punkte (...) klicken. Damit legt Lazarus einen leeren Methodenrumpf für die Ereignisbehandlung von OnCreate an, bzw. wenn diese Methode schon vorhanden hin, springt der Editor zu dieser Routine. Das Wichtige ist, dass nun die Methode FormCreate mit dem Formular verknüpft ist; nun ist im Objektinspektor das Feld für "OnCreate" nicht mehr leer, sondern enthält den Namen der FormCreate-Prozedur - das bedeutet: wenn das Formular erzeugt wird, wird FormCreate (und damit das Randomize) aufgerufen.

Schau dir doch bitte ein einführendes Lazarus- oder Delphi-Tutorial an, z.B. http://wiki.lazarus.freepascal.org/Lazarus_Tutorial/de, für's erste reicht der Abschnitt "Los geht's".

WeHei
Beiträge: 11
Registriert: So 30. Okt 2016, 08:03

Re: StringGrid-Array

Beitrag von WeHei »

Danke, es läuft, Deine Empfehlung werde ich berücksichtigen, WeHei

Antworten