Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - fehlende Informationen eines Records anzeigen


Delete - So 15.06.08 14:32
Titel: fehlende Informationen eines Records anzeigen
Hi,

weiß nicht, ob der Name des Themas gut gewählt ist, aber ich programmiere nur sehr selten und kenne mich daher auch mit vielen Begrifflichkeiten noch nicht so gut aus.
Habe auch schon die Suche benutzt, aber leider nichts passendes gefunden.

Zu meinem Problem:

Ich habe einen Record "TSchueler", welcher Name, Vorname, Alter und Kurs beinhaltet.
Weiterhin habe ich ein Array "schüler" [1..30] und
4 Editfenster, in die die Daten jedes Schülers eingegeben und daraufhin gespeichert werden.

Jetzt möchte ich bspw. gerne in das erste Edit-Fenster einen Namen eingeben und dann über einen Suche-Button die fehlenden Informationen in den anderen Edit-Fenstern anzeigen lassen.

Meine bisherige Lösung sieht so aus:


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:
type TSchueler = record
                  name: String;
                  vorname: String;
                  alter: String;
                  kurs: String;
                  end; 

var schuler: array [1..30] of TSchueler;
    index: integer = 1;

procedure TListenform.Speichern;
  begin
    schuler[index].name:=NameEdit.Text;
    schuler[index].vorname:=VornameEdit.Text;
    schuler[index].alter:=AlterEdit.Text;
    schuler[index].kurs:=KursEdit.Text;
  end;

procedure TListenform.Anzeigen;
  begin
    NameEdit.Text:=schuler[index].name;
    VornameEdit.Text:=schuler[index].vorname;
    AlterEdit.Text:=schuler[index].alter;
    KursEdit.Text:=schuler[index].kurs;
  end;

procedure TListenform.SpeichernButtonClick(Sender: TObject);
begin
  SuchenButton.Enabled:=true;
  if index < 30 then
    begin
      Speichern;
      AnzahlEdit.Text:=IntToStr(index);
      inc (index);
      Anzeigen;
    end;
end;

procedure TListenform.SuchenButtonClick(Sender: TObject);
 var eintraege, indexhilf:integer;
begin
  indexhilf:=StrToInt(AnzahlEdit.Text);
  index:=1;

  for eintraege:=1 to 30 do

  if NameEdit.Text<>'' then
    begin
      repeat
        if schuler[index].name=nameedit.text
        then Anzeigen else inc(index);
      until schuler[index].name=nameedit.text;
          Anzeigen;
    end

  else if VornameEdit.Text<>'' then
    begin
      repeat
        if schuler[index].vorname=vornameedit.text
        then Anzeigen else inc(index);
      until schuler[index].vorname=vornameedit.text;
            Anzeigen;
    end

  else if AlterEdit.Text<>'' then
    begin
      repeat
        if schuler[index].alter=alteredit.text
        then Anzeigen else inc(index);
      until schuler[index].alter=alteredit.text;
            Anzeigen;
    end

  else if KursEdit.Text<>'' then
    begin
      repeat
        if schuler[index].kurs=kursedit.text
        then Anzeigen else inc(index);
      until schuler[index].kurs=kursedit.text;
            Anzeigen;
      end

  else
  Begin
  showmessage('Kein Suchbegriff eingegeben');
  break;  
  end;
 index:=indexhilf+1;
end;


Problem ist noch, dass zB wenn ich nur einen Teil des Namens eingebe ein Fehler auftritt, den würde ich gern abfangen und eine Meldung ausgeben.
Und vielleicht ist es auch möglich die Suche zu vereinfachen. Ich denke, ich habe bisher eine sehr umständliche Variante gewählt.

Über Vorschläge und Verbesserungen würde ich mich sehr freuen.

Grüße

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Narses - So 15.06.08 15:03
Titel: Re: fehlende Informationen eines Records anzeigen
Moin und :welcome: im Forum!

user profile iconTino the Rino hat folgendes geschrieben:
Über Vorschläge und Verbesserungen würde ich mich sehr freuen.
OK, dann mal los: ;)

Delphi-Quelltext
1:
2:
3:
var
  schueler: array[1..30] of TSchueler; // OK so
  anzahl: Integer = 0; // das würde ich als "Wasserstandsanzeiger" nehmen, am Anfang sind keine gespeichert = 0
Du hast die Information, wieviele Datensätze aktuell vorhanden sind, über ein Editfeld gelöst, das würde ich eher wie oben lösen. Beim Suchen brauchst du dann auch nur über die Anzahl der bisherigen Datensätze und nicht über alle zu laufen. :idea:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TListenform.Speichern(const AIndex: Integer);
begin
  schuler[AIndex].name := NameEdit.Text;
  schuler[AIndex].vorname := VornameEdit.Text;
  schuler[AIndex].alter := AlterEdit.Text;
  schuler[AIndex].kurs := KursEdit.Text;
end;
Ich würde der Prozedur mitgeben, welcher Datensatz geschrieben werden soll; analog natürlich beim Lesen, welcher Datensatz angezeigt werden soll. :idea:



user profile iconTino the Rino hat folgendes geschrieben:
Problem ist noch, dass zB wenn ich nur einen Teil des Namens eingebe ein Fehler auftritt, den würde ich gern abfangen und eine Meldung ausgeben.
Was kommt denn für ein Fehler? :nixweiss:

cu
Narses


Delete - So 15.06.08 15:32

Also ich habe beispielsweise einen "Datensatz" mit Name, Vorname, Alter, Kurs eingegeben, dann gespeichert und dann gehe ich in ein Editfenster und gebe ein zu suchendes Wort ein, zB "Max" bei Name und er findet kein "Max" bei den Daten - kommt der Fehler:

Fehlermeldung hat folgendes geschrieben:
Im Projekt Schueler1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei der Adresse 0040426F in Modul 'Schueler1.exe'.
Lesen von 000581A0'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.


Will aber gerne, dass bspw. eine Meldung kommt: "Das Suchwort wurde nicht gefunden." - oder ähnliches.

Danke schonmal für deine Antwort - ich werde mal versuchen das umzusetzen.


Narses - So 15.06.08 15:44

Moin!

user profile iconTino the Rino hat folgendes geschrieben:
Also ich habe beispielsweise einen "Datensatz" mit Name, Vorname, Alter, Kurs eingegeben, dann gespeichert und dann gehe ich in ein Editfenster und gebe ein zu suchendes Wort ein, zB "Max" bei Name und er findet kein "Max" bei den Daten - kommt der Fehler:
Das liegt daran, dass du bei einem Teilvergleich schon den Index erhöhst, dann läuft dieser zu schnell aus dem gültigen Bereich. :idea:

Bau das erstmal ein bischen um, wie beschrieben, dann sehen wir mal mit dem Suchen weiter. ;)

cu
Narses