[Delphi]Mehrere Einträge nacheinander in einen Record?mit einem button!

Muuhmann

Lieutenant
Registriert
Sep. 2004
Beiträge
782
Hi,
ich habe das Problem, dass ich ein Programm schreiben soll (schule), ein Skispring-Wettbewerbs-Programm.
Ich habe das Formular erstellt, es sieht wie auf dem bild aus. jetzt zu dem eigentlichen problem:
ich habe einen Record geschrieben und einen array der vom type des records ist.
Ich möchte nun die Daten in die Edit-Felder eingeben und auf den button "Nächster Spieler" klicken, sodass die Daten in das erste Feld des Arrays geschrieben werden, dann gebe ich wieder die Daten an und diese werden in das zweite feld des arrays geschrieben.
Leider kriege ich das nur so hin, dass in jedes Feld des Arrays das gleiche geschrieben wird!
mal der quellcode:
Code:
//Der Record
sportler=record
          vorname:string;
          nachname:string;
          land:string;
          startnummer:string;
End;

//Das Array
springer: array[1..5] of sportler;

//Die Prozedur des Buttons "Nächster Spieler"

procedure TForm1.Button1Click(Sender: TObject);
var   i: integer;
begin
 i:=1;
 repeat
  begin
    springer[i].vorname:= Edit1.Text;
    springer[i].nachname:= Edit2.Text;
    springer[i].land:= ComboBox1.Text;
    springer[i].startnummer:= IntToStr(i);
    i:=i+1;
  end;
 until i>5;
 for i:=1 to 5 do
  begin
    (FindComponent('Label'+IntToStr(i+3)) as TLabel).Caption := 'Vorname: '+#13+springer[i].vorname+#13+'Nachname: '+#13+springer[i].nachname+#13+'Herkunft: '+#13+springer[i].land+#13+'Startnummer: '+#13+springer[i].startnummer+#13;
  end;
end;

Vielleicht lohnt es sich zu erwähnen, dass ich es auch schon mit einer For-, oder While-Schleife, sowie mit einer If..Then..(Else)-Anweisung versucht habe, aber ich krieg es einfach nicht hin, könnt ihr mir helfen?
 

Anhänge

  • Form1.gif
    Form1.gif
    5,9 KB · Aufrufe: 285
Mach die Fußgesteuerte Schleife da weg und bau ne globale Variable ein, damit du weißt welchen Arrayindex du als letztes eingetragen hast bzw. welchen du als nächstes eintragen möchtest.

Die globale Variabel initialsierst du mit 0 und und zählst dann bei jedem ButtonClick um 1 hoch, dann geht das!
 
danke, aber könntest du das bitte mit etwas quellcode ausdrücken, versteh das sonst nich so richtig...
 
Kein Problem, hier ist der entsprechend veränderte Code, bei weitern Rückfragen kann ich dir vielleicht noch am ehesten per ICQ helfen:
//Der Record
sportler=record
vorname:string;
nachname:string;
land:string;
startnummer:string;
End;

//Globale Variabel
pos: Integer;

//Das Array
springer: array[1..5] of sportler;

//Die Prozedur des Buttons "Nächster Spieler"

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
springer[pos].vorname:= Edit1.Text;
springer[pos].nachname:= Edit2.Text;
springer[pos].land:= ComboBox1.Text;
springer[pos].startnummer:= IntToStr(i);
Inc(pos);

//Ausgabe -> kannste so lassen musste aber nicht, da das nicht umbedingt sinn macht jedesmal das wieder auzugeben!
for i:=1 to 5 do
begin
(FindComponent('Label'+IntToStr(i+3)) as TLabel).Caption := 'Vorname: '+#13+springer.vorname+#13+'Nachname: '+#13+springer.nachname+#13+'Herkunft: '+#13+springer.land+#13+'Startnummer: '+#13+springer.startnummer+#13;
end;
end;

initialization
pos := 0;


MfG Meolus
 
cool! danke! das hat wunderbar geklappt! was genau macht denn "initialization" ? hab cih noch nie was von gehört!

falls ich noch weitere fragen habe adde ich dich in icq, ok?
 
