![]() |
Suchfunktion für ein Array
Hallo!
Ich arbeite derzeit an einer Datenbank, diese funktioniert soweit auch. Sie besteht aus einem eigenem Datentyp (dort sind strings enthalten, der Datentyp ist ein record), der in einem Array beim schließen der Form in eine Datei geschrieben wird. Nun möchte ich jedoch noch eine Suchfunktion zu dem Programm hinzufügen, die das array an allen Stellen auf einen Suchbegriff überprüft. Bisher bin ich soweit gekommen:
Delphi-Quellcode:
Sprich dies stellt meine Suchfunktion dar. Das Problem ist jedoch, dass bei der Suche immer die aktuelle Stelle des angezeigten arrays überschrieben wird. Nun ich denke jedem ist klar, dass das nicht passieren soll. Hat jemand eine Idee oder vielleicht Verbesserungen um dieses Problem zu lösen?
function TForm1.Suche(const sucheNach : String): LongInt;
var i : Integer; begin for i:= 1 to max do if datenfeld[i].clanname = SucheNach then result := i; end; Vielen Dank und frohe Weihnachten :-D |
Re: Suchfunktion für ein Array
Ist das Array statisch? Ansonsten würde ich eher bei 0 anfangen.
|
Re: Suchfunktion für ein Array
Speichere doch die aktuelle Position vorher ab.
|
Re: Suchfunktion für ein Array
Zitat:
Es geht von 1 bis max (max ist eine Konstante die den Wert 100 hat) Zitat:
Und was dann, dann steht dort alles drinn. Aber es bringt ja nicht viel weil die aktuelle Stelle im array ja trotzdem überschrieben wird. Wenn man dann das Suchergebnis hat und dann wieder den Zustand vor der Suche herstellt ist das Suchergebnis doch auch weg... Oder hab ich dich jetzt falsch verstanden? |
Re: Suchfunktion für ein Array
Hallo,
Zitat:
Delphi-Quellcode:
Gruss
function TForm1.Suche(const sucheNach : String): LongInt;
var i : Integer; begin for i:= 1 to max do if datenfeld[i].clanname = SucheNach then begin result := i; exit; end; end; |
Re: Suchfunktion für ein Array
Zitat:
|
Re: Suchfunktion für ein Array
Also abgesehen davon, dass deine Funktion jetzt nicht so sonderlich effizient ist, ist sie eigentlich in Ordnung... Sicher, dass der Fehler nicht irgendwo anders liegt?
Grenze das ganze mal mit Breakpoints und Evaluator ein bissel ein. |
Re: Suchfunktion für ein Array
Zitat:
Vielleicht hilft es ja wenn der gesamte Quelltext hier steht, eventuell findet ja jemand an einer anderen Stelle noch den Fehler
Delphi-Quellcode:
private
procedure ArrayinMaske; procedure MaskeinArray; function Suche (const sucheNach : String): LongInt; function Suche2 (const sucheNach : String): LongInt; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation type tdaten=record clanname:string[20]; clankuerzel:string[10]; homepage:string[30]; spiel:string[20]; kontaktname:string[30]; icq:string[11]; msn:string[30]; maps:string[150]; kommentar:string[150]; end; const max=100; var p:integer; daten:tdaten; datenfeld:array[1..max]of tdaten; datendatei:file of tdaten; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var zaehler:integer; begin p:=1; zaehler:=1; statusbar1.Panels[0].Text:='Position: '+inttostr(p) + '/' + inttostr(max); assignfile(datendatei, 'datenblatt.td'); if FileExists('datenblatt.td') then begin reset(datendatei); for zaehler:=1 to max do begin read(datendatei,daten); datenfeld[zaehler]:=daten; end; end else begin ReWrite(datendatei) end; closefile(datendatei); arrayinmaske; end; procedure TForm1.ArrayinMaske; begin daten:=datenfeld[p]; edit1.text:=daten.clanname; edit2.text:=daten.clankuerzel; edit6.text:=daten.homepage; combobox1.text:=daten.spiel; edit3.text:=daten.kontaktname; edit4.Text:=daten.icq; edit5.Text:=daten.msn; memo1.text:=daten.maps; memo2.Text:=daten.kommentar; statusbar1.simpletext:='Position: '+inttostr(p) + '/' + inttostr(max); daten:=datenfeld[p]; end; procedure TForm1.MaskeinArray; begin daten.clanname:=edit1.text; daten.clankuerzel:=edit2.text; daten.homepage:=edit6.text; daten.spiel:=combobox1.Text; daten.kontaktname:=edit3.text; daten.icq:=edit4.text; daten.msn:=edit5.Text; daten.maps:=memo1.text; daten.kommentar:=memo2.text; datenfeld[p]:=daten; end; function TForm1.Suche(const sucheNach : String): LongInt; var i : Integer; begin for i:= 1 to max do if datenfeld[i].clanname = SucheNach then result := i; end; function TForm1.Suche2(const sucheNach : String): LongInt; var i : Integer; begin for i := 1 to max do if datenfeld[i].clankuerzel = SucheNach then result := i; end; procedure TForm1.Button2Click(Sender: TObject); var zaehler:integer; begin MaskeinArray; if p<max then inc(p); ArrayinMaske; assignfile(datendatei,'sicherheitskopie von datenblatt.td'); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei); end; procedure TForm1.Button1Click(Sender: TObject); var zaehler:integer; begin MaskeinArray; if p>1 then dec(p); ArrayinMaske; assignfile(datendatei,'sicherheitskopie von datenblatt.td'); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei); end; procedure TForm1.ffnen1Click(Sender: TObject); var zaehler:integer; begin if opendialog1.execute then begin assignfile(datendatei, opendialog1.filename); reset(datendatei); for zaehler:=1 to max do begin read(datendatei,daten); datenfeld[zaehler]:=daten; end; closefile(datendatei); arrayinmaske; end; end; procedure TForm1.speichern2Click(Sender: TObject); var zaehler:integer; begin maskeinarray; if savedialog1.execute then begin assignfile(datendatei,savedialog1.filename); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei) end; end; procedure TForm1.beenden1Click(Sender: TObject); var zaehler:integer; begin assignfile(datendatei,'datenblatt.td'); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei); close; end; procedure TForm1.Button3Click(Sender: TObject); begin ShellExecute(0,'open','iexplore.exe',PChar(Edit6.Text),nil,SW_SHOW); end; procedure TForm1.FormDestroy(Sender: TObject); var zaehler:integer; begin maskeinarray; assignfile(datendatei,'datenblatt.td'); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei) end; procedure TForm1.suchen2Click(Sender: TObject); var such : String; i: Integer; begin such := InputBox('suchen nach Clannamen', 'Suche', ''); begin i:= Suche(such); daten:=datenfeld[i]; edit1.text:=daten.clanname; edit2.text:=daten.clankuerzel; edit6.text:=daten.homepage; combobox1.text:=daten.spiel; edit3.text:=daten.kontaktname; edit4.Text:=daten.icq; edit5.Text:=daten.msn; memo1.text:=daten.maps; memo2.Text:=daten.kommentar; daten:=datenfeld[i]; end; end; procedure TForm1.suchennachClantag1Click(Sender: TObject); var such : String; i: Integer; begin such := InputBox('suchen nach Clantag', 'Suche', ''); begin i:= Suche2(such); daten:=datenfeld[i]; edit1.text:=daten.clanname; edit2.text:=daten.clankuerzel; edit6.text:=daten.homepage; combobox1.text:=daten.spiel; edit3.text:=daten.kontaktname; edit4.Text:=daten.icq; edit5.Text:=daten.msn; memo1.text:=daten.maps; memo2.Text:=daten.kommentar; daten:=datenfeld[i]; end; end; end. |
Re: Suchfunktion für ein Array
Hi,
also wenn ich deinen Code richtig interpretiere dann sind Button1 und Button2 zum Blättern in deiner Datenbank bestimmt. Jetzt machst Du aber jedesmal beim Blättern ein update auf dein Datenarray (MaskeInArray). Das solltest Du aber nur dann tun, wenn sich diese Daten geändert haben. Also würde ich mal bei all diesen Edit-Feldern das OnChange Ereignis auf eine Prozedur zeigen lassen, die dann ein "geändert" Flag setzt. Ausserdem benötigst Du noch ein zweites Flag, welches verhindert dass durch ArrayInMaske (löst ja auch OnChange aus) dieses geändert Flag gesetzt wird. So und anstatt immer MaskeInArray aufzurufen solltest Du dann
Delphi-Quellcode:
verwenden.
if geaendert then
MaskeInArray; geaendert := false; Man könnte diese Abfrage auch in MaskeInArray machen - oder das geaendert := false dort machen, das ist noch Optimierungsarbeit. Das OnChange könnte dann so aussehen:
Delphi-Quellcode:
und Array in Maske sieht dann so aus:
TForm1.OnEditsChange (Sender:tObject);
begin if not fuelle_maske then geaendert := true; end;
Delphi-Quellcode:
So und jetzt kannst Du das mal ausprobieren - ich muss nämlich noch kochen. :-)
procedure ArrayInMaske;
begin fuelle_maske := true; ... Zuweisungen an die edits ... fuelle_maske := false; end; Frohes Fest allerseits. :-D |
Re: Suchfunktion für ein Array
Zitat:
ich meine ich find es toll, dass du mir sagst wie ich das Prog optimieren kann aber darum geht es nicht. Es geht um die Suchfunktion, ich glaube damit hat das nichts zu tun oder täusche ich mich? |
Re: Suchfunktion für ein Array
Hi,
ja, du täuscht dich - genau das Fehlen dieser Vorgehensweise ist der Grund für das Überschreiben deiner Daten. Probiers doch mal aus... Gruss |
Re: Suchfunktion für ein Array
alles klar...ich hatte es mitlerweile schon anderweitig geregelt...
[delphi] function TForm1.Suche(const sucheNach : String): LongInt; var i:integer; begin for i:= 1 to max do begin if datenfeld[i].clanname = SucheNach then begin result := i; exit; end else if datenfeld[i].clankuerzel = SucheNach then begin result:=i; exit; end else if datenfeld[i].kontaktname = SucheNach then begin result:=i; exit; end; end; end; procedure TForm1.abc; var such : String; i:integer; begin such := InputBox('suchen nach', 'Suche', ''); i:= Suche(such); daten:=datenfeld[i]; form2.edit1.text:=daten.clanname; form2.edit2.text:=daten.clankuerzel; form2.edit3.text:=daten.homepage; form2.edit4.Text:=daten.nation; form2.edit5.text:=daten.spiel; form2.edit6.text:=daten.kontaktname; form2.edit7.Text:=daten.icq; form2.edit8.Text:=daten.msn; form2.memo1.Text:=daten.kommentar; daten:=datenfeld[i]; form2.StatusBar1.Panels[0].Text:='Position: ' + inttostr(i) + '/' + inttostr(max); form2.showModal; daten.clanname:=edit1.text; daten.clankuerzel:=edit2.text; daten.homepage:=edit6.text; daten.spiel:=combobox1.Text; daten.nation:=combobox2.Text; daten.kontaktname:=edit3.text; daten.icq:=edit4.text; daten.msn:=edit5.Text; daten.kommentar:=memo2.text; datenfeld[p]:=daten; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz