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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  schuelersatz: ARRAY [1..1000of 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 user profile iconAXMD: 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  schuelersatz: ARRAY [1..1000of 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 user profile iconAXMD: 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;
// erst dann kannst du auf Tab.Cells[...,i] zugreifen.


Ü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