Autor Beitrag
depigoid
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Mi 23.05.07 19:44 
Hallo!
Ich sollte mit Verbunden und Arrays eine Art "Datenbank"erstellen. Die Einträge sollen dann per extra Button auch sortiert oder ein Begriff gesucht werden. Das Sortieren und Suchen geht aber nicht - warum? Wäre total super wenn mir jemand sagen könnte, warum das nicht geht und wie ich das Problem beheben kann!
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:
tvirus = record                         //meine Vereinbarung
  latein:string[40];  
  trivial:string[20];
  art:string[10];
  laenge:extended;
  form:string[20];
  krankheit_eins:string[20];
  krankheit_zwei:string[20];
  symptom1:string[20];  //weitere sind Symptom 2, 3, bis 8
  letal_eins:integer;
  letal_zwei:integer;
  folgen:string[30];
  end;
 tfeld=array[0..200]of tvirus;
 tfile=file of tfeld;

var
  Hauptfenster: THauptfenster;
  datei:tfile;
  datensatz:tvirus;
  virus:tfeld;
  seitennummer:integer; 

procedure THauptfenster.einlesenClick(Sender: TObject); //einlesen der Daten 
var i:integer;
begin
  i:=strtoint(Label4.Caption); 
  virus[i].latein:=Hauptfenster.lateinEdit.text;
  virus[i].trivial:=Hauptfenster.trivialEdit.text;
  virus[i].art:=Hauptfenster.virobaktEdit.text;
  virus[i].laenge:=strtofloat(Hauptfenster.laengeEdit.text);
  virus[i].form:=Hauptfenster.formEdit.text;
   //usw. 
end
 
procedure THauptfenster.SuchenClick(Sender: TObject);   //Aufruf zum Suchen 
var wort:string;
begin
 wort:=suchEdit.text;
         if nameBox.checked=true then in_namen_suchen(wort, seitennummer, virus)
     else if krankheitBox.checked=true then in_krankheiten_suchen(wort, seitennummer,  virus)
      else if symptomeBox.checked=true then in_symptomen_suchen(wort, seitennummer, virus);
 ausgeben(seitennummer, virus);
end

procedure in_krankheiten_suchen(suche:stringvar seite:integer; var bazillus:tfeld); //mein Versuch was zu suchen 
var pos, i:integer;
begin
 pos:=0;
 for i:=0 to high(bazillus) do
  begin
   if (suche=bazillus[i].krankheit_eins) or (suche=bazillus[i].krankheit_zwei) then
    begin
     seite:=i;
     pos:=pos+1;
    end;
   if pos=0 then Showmessage('Die Krankheit wurde noch nicht eingetragen.');
  end;
end;  

procedure THauptfenster.sortierenClick(Sender: TObject);    //Aufruf zum Sortieren  
begin
      if lateinBox.checked=true then ordnen_latein(virus)
  else if dtBox.checked=true then ordnen_name(virus)
   else if krankBox.checked=true then ordnen_krankheit(virus)
    else if langBox.checked=true then ordnen_laenge(virus);
  ausgeben(seitennummer, virus);
end;

procedure ordnen_latein(var bazillus:tfeld); //Mein Versuch zu sortieren 
var i,j:integer;
    hilfe:tfeld;
begin
 for i:=0 to (high(bazillus)-1do
  for j:=1 to high(bazillus) do
   if bazillus[j-1].latein>bazillus[j].latein then
    begin
     hilfe[j].latein:=bazillus[j-1].latein;
     hilfe[j].trivial:=bazillus[j-1].trivial; //usw. in der Vertausche procedure 
end;

Ich habe den Quelltext jetzt mal chronolisch geordnet (die Prozeduren stehen im Original alle ganz oben, darunter dann die Buttonaufrufe). Würde mich über Hilfe sehr freuen.
MfG depigoid
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 23.05.07 23:30 
Moin!

user profile icondepigoid hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure ordnen_latein(var bazillus:tfeld); //Mein Versuch zu sortieren 
var i,j:integer;
    hilfe:tfeld;
begin
 for i:=0 to (high(bazillus)-1do
  for j:=1 to high(bazillus) do
   if bazillus[j-1].latein>bazillus[j].latein then
    begin
     hilfe[j].latein:=bazillus[j-1].latein;
     hilfe[j].trivial:=bazillus[j-1].trivial; //usw. in der Vertausche procedure 
end;

a) Du sortierst immer das ganze Feld 0..High(bazillus), statt nur die Einträge, die auch wirklich benutzt sind! :shock: Führt dann vermutlich dazu, dass du erstmal eine ganze Menge leere Einträge hast, und dann die Daten... ;)

