Autor Beitrag
Kerstin05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18


D7
BeitragVerfasst: Mi 16.02.05 22:07 
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: "

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18


D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18


D7
BeitragVerfasst: Mi 16.02.05 22:29 
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 16.02.05 22:31 
Bitte das nächste Mal Delphi- anstatt Code-Tags verwenden. Danke dir :)

AXMD
Kerstin05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18


D7
BeitragVerfasst: Mi 16.02.05 22:31 
d.h. ich soll bei meinem einlesebt i:=1; einfügen sehe ich das richtig ?
Kerstin05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18


D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 16.02.05 22:59 
Was macht eigentlich deine TDate-Deklaration? Sonst lass sie halt einfach weg...

AXMD
Kerstin05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18


D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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:

ausblenden 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).

ausblenden 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:
ausblenden 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