Entwickler-Ecke
Sonstiges (Delphi) - Frage zu "record"
Kerstin05 - Mi 16.02.05 22:07
Titel: Frage zu "record"
Hi Delphifreunde :D
und zwar hab ich eine Frage zu meinem Quelltext !
Meine Aufgabe ist es Daten wie Nachname , Vorname , Klasse ,PLZ und auch Datum in eine Tabelle einzufügen! Und genau beim letzen hab ich ein Problem, immer wenn ich auf einfügen klicke kommt ne fette Fehlermeldung " irgendetwas mit Fehler und jjsjdashh :shock: "
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86:
| type schueler = record nachname: string [50]; vorname: string [50]; klasse: string [50]; Postleitzahl : integer; geburtstag : Tdate;
End;
Tdate=record Tag:1..31; Monat:1..12; Jahr:1900..2006; end;
TForm1 = class(TForm) nachtf: TEdit; vortf: TEdit; klastf: TEdit; strastf: TEdit; plztf: TEdit; orttf: TEdit; gebtf: TEdit; einlesebt: TButton; neubt: TButton; endebt: TButton; sortbt: TButton; tab: TStringGrid; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; procedure endebtClick(Sender: TObject); procedure einlesebtClick(Sender: TObject); procedure sortbtClick(Sender: TObject); private public end;
var Form1: TForm1; schuelersatz: ARRAY [1..1000] of schueler; i,anzahl: integer;
implementation
{$R *.dfm}
procedure TForm1.endebtClick(Sender: TObject); begin close; end;
procedure TForm1.einlesebtClick(Sender: TObject); begin with schuelersatz[i] DO Begin nachname:= nachtf.text; vorname := vortf.Text; klasse := klastf.Text; Postleitzahl := strtoint(plztf.Text); geburtstag := strtodate(gebtf.Text); end; tab.cells[0,i]:= inttostr (i+1); tab.cells[1,i]:=schuelersatz[i].nachname; tab.cells[2,i]:=schuelersatz[i].vorname; tab.cells[3,i]:=schuelersatz[i].klasse; tab.Cells[5,i]:=inttostr(schuelersatz[i].Postleitzahl); tab.Cells[6,i]:=datetostr(schuelersatz[i].geburtstag);
nachtf.Clear; vortf.Clear; gebtf.Clear; klastf.Clear; plztf.Clear; strastf.Clear;
tab.rowcount:=i+1; i:= i+1; anzahl:= i; end; |
Wäre ich nett wenn ihr mir helfen könntet.
bis denne eure kerstin
Moderiert von
AXMD: Code- durch Delphi-Tags ersetzt.
AXMD - Mi 16.02.05 22:16
1.) Bitte formatier deinen Code leserlicher
2.) tDate müsste vor Schueler deklariert sein, abgesehen davon, dass es TSchueler heißen sollte
3.) Du hast i nicht initialisiert - das zu deiner Frage ;)
AXMD
Kerstin05 - Mi 16.02.05 22:26
Danke erstmal für die schnelle Antwort @ AXMD
zu
1.) das is so eine Macke von mir, sorry :cry:
2.) gut hab ich gemacht mit dem Tausch :wink:
warum muss es Tschueler heißen ?
3.) was heißt das jetzt genau ? wo muss ich da was ändern ?
AXMD - Mi 16.02.05 22:28
Ganz einfach: i muss einen Wert haben (d.h. initialisiert werden). Bevor du was machst muss i einen Wert haben, das hat es bei dir nicht -> Fehler, weil i irgendeinen Wert zugeweisen bekommt (zB 1234567), der nicht in 1..1000 liegt ;)
AXMD
Kerstin05 - Mi 16.02.05 22:29
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91:
| type tdate=record Tag:1..31; Monat:1..12; Jahr:1900..2006;
end;
schueler = record nachname: string [50]; vorname: string [50]; klasse: string [50]; Postleitzahl : integer; geburtstag : tdate;
end;
TForm1 = class(TForm) nachtf: TEdit; vortf: TEdit; klastf: TEdit; strastf: TEdit; plztf: TEdit; orttf: TEdit; gebtf: TEdit; einlesebt: TButton; neubt: TButton; endebt: TButton; sortbt: TButton; tab: TStringGrid; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; procedure endebtClick(Sender: TObject); procedure einlesebtClick(Sender: TObject); procedure sortbtClick(Sender: TObject); private public end;
var Form1: TForm1; schuelersatz: ARRAY [1..1000] of schueler; i,anzahl: integer;
implementation
{$R *.dfm}
procedure TForm1.endebtClick(Sender: TObject); begin close; end;
procedure TForm1.einlesebtClick(Sender: TObject); begin with schuelersatz[i] DO Begin nachname:= nachtf.text; vorname := vortf.Text; klasse := klastf.Text; Postleitzahl := strtoint(plztf.Text); geburtstag := strtodate(gebtf.Text); end; tab.cells[0,i]:= inttostr (i+1); tab.cells[1,i]:=schuelersatz[i].nachname; tab.cells[2,i]:=schuelersatz[i].vorname; tab.cells[3,i]:=schuelersatz[i].klasse; tab.Cells[5,i]:=inttostr(schuelersatz[i].Postleitzahl); tab.Cells[6,i]:=datetostr(schuelersatz[i].geburtstag);
nachtf.Clear; vortf.Clear; gebtf.Clear; klastf.Clear; plztf.Clear; strastf.Clear;
tab.rowcount:=i+1; i:= i+1; anzahl:= i; end; |
Moderiert von
AXMD: Code- durch Delphi-Tags ersetzt.
AXMD - Mi 16.02.05 22:31
Bitte das nächste Mal Delphi- anstatt Code-Tags verwenden. Danke dir :)
AXMD
Kerstin05 - Mi 16.02.05 22:31
d.h. ich soll bei meinem einlesebt i:=1; einfügen sehe ich das richtig ?
Kerstin05 - Mi 16.02.05 22:55
AXMD jetzt hab ich das geändert und bekomme diese neue Fehlermeldung :
[Fehler] Unit1.pas(80): Inkompatible Typen: 'tdate' und 'TDateTime'
[Fehler] Unit1.pas(87): Es gibt keine überladene Version von 'DateToStr', die man mit diesen Argumenten aufrufen kann
Ich habe noch nie mit einem Datum gearbeitet, deshalb weiß ich leider net wie das richtig geht!
Bitte um Hilfe
gruß Kerstin
AXMD - Mi 16.02.05 22:59
Was macht eigentlich deine TDate-Deklaration? Sonst lass sie halt einfach weg...
AXMD
Kerstin05 - Mi 16.02.05 23:04
ok danke das mit tdate hab ich hin bekommen hab einfach Tdatetime draus gemacht :D :D
AXMD bitte erklär mit nochmal das mit dem i !
danke im vorraus
AXMD - Mi 16.02.05 23:08
Kerstin05 hat folgendes geschrieben: |
d.h. ich soll bei meinem einlesebt i:=1; einfügen sehe ich das richtig ? |
Zum Beispiel. Ich weiß ja nicht, welches Item aus dem Array du brauchst. Was soll den das Programm überhaupt können?
AXMD
delfiphan - Do 17.02.05 13:21
i ist global und wird meines Wissens automatisch mit 0 initialisiert. Ich nehme an du hast in der Tabelle einen Tabellenkopf, also solltest du ihn mit 1 initialisieren. Das geht so:
Delphi-Quelltext
1: 2:
| var I : integer = 1; |
(Achtung: In älteren Delphiversion geht das nicht. Da muss man const I : integer = 1 schreiben. I wird dann in älteren Versionen nicht wirklich als Konstante, sondern als eine Variable mit einem Anfangswert interpretiert)
Bevor du irgend was in die Tabelle schreibst, musst du die Tabellengrösse anpassen (um 1 erhöhen).
Delphi-Quelltext
1: 2:
| tab.rowcount := i + 1; |
Übrigens: Du speicherst ja alles doppelt, einmal in der Tabelle und einmal im Array. Das wäre nicht für alle Felder notwendig. Wenn du eine Zeile aus der Tabelle löschst dann stimmt die Nummerierung auch nicht mehr...
Du solltest die "Rohdaten" als Objekt an eine Zelle anhängen oder zu mindest eine Verknüpfung von der Zelle aufs Record mittels einem Pointer erstellen. Dann kannst du die Tabelle auch ohne Probleme sortieren, etc.. Falls du nicht mit Objekten oder Pointern hantieren willst, kannst du's auch mal so probieren:
Delphi-Quelltext
1:
| Tab.Objects[0,i] := TObject(I); |
Das Tab ist kein owner des Objektes, also kannst du es so machen, ohne dass es Ärger gibt.
Auf die Rohdaten kannst du dann mittels schuelersatz[Integer(Tab.Objects[0,Tabelle_Zeilennummer])] zugreifen.
Gruss,
Simon
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!