b) Deine Schleifengrenzen sind nicht soo ganz BubbleSort-mäßig. :? Wie wär´s damit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i := High(bazillus)-1 downto 0 do
  for j := 0 to i do
    if (bazillus[j].latein > bazillus[j+1].latein) then begin
      tmp := bazillus[j].latein;
      bazillus[j].latein := bazillus[j+1].latein;
      bazillus[j+1].latein := tmp;
      //... restliche Verbundelemente auch tauschen

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am Do 24.05.07 09:07, insgesamt 1-mal bearbeitet
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: Do 24.05.07 00:31 
Besser so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  if (bazillus[j].latein > bazillus[j+1].latein) then 
    begin
      tmp := bazillus[j];
      bazillus[j] := bazillus[j+1];
      bazillus[j+1] := tmp;
    end;

Sonst sortierst Du nämlich nur die Latein-Einträge und die restlichen Daten bleiben so stehen.

Bye!
ub60
depigoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Do 24.05.07 14:05 
Vielen Dank!!!
Habe aber leider immer noch Probleme.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i:=(high(bazillus)-1downto 0 do
  for j:=0 to i do
   if (bazillus[j].latein > bazillus[j+1].latein) then
    begin
     hilfe[j].latein:=bazillus[j-1].latein;
     hilfe[j].trivial:=bazillus[j-1].trivial; //usw. 
    end;

Der sortiert die Einträge, außer den letzten - der ist nach dem Sortieren immer weg. Dazu kommt noch eine Fehlermeldung "Exception EAccessViolant Zugriffsverletzung" - die kommt dann gleich immer 6 bis 7 mal hintereinander. Kann das irgendwie mit dem LAden und SPeichern der Datei zusammenhängen (ich hab versucht bei der Delphi-Hilfe die Nachricht zu entschlüsseln, aber das wollte mir irgendwie nicht gelingen.).

Was ist an der Suche falsch?

MfG depigoid
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 24.05.07 14:23 
Moin!

Schau noch mal genau hier hin, was du da stehen hast, und was in meinem Beitrag da steht: ;)
user profile icondepigoid hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i:=(high(bazillus)-1downto 0 do
  for j:=0 to i do
   if (bazillus[j].latein > bazillus[j+1].latein) then
    begin
     hilfe[j].latein:=bazillus[j-1].latein;
     hilfe[j].trivial:=bazillus[j-1].trivial; //usw. 
    end;


user profile icondepigoid hat folgendes geschrieben:
Was ist an der Suche falsch?

Hä? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
depigoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Mo 28.05.07 16:38 
Vielen Dank! (Wer lesen kann, ist klar im Vorteil)
Äh ... der packt jetzt aber die Einträge (sind sortiert) auf die letzten Plätze. Das Feld umfasst 200 Seiten, eingetragen sind Krankheiten:=Ebola, Syphilis, Marburg - ursprünglich auf 1,2,3, nach dem Sortieren auf 198, 199, 200. Kann man das irgendwie ändern?

Wie ist das mit dem "hä?" gemeint?

MfG depigoid
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.05.07 00:06 
Moin!

user profile icondepigoid hat folgendes geschrieben:
Vielen Dank! (Wer lesen kann, ist klar im Vorteil)
Äh ... der packt jetzt aber die Einträge (sind sortiert) auf die letzten Plätze. Das Feld umfasst 200 Seiten, eingetragen sind Krankheiten:=Ebola, Syphilis, Marburg - ursprünglich auf 1,2,3, nach dem Sortieren auf 198, 199, 200. Kann man das irgendwie ändern?

user profile iconNarses hat folgendes geschrieben:
a) Du sortierst immer das ganze Feld 0..High(bazillus), statt nur die Einträge, die auch wirklich benutzt sind! :shock: Führt dann vermutlich dazu, dass du erstmal eine ganze Menge leere Einträge hast, und dann die Daten... ;)

Du brauchst einen Zähler für die Anzahl der definierten Einträge und diesen verwendest du in der Sortierschleife statt High(Feldname). :idea:

user profile icondepigoid hat folgendes geschrieben:
Wie ist das mit dem "hä?" gemeint?

