Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Suchfunktion für ein Array (https://www.delphipraxis.net/83013-suchfunktion-fuer-ein-array.html)

ghost1601 24. Dez 2006 12:31


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

3_of_8 24. Dez 2006 12:34

Re: Suchfunktion für ein Array
 
Ist das Array statisch? Ansonsten würde ich eher bei 0 anfangen.

mkinzler 24. Dez 2006 12:35

Re: Suchfunktion für ein Array
 
Speichere doch die aktuelle Position vorher ab.

ghost1601 24. Dez 2006 12:48

Re: Suchfunktion für ein Array
 
Zitat:

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:

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?

thkerkmann 24. Dez 2006 13:02

Re: Suchfunktion für ein Array
 
Hallo,

Zitat:

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

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

ghost1601 24. Dez 2006 13:45

Re: Suchfunktion für ein Array
 
Zitat:

Zitat von thkerkmann
Hallo,

Zitat:

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

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

3_of_8 24. Dez 2006 13:59

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.

ghost1601 24. Dez 2006 14:03

Re: Suchfunktion für ein Array
 
Zitat:

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.

thkerkmann 24. Dez 2006 15:07

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:
  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. :-D

ghost1601 24. Dez 2006 16:51

Re: Suchfunktion für ein Array
 
Zitat:

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. :-D

:wiejetzt: ö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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
Seite 1 von 2  1 2      

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