@icq: na klar, daher sagte ich das ja :)

@initialization: Der "initialization" folgende Code wird beim Programmstart ein mal ausgeführt! (Entsprechend gibt es auch noch "finalization") Alternativ kannste auch eine Initialisierungsprocedure schreiben, welche du mit einem "Reset"-Button und im FormCreate-Event aufrufst.
 
1. : Bau die globale Variable aus und mach sie als Member des Formulars.
2. : Mach das Array zum Member des Formulars
3. : Schreib einen Konstruktor für Form1, der Dir die Werte initialisiert.

Sorry aber das ist extrem unschöner Programmierstil, den man sich niemals angewöhnen sollte.
 
@7H3 N4C3R: Ich bezweifle, dass Muuhmann im Sinn hatte OOP als Antwort auf seine Frage zu lernen. Desweiteren wäre ja wohl eine Liste zum Ablegen der Daten sinnvoller :D
 
Auch im Sinne strukturierter Programmierung wäre eine Lösung mit globalen variablen mehr als unschön und überflüssig.
Und OOP ist noch 'ein bisschen' was anderes, als einfach aus allen Funktionen Methoden zu machen und in Klassen zu stopfen.

Es ist schlichtweg ein Sprachfeature, das hier angewendet gehört.
 
yo danke , 7H3 N4C3R, aber ich bin noch nicht soweit, dass ich OOP verstehn und anwenden kann hab erst vor 2 wochen mit delphi angefangen un sonst zuhause noch nichts gemacht, ist ja alles von der schule aus...
un was ein konstruktor ist weiß ich auch nicht ;D das kommt alles noch mit der zeit, wenn ich mich da eingearbeitet habe..
aber trotzdem thx!
 
hi,

ich habe ein weiteres problem:
Ich möchte jetzt das Record-Array nach einem wert (sprungweite) sortieren lassen, die höchste zahl zuerst, und nun soll je nach sprungweite ein rang und ggf. eine medallie vergeben werden, also der der am weitesten gesprungen ist bekommt rang 1 und gold un der letzte bekommt rang 5 und keine medallie.
ich habe shcon viel versucht, aber ich bekomm es einfach nicht hin, wäre net, wenn einer von euch mir helfen könnte..

eine weitere kleine frage:
wie kriege ich eine random-zahl mit nachkommastellen hin? und dann auf eine nachkommastelle gerundet?


achja: und was ist ein konstruktor und wie macht man sowas?
 
Muuhmann schrieb:
hi,

ich habe ein weiteres problem:
Ich möchte jetzt das Record-Array nach einem wert (sprungweite) sortieren lassen, die höchste zahl zuerst, und nun soll je nach sprungweite ein rang und ggf. eine medallie vergeben werden, also der der am weitesten gesprungen ist bekommt rang 1 und gold un der letzte bekommt rang 5 und keine medallie.
ich habe shcon viel versucht, aber ich bekomm es einfach nicht hin, wäre net, wenn einer von euch mir helfen könnte..

Wenn du zu jedem Sprnger die Weite speichern sollst, dann erweitere einfach den Record um eine Variable "Sprungweite: Cardinal;". Dann kannst du das Array anhand von springer.Sprungweite sortieren.

eine weitere kleine frage:
wie kriege ich eine random-zahl mit nachkommastellen hin? und dann auf eine nachkommastelle gerundet?

Randomize;
StringVariable := FloatToStr(Random((1000)+1) / 10);

Liefert Werte von 1 bis 100 mit einer Nachkommstelle.

achja: und was ist ein konstruktor und wie macht man sowas?

http://de.wikipedia.org/wiki/Konstruktor
 
Ste_Ett schrieb:
Wenn du zu jedem Sprnger die Weite speichern sollst, dann erweitere einfach den Record um eine Variable "Sprungweite: Cardinal;". Dann kannst du das Array anhand von springer.Sprungweite sortieren.


yo das habe ich doch schon, aber wie kann ich dann dem springer mit der höchsten sprungweite noch ne goldmedallie und dem mit der zweit- und dritthöchsten sprungweite ne silber- bzw bronzemedallie verpassen? das verstehe ich nicht

was ist cardinal? ich hab da sprungweite: string; un dann nachher inttostr(random(67)+100), weil der irgendwie sprungweite: integer; nicht haben wollte, kA warum?

danke für den link un das mit dem random!
 
Cardinal ist ein 32bit, vorzeichenloser Zahlentyp.
0 bis 4294967295

Einen negativen Wert für einen Sprung braucht man idR. nicht. :)

Eigentlich tuts auch eine Variable vom Typ Byte (0..255), das wird wohl keiner erreichen. :p

-edit-

Springer = ecord
Vorname, Nachname, Land, Startnummer, Medaille: String;
Sprungweite: Byte;
end;


Code:
var
  i: Integer;

//  Array Springersortieren, so dass der erste Eintrag die Goldmedaille ist,
//  zweiter Silber und dritter Bronze
...

Springer[0].Medaille := 'Goldmedaille';
Springer[1].Medaille := 'Silbermedaille';
Springer[2].Medaille := 'Bronzemedaille';

//  Schleife von Springer[3] bis Springer[N] und .Medaille auf 'Nichts'/'Keine'/etc setzen.

Mit Klassen könntest du das im Konstruktor machen lassen.
 
Zuletzt bearbeitet:
yo danke hat an sich eigentlich geklappt, aber jetzt besteht das problem, dass er jetzt den springern 1 bis 5 die sortieren sprungweiten zuweißt, d.h. springer 1 hat immer Gold, usw. !
kann man das sortieren wieder rückgängig machen, sodass z.B. springer 3 die Goldmedallie haben kann?

achja.. wieso fangt ihr eigentlich immer von 0 an zu zählen? ich fang bei nem array immer bei 1 un nicht bei 0 an
 
Index beim Array fängt immer bei 0 an! :)

1. Eintrag = Index 0
2. Eintrag = Index 1
.
.
100. Eintrag = Index 99
.
.
Letzter Eintrag = Index Length(Array)-1
 
mhm
mein array sieht so aus springer:=array[1..5] of sportler;
also fängt mein array doch bei 1 an und nciht bei 0
aber wie siehts jetzt mit meinem problem aus?
 
Muuhmann schrieb:
mhm
mein array sieht so aus springer:=array[1..5] of sportler;
also fängt mein array doch bei 1 an und nciht bei 0
aber wie siehts jetzt mit meinem problem aus?

Wenn du den Index fest vorgibst mit 1 bis 5, dann beginnt es natürlich ab 1.

Wie sortierst du den Array?
 
bubblesort...

Code:
procedure TForm1.Button2Click(Sender: TObject);
var i,a:integer;
    temp:real;
    getauscht:boolean;
begin
  //a:=1;
  for i:=1 to 5 do
    begin
      springer[i].sprungweite:=FloatToStr(random((1000)+1)/10+100);
      //if a=1 then button2.Enabled:=False;
    end;
  repeat
    begin
      getauscht:=false;
      for  i:=low(springer) to high(springer) do
        if springer[i].sprungweite < springer[i+1].sprungweite then
          begin
            temp:=StrToFloat(springer[i].sprungweite);
            springer[i].sprungweite:=springer[i+1].sprungweite;
            springer[i+1].sprungweite:=FloatToStr(temp);
            getauscht:=true;
          end;
      springer[i].platz:=IntToStr(i);
      springer[1].medallie:='Gold';
      springer[2].medallie:='Silber';
      springer[3].medallie:='Bronze';
    end;
  until getauscht=false;
 for i:=1 to 5 do
   begin
    (FindComponent('Label'+IntToStr(i+3)) as TLabel).Caption :=
      'Vorname: '+#13+springer[i].vorname+#13+#13+
      'Nachname: '+#13+springer[i].nachname+#13+#13+
      'Herkunft: '+#13+springer[i].land+#13+#13+
      'Startnummer: '+#13+springer[i].startnummer+#13+#13+
      'Sprungweite: '+#13+springer[i].sprungweite+#13+#13+
      'Platz: '+#13+springer[i].platz+#13+#13+
      'Medallie: '+#13+springer[i].medallie+#13;
   end;
end;

mal die prozedur...
 
Zurück
Oben