"Hä?" := "Ich verstehe deine Frage nicht!" ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
depigoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Di 29.05.07 12:22 
Ich krieg das nicht hin! :cry:
Problem erfasst (also, dass ich das ganze Feld sortiere) aber ich kann das nicht ändern. Wie mach ich den Zähler (ich habe folgendes ausprobiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 for i:=0 to high(seitennummer)-1//Variante 1
 for i:=high(Bazillus) downto 0 //Variante 2 
 for seitennummer:=0 to high(seitennummer) //Variante3
 
 //extraschleife = Variante 4
 for a:=0 to high(Bazillus) do 
  for b:=1 to high(bazillus) do 
   begin 
    hilf[a]:=bazillus[b];
    bazillus[b]:=bazillus[a]; 
    bazillus[a]:=bazillus[b]; 
   end;

- die gehen bei mir nicht.)?

Die Suche: Ziel Wort in Edit eingeben, CheckBox anklicken zu welcher Rubrik das Wort gehört und dann soll das Wort unter der Rubrik in den Daten gesucht werden und der Virus ausgegeben.

ausblenden 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:
procedure THauptfenster.SuchenClick(Sender: TObject);   //SUCHEN  = Button 
var wort:string;
begin
 wort:=suchEdit.text;
         if nameBox.checked=true then in_namen_suchen(wort, seitennummer, virus)
     else if krankheitBox.checked=true then in_krankheiten_suchen(wort, seitennummer, virus)
      else if symptomeBox.checked=true then in_symptomen_suchen(wort, seitennummer, virus);
 ausgeben(seitennummer, virus);
end;

procedure in_namen_suchen(suche:stringvar seite:integer; var bazillus:tfeld);
//Procedure suchen in den Namen 
var pos, i:integer;
begin
 pos:=0;
 for i:=0 to high(bazillus) do
  begin
   if (suche=bazillus[i].latein) or (suche=bazillus[i].trivial) then
    begin
     seite:=i;
     pos:=pos+1;
    end;
   if pos=0 then Showmessage('Der Name, lateinisch oder deutsch, ist noch nicht gespeichert. Bitte überprüfen Sie die Rechtschreibung!');
  end;
end;

Problem: ich gebe im Edit was ein (weiß auch, dass das eingetragen ist) und erhalte als Antwort nur die Showmessage 'noch nicht vorhanden'. Woran liegt das?
azubi_20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 593

WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
BeitragVerfasst: Di 29.05.07 13:31 
user profile icondepigoid hat folgendes geschrieben:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure in_namen_suchen(suche:stringvar seite:integer; var bazillus:tfeld);
//Procedure suchen in den Namen 
var pos, i:integer;
begin
 pos:=0;
 for i:=0 to high(bazillus) do
  begin
   if (suche=bazillus[i].latein) or (suche=bazillus[i].trivial) then
    begin
     seite:=i;
     pos:=pos+1;
    end;
   if pos=0 then Showmessage('Der Name, lateinisch oder deutsch, ist noch nicht gespeichert. Bitte überprüfen Sie die Rechtschreibung!');
  end;
end;

Problem: ich gebe im Edit was ein (weiß auch, dass das eingetragen ist) und erhalte als Antwort nur die Showmessage 'noch nicht vorhanden'. Woran liegt das?

Na guck doch mal hin, was da geschieht :
erster Schleifen-Aufruf --> Keine Übereinstimmung --> pos=0 --> showmessage;

So sollte es klappen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for i:=0 to high(bazillus) do
  begin
   if (suche=bazillus[i].latein) or (suche=bazillus[i].trivial) then
    begin
     seite:=i;
     pos:=pos+1;

    end;
 // Nicht hier!
  end;
 // Sondern hier !
   if pos=0 then Showmessage('Der Name, lateinisch oder deutsch, ist noch nicht gespeichert. Bitte überprüfen Sie die Rechtschreibung!');


btw : so liefert pos bei einem Treffer immer 1
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.05.07 13:44 
Moin!

user profile icondepigoid hat folgendes geschrieben:
Problem erfasst (also, dass ich das ganze Feld sortiere) aber ich kann das nicht ändern. Wie mach ich den Zähler

Der Zähler ist ja auch nicht "automatisch" vorhanden, du musst eine entsprechende Integer-Variable dafür anlegen, bei Programmstart auf 0 setzen und um 1 erhöhen, wenn ein neuer Eintrag angelegt wurde bzw. wenn du einen Eintrag aus einer Datei geladen hast. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
depigoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Di 29.05.07 16:57 
Die Suche geht - DANKE!!!!!!!

Den "zaehler" habe ich beim "Einlese-Button" mit reingesetzt (muss der Benutzer halt noch mal auf einlesen gehen!)

VIELEN DANK FÜR DIE HILFE beim Sortieren!!!!! :D


MfG depigoid