AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suchfunktion für ein Array

Ein Thema von ghost1601 · begonnen am 24. Dez 2006 · letzter Beitrag vom 3. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#1

Suchfunktion für ein Array

  Alt 24. Dez 2006, 12:31
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:
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;
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?
Vielen Dank und frohe Weihnachten
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 12:34
Ist das Array statisch? Ansonsten würde ich eher bei 0 anfangen.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 12:35
Speichere doch die aktuelle Position vorher ab.
Markus Kinzler
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 12:48
Zitat von 3_of_8:
Ist das Array statisch? Ansonsten würde ich eher bei 0 anfangen.
nunja das array ist schon festgelegt, also statisch.
Es geht von 1 bis max (max ist eine Konstante die den Wert 100 hat)

Zitat von mkinzler:
Speichere doch die aktuelle Position vorher ab.[
also du meinst so wie es vor der Suche ist, einfach in eine Datei schreiben?
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?
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 13:02
Hallo,

Zitat von ghost1601:
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:
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;
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?
Vielen Dank und frohe Weihnachten
Wie wärs denn beim Finden auch die Suche zu verlassen ?

Delphi-Quellcode:
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;
Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 13:45
Zitat von thkerkmann:
Hallo,

Zitat von ghost1601:
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:
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;
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?
Vielen Dank und frohe Weihnachten
Wie wärs denn beim Finden auch die Suche zu verlassen ?

Delphi-Quellcode:
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;
Gruss
ja das hatte ich auch schonmal so, nur ,dass das auch nichts an dem Fakt ändert, dass die aktuelle Position in der Maske mit dem Suchergebnis überschrieben wird
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 13:59
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 14:03
Zitat von 3_of_8:
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.
ja also effizient - das ist in meinen Programmen leider noch ein Fremdwort - aber ich wüsste echt nicht wo der Fehler sonst noch sein könnte...
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.
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 15:07
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:
  if geaendert then
    MaskeInArray;
  geaendert := false;
verwenden.
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:
TForm1.OnEditsChange (Sender:tObject);
begin
  if not fuelle_maske then
    geaendert := true;
end;
und Array in Maske sieht dann so aus:
Delphi-Quellcode:
procedure ArrayInMaske;
begin
  fuelle_maske := true;
  ...
  Zuweisungen an die edits
  ...
  fuelle_maske := false;
end;
So und jetzt kannst Du das mal ausprobieren - ich muss nämlich noch kochen.

Frohes Fest allerseits.
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Suchfunktion für ein Array

  Alt 24. Dez 2006, 16:51
Zitat von thkerkmann:
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:
  if geaendert then
    MaskeInArray;
  geaendert := false;
verwenden.
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:
TForm1.OnEditsChange (Sender:tObject);
begin
  if not fuelle_maske then
    geaendert := true;
end;
und Array in Maske sieht dann so aus:
Delphi-Quellcode:
procedure ArrayInMaske;
begin
  fuelle_maske := true;
  ...
  Zuweisungen an die edits
  ...
  fuelle_maske := false;
end;
So und jetzt kannst Du das mal ausprobieren - ich muss nämlich noch kochen.

Frohes Fest allerseits.
öhm ja, aber du hast schon gelesen um was es in dem Topic geht?
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz