Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Adressbuch, aber... (https://www.delphipraxis.net/131979-adressbuch-aber.html)

Wessiiii 3. Apr 2009 16:55


Adressbuch, aber...
 
Hallo,

ich muss für eine Bewerbung ein Adressbuch entwickeln.
Soweit auch ganz ok, nur hab ich ein Problem:

Er gibt mir immer den Fehler EStackOverflow zurück.
Das passiert immer, wenn

- Er in die auskommentierte for Schleife in Unit1 geht und dort auf den ersten Befehl trifft
- oder wenn halt die for schleife auskommentiert bleibt, beim end; von TForm1.Create

Warum?
Hab schon versucht den Stack größer zu stellen, aber nix.

Außerdem würde ich gerne, wenn man im SG eine Zelle auswählt, dass etwas passiert (siehe TForm1.SG_KONTAKTESelectCell). Dazu möchte ich den Inhalt den Arrays "Kontakte[i]" mit dem der Zelle vergleichen, wie geht das?

Hiermal der Code:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Unit2;

type
  TForm1 = class(TForm)
    GB_KONTAKTE: TGroupBox;
    LB_SUCHEN: TLabel;
    ED_SUCHEN: TEdit;
    SG_KONTAKTE: TStringGrid;
    GB_DETAILS: TGroupBox;
    LB_VORNAME: TLabel;
    LB_NACHNAME: TLabel;
    LB_GEB: TLabel;
    LB_TELE_PRIV: TLabel;
    LB_TELE_DIENST: TLabel;
    LB_HANDY: TLabel;
    LB_EMAIL: TLabel;
    ED_VORNAME: TEdit;
    ED_NACHNAME: TEdit;
    ED_GEB: TEdit;
    ED_TELE_PRIV: TEdit;
    ED_TELE_DIENST: TEdit;
    ED_HANDY: TEdit;
    ED_EMAIL: TEdit;
    GB_BEARBEITEN: TGroupBox;
    BT_NEU: TButton;
    BT_BEARBEITEN: TButton;
    BT_LOESCHEN: TButton;
    BT_EXTRA: TButton;
    procedure FormCreate(Sender: TObject);
    procedure BT_NEUClick(Sender: TObject);
    procedure SG_KONTAKTESelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  datei: file of TKontakt;
  zz: string;
  Kontakte: array of TKontakt;
  i: integer;
  pfad: textfile;
  pfad_string: string;

implementation

uses Unit3;


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
        i := 0;

        SG_KONTAKTE.Cells[0, 0] := 'Nachname';
        SG_KONTAKTE.Cells[1, 0] := 'Vorname';

        if (SG_KONTAKTE.Cells[0, 1] = '') AND (SG_KONTAKTE.Cells[1, 1] = '') then
                begin
                LB_SUCHEN.Enabled := false;
                ED_SUCHEN.Enabled := false;
                end;

     try
        AssignFile(pfad, 'C:\pfad.txt');
        Reset(pfad);
        ReadLn(pfad, pfad_string);
        CloseFile(pfad);

        AssignFile(datei, pfad_string);
        Reset(datei);
        While (eof(datei)=false) do
                begin
                i := i + 1;
                SetLength(Kontakte, i);
                Read(datei, Kontakte[i]);
                end;
        {for i:=0 to High(kontakte) do
                begin
                SG_KONTAKTE.Cells[0, i+1] := Kontakte[i].Nachname;
                SG_KONTAKTE.Cells[1, i+1] := Kontakte[i].Vorname;
                end;}
        CloseFile(datei);
     except
        MessageDlg('Keine Kontakte gefunden', mtError, [mbOK], 0);
     end;
end;


procedure TForm1.BT_NEUClick(Sender: TObject);
begin
        Form3.Visible := True;
end;

procedure TForm1.SG_KONTAKTESelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
        for i:=0 to High(Kontakte) do
                begin
                if Kontakte[i].Vorname OR Kontakte[i].Nachname =
end;

end.
Code:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
        TKontakt = record
                Vorname: String[50];
                Nachname: String[50];
                Geb_datum: String[10];
                Telefon_p: String[20];
                Telefon_d: String[20];
                Mobil: String[15];
                EMail: String[50];
        end;


implementation

end.
Code:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit1, Unit2;

type
  TForm3 = class(TForm)
    GB_DETAILS: TGroupBox;
    LB_VORNAME: TLabel;
    LB_NACHNAME: TLabel;
    LB_GEB: TLabel;
    LB_TELE_PRIV: TLabel;
    LB_TELE_DIENST: TLabel;
    LB_HANDY: TLabel;
    LB_EMAIL: TLabel;
    ED_VORNAME_NEU: TEdit;
    ED_NACHNAME_NEU: TEdit;
    ED_GEB_NEU: TEdit;
    ED_TELE_PRIV_NEU: TEdit;
    ED_TELE_DIENST_NEU: TEdit;
    ED_HANDY_NEU: TEdit;
    ED_EMAIL_NEU: TEdit;
    BT_SPEICHERN_NEU: TButton;
    BT_SCHLIESSEN_NEU: TButton;
    SD_SPEICHERN: TSaveDialog;
    procedure BT_SCHLIESSEN_NEUClick(Sender: TObject);
    procedure BT_SPEICHERN_NEUClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation


{$R *.dfm}

procedure TForm3.BT_SCHLIESSEN_NEUClick(Sender: TObject);
begin
        Close;
end;

procedure TForm3.BT_SPEICHERN_NEUClick(Sender: TObject);
var    i: integer;
begin
        if SD_SPEICHERN.Execute then
                begin
                  SetLength(Kontakte, (length(kontakte)+1));
                  Kontakte[High(Kontakte)].Vorname := ED_VORNAME_NEU.Text;
                  Kontakte[High(Kontakte)].Nachname := ED_NACHNAME_NEU.Text;
                  Kontakte[High(Kontakte)].Geb_datum := ED_GEB_NEU.Text;
                  Kontakte[High(Kontakte)].Telefon_p := ED_TELE_PRIV_NEU.Text;
                  Kontakte[High(Kontakte)].Telefon_d := ED_TELE_DIENST_NEU.Text;
                  Kontakte[High(Kontakte)].Mobil := ED_HANDY_NEU.Text;
                  Kontakte[High(Kontakte)].EMail := ED_EMAIL_NEU.Text;
                  try
                        AssignFile(datei, SD_SPEICHERN.FileName);
                        ReWrite(datei);
                        for i:=0 to High(Kontakte) do
                                begin
                                Write(datei, Kontakte[i]);
                                end;
                        AssignFile(pfad,'C:\pfad.txt' );
                        ReWrite(pfad);
                        WriteLn(pfad, SD_SPEICHERN.FileName);
                        CloseFile(pfad);
                  except
                        MessageDlg('Fehler beim schreiben der Datei', mtError, [mbOK], 0);
                  end;
                  end;


end;

end.
Vielen Dank schonmal

quendolineDD 3. Apr 2009 17:06

Re: Adressbuch, aber...
 
Erstmal etwas anderes
Delphi-Quellcode:
        While (eof(datei)=false) do
                begin
                i := i + 1;
                SetLength(Kontakte, i);
                Read(datei, Kontakte[i]);
                end;
Du erhöhst i um jeweils 1. Damit schreibst du beginnend für i=1 in Kontakte[1] den ersten Wert.
Außerdem würde ich dir gerne die Methoden LoadFromFile von TStringList (bzw. TStrings) näher bringen, welche wesentlich effizienter und übersichtlicher arbeiten :)
Dann verstehe ich nicht, was in der pfad.txt stehen soll? Wenn es der Pfad zur Anwendung ist solltest du dir mal ParamStr(0) anschauen, welchen den Anwendungspfad enthält.

Wessiiii 3. Apr 2009 17:13

Re: Adressbuch, aber...
 
Stimmt, i müsste ich erst nach dem eintragen ins Array erhöhen.
oder einfach Kontakte[i-1]

Ich solls mit einer typisierten Datei machen...

Nicht der Anwendungspfad, sondern der Pfad von der "Kontakte.kon".
Damit beim Programmstart automatisch die Datei geöffnet wird.
Da ich das ganze über den SD_SPEICHERN.Filename Parameter realisieren will, muss ich den Pfad ja irgendwo Speichern, um beim nächsten Start wieder draufzugreifen zu können.
Man soll den Speicherort der Kontake.kon Datei ja auswählen können, sonst könnte ich sie ja aeinfach im Pfad der Anwendung speichern.

EDIT: Jetzt funktionierts, nachdem ich Kontakte[i-1] gemacht hab ^^
danke :D

Next Edit:

Außerdem würde ich gerne, wenn man im SG eine Zelle auswählt, dass etwas passiert (siehe TForm1.SG_KONTAKTESelectCell). Dazu möchte ich den Inhalt den Arrays "Kontakte[i]" mit dem der Zelle vergleichen, wie geht das?

Und kann man überprüfen durch welchen button ein Formular bzw eine Procedure aufgerufen wurde bzw wird?

Will halt ne Fallunterscheidung machen wenn von button 1 dann so bei Button 2 so

Update:

habs jetzt so probiert, aber er kreidet mir an, dass man AND hier nicht benutzen kann

Delphi-Quellcode:
procedure TForm1.SG_KONTAKTESelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
        for i:=0 to High(Kontakte) do
                begin
                if (Kontakte[i].Vorname AND Kontakte[i].Nachname) =
                   (SG_KONTAKTE.Cells[0, ARow] AND SG_KONTAKTE.Cells[1, ARow]) then
                        begin
                                ED_VORNAME.Text := Kontakte[i].Vorname;
                                ED_NACHNAME.Text := Kontakte[i].Nachname;
                                ED_GEB.Text := Kontakte[i].Geb_datum;
                                ED_TELE_PRIV.Text := Kontakte[i].Telefon_p;
                                ED_TELE_DIENST.Text := Kontakte[i].Telefon_d;
                                ED_HANDY.Text := Kontakte[i].Mobil;
                                ED_EMAIL.Text := Kontakte[i].EMail;
                        end;

        end;
end;

roga 3. Apr 2009 21:25

Re: Adressbuch, aber...
 
Hallo,

wenn Du jedem Datensatz eine eindeutige ID-Nummer zuweist, ist der Zugriff auf die Daten einfacher.

Delphi-Quellcode:
  TKontakt = record
    ID: String[6];
    Vorname: String[50];
    Nachname: String[50];
    Geb_datum: String[10];
    Telefon_p: String[20];
    Telefon_d: String[20];
    Mobil: String[15];
    EMail: String[50];
  end;
Du musst natürlich beim Hinzufügen neuer Daten sicher stellen, dass die neue ID noch nicht vergeben ist. (Einmal StreamFile durchlaufen und vergleichen)

Erste ID-Nr = 000001 usw.

Die ID's würde ich dann im ListView als Caption übernehmen.

Gruß RoGa

Satty67 3. Apr 2009 21:39

Re: Adressbuch, aber...
 
Zitat:

Zitat von Wessiiii
habs jetzt so probiert, aber er kreidet mir an, dass man AND hier nicht benutzen kann

Delphi-Quellcode:
if (Kontakte[i].Vorname AND ( Kontakte[i].Nachname) =
(SG_KONTAKTE.Cells[0, ARow] ) AND (SG_KONTAKTE.Cells[1, ARow] = ?????) ) then
Damit der Compiler weis, das es eine Bedingung und keine Operation ist, die einzelnen Bedingungen nochmal Klammern, wenn Sie durch einen Operator/Vergleich erst Ihren boolschen Wert bekommen.

Wobei ich glaube, Du verwendest die Operatoren falsch:
Delphi-Quellcode:
if (Kontakte[i].Vorname + Kontakte[i].Nachname) = (SG_KONTAKTE.Cells[0, ARow] + SG_KONTAKTE.Cells[1, ARow]) then
oder
Delphi-Quellcode:
if (Kontakte[i].Vorname = SG_KONTAKTE.Cells[0, ARow]) AND (Kontakte[i].Nachname) = SG_KONTAKTE.Cells[1, ARow]) then

Wessiiii 3. Apr 2009 23:26

Re: Adressbuch, aber...
 
Zitat:

Zitat von roga
Hallo,

wenn Du jedem Datensatz eine eindeutige ID-Nummer zuweist, ist der Zugriff auf die Daten einfacher.

Delphi-Quellcode:
  TKontakt = record
    ID: String[6];
    Vorname: String[50];
    Nachname: String[50];
    Geb_datum: String[10];
    Telefon_p: String[20];
    Telefon_d: String[20];
    Mobil: String[15];
    EMail: String[50];
  end;
Du musst natürlich beim Hinzufügen neuer Daten sicher stellen, dass die neue ID noch nicht vergeben ist. (Einmal StreamFile durchlaufen und vergleichen)

Erste ID-Nr = 000001 usw.

Die ID's würde ich dann im ListView als Caption übernehmen.

Gruß RoGa

Kannst du das ein bisschen genauer erklären?
Was ist ein StreamFile?

Danke Satty67 die Lösung

Delphi-Quellcode:
if (Kontakte[i].Vorname = SG_KONTAKTE.Cells[0, ARow]) AND (Kontakte[i].Nachname) = SG_KONTAKTE.Cells[1, ARow]) then
hat gefunzt.

Hat noch jemand ne Antowort dazu?

Kann man überprüfen durch welchen button ein Formular bzw eine Procedure aufgerufen wurde bzw wird?

Will halt ne Fallunterscheidung machen wenn von button 1 dann so bei Button 2 so

jaenicke 3. Apr 2009 23:37

Re: Adressbuch, aber...
 
Dafür ist der Parameter Sender da, der bei Ereignissen immer mit übergeben wird. Du kannst entweder direkt mit einem bestimmten Button vergleichen oder auf TButton z.B. casten und die Eigenschaften des Buttons abfragen.
Delphi-Quellcode:
procedure TFormX.ButtonXClick(Sender: TObject);
begin
  if Sender = Button1 then
    ...
Delphi-Quellcode:
if Sender is TButton then
  ShowMessage(TButton(Sender).Caption);

Wessiiii 3. Apr 2009 23:49

Re: Adressbuch, aber...
 
Scheint zu funzen, dankeee

Leider doch nicht ^^
Wenn ich jetzt auf Speichern klicke, macht er einfach NIX

Delphi-Quellcode:
procedure TForm3.BT_SPEICHERN_NEUClick(Sender: TObject);
var    i: integer;
begin
        if sender = Form1.BT_NEU then
                begin
                if SD_SPEICHERN.Execute then
                        begin
                        SetLength(Kontakte, (length(kontakte)+1));
                        Kontakte[High(Kontakte)].Vorname := ED_VORNAME_NEU.Text;
                        Kontakte[High(Kontakte)].Nachname := ED_NACHNAME_NEU.Text;
                        Kontakte[High(Kontakte)].Geb_datum := ED_GEB_NEU.Text;
                        Kontakte[High(Kontakte)].Telefon_p := ED_TELE_PRIV_NEU.Text;
                        Kontakte[High(Kontakte)].Telefon_d := ED_TELE_DIENST_NEU.Text;
                        Kontakte[High(Kontakte)].Mobil := ED_HANDY_NEU.Text;
                        Kontakte[High(Kontakte)].EMail := ED_EMAIL_NEU.Text;
                      try
                        AssignFile(datei, SD_SPEICHERN.FileName);
                        ReWrite(datei);
                        for i:=0 to High(Kontakte) do
                                begin
                                Write(datei, Kontakte[i]);
                                end;
                        AssignFile(pfad,'C:\pfad.txt' );
                        ReWrite(pfad);
                        WriteLn(pfad, SD_SPEICHERN.FileName);
                        CloseFile(pfad);
                       except
                        MessageDlg('Fehler beim schreiben der Datei', mtError, [mbOK], 0);
                       end;
                end;
        end;

        if sender = Form1.BT_BEARBEITEN then
                begin
                if SD_SPEICHERN.Execute then
                        begin
                        Kontakte[Unit1.selected_row].Vorname := ED_VORNAME_NEU.Text;
                        Kontakte[Unit1.selected_row].Nachname := ED_NACHNAME_NEU.Text;
                        Kontakte[Unit1.selected_row].Geb_datum := ED_GEB_NEU.Text;
                        Kontakte[Unit1.selected_row].Telefon_p := ED_TELE_PRIV_NEU.Text;
                        Kontakte[Unit1.selected_row].Telefon_d := ED_TELE_DIENST_NEU.Text;
                        Kontakte[Unit1.selected_row].Mobil := ED_HANDY_NEU.Text;
                        Kontakte[Unit1.selected_row].EMail := ED_EMAIL_NEU.Text;
                        try
                        AssignFile(datei, SD_SPEICHERN.FileName);
                        ReWrite(datei);
                        for i:=0 to High(Kontakte) do
                                begin
                                Write(datei, Kontakte[i]);
                                end;
                        AssignFile(pfad,'C:\pfad.txt' );
                        ReWrite(pfad);
                        WriteLn(pfad, SD_SPEICHERN.FileName);
                        CloseFile(pfad);
                       except
                        MessageDlg('Fehler beim schreiben der Datei', mtError, [mbOK], 0);
                       end;
                end;
        end;



end;
Nochn Problem:
Ich will ne suche realisieren, die direkt bei der eingabe schon die unpassenden ergebnisse rausfiltert.
Ich hab mir das so vorgestellt, das ich mit ner for schleife von 1 (wegen fixedrow) bis rowcount durchgeh und jeden Eintrag auf eine evtl vrhandene Gleichheit überprüfe. Wenn er in der einen Row keine übereinstimmung gefunden hat soll er sie einfach löschen
Bei Backspace soll er halt wieder entsprechende Einträge hinzufügen

Habs grade probier aber ich schaffs einfach nicht :/

Mittlerweile brennen auch meine Augen ganz schön, weil ich seit ungf. 14 Uhr an dem Ding sitz.

Helft mir bitte!!!

Matze 4. Apr 2009 06:57

Re: Adressbuch, aber...
 
Zitat:

Zitat von Wessiiii
ich muss für eine Bewerbung ein Adressbuch entwickeln.

Dann zeige uns mal deinen jetzigen Ansatz für diese Such-Routine. Überlege warum es nicht geht und wie man es verbessern kann.
Komplett wird dir das keiner lösen. Denn wenn du das für eine Bewerbung brauchst, dann soll das deine eigene Leistung wiederspiegeln und nicht unsere.

Wessiiii 4. Apr 2009 13:25

Re: Adressbuch, aber...
 
Delphi-Quellcode:
procedure TForm1.ED_SUCHENChange(Sender: TObject);
begin
        for i:=1 to SG_KONTAKTE.RowCount do
                begin
                if (ED_SUCHEN.Text = SG_KONTAKTE.Cells[0, i]) OR
                   (ED_SUCHEN.Text = SG_KONTAKTE.Cells[1, i]) then
                        begin
                        //row stehen lassen, also nix machen
                        end
                        else
                        //Row löschen
                        end;
                end;
end;
Soweit hab ichs. Aber ich kenn keinen Befehl mit dem man eine Row löschen kann.
Und leider hab ich noch keine Ahnung wie man das ganze Rückwärts, sprich bei Backspace realisieren könnte.
Oder kennt jemand vllt noch eine andere Lösung?

ich hab mir auch überlegt, einfach das Ereignis "ON KEY PRESS" zu nehmen und halt jeden Buchstaben einzelnd abzufragen, ist aber eher nicht so toll glaub ich. Und auch hier hab ich das Problem, dass ich nicht weiss wie ich bei einem Backspace reagieren soll.

roga 4. Apr 2009 13:43

Re: Adressbuch, aber...
 
Als was möchtest Du dich denn bewerben?

Die einfachsten Regeln sollte man aber schon beachten.

Delphi-Quellcode:
for i:=1 to SG_KONTAKTE.RowCount -1 do
Kreatives Denken, zuerst nach eigenen Lösungen suchen und vor allem auch mal die Hilfe studieren und die Suche in Foren nutzen. Ansonsten schließe ich mich der Meinung von Matze an.

Wessiiii 4. Apr 2009 13:50

Re: Adressbuch, aber...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ausbildung als Anwendungsentwickler

Dass mit dem -1 ist mir auch eben aufgefallen ^^

Die Hilfe hat mich bei meinem Problem auch nicht wirklich weiter gebracht.
Bei Google hab ich nur was von nem "CLass Crack" gelesen, was mir auch nicht wirklich geholfen hat.

Hab mal alle datein als Anhang hinzugefügt. Immer wenn ich auf "X" gehe (beenden) kommt ein Fehler, aber ich weiss nicht so recht warum, war eben noch nicht oO

quendolineDD 4. Apr 2009 14:43

Re: Adressbuch, aber...
 
Weiterhin wäre es auch hilfreich, den "Fehler" bei seinem Namen und Erscheinungsbild zu benennen. Es ist immer äußerst hilfreich und auch meist aufgrund des Fehlernamens ersichtlich, woraus dieser resultiert.

Edit:
Wenn man im "Kontakt Hinzufügen"-Dialog auf abbrechen drückt, wird trotzdem der RowCount des Stringgrids erhöht.
Edit2:
Und die Variante mit erst den Pfad aus einer Datei holen finde ich auch nicht schick. Zumal es die Datei bei mir nicht gibt und deswegen andauernd eine Exception kommt.
Edit3:
Bei mir kommt kein Fehler. Will jetzt aber ohne näheres zu wissen auch nicht weiter schauen.

Wessiiii 4. Apr 2009 15:19

Re: Adressbuch, aber...
 
Also als Fehler gibt er mir:

EAccessViolation bei 00001C5F und
RuntimeError 216 at 00403A32 zurück.

Zu Edit 1:
Ja, aber ich vertshe nicht warum, denn es steht ja garnicht RowCounnt + 1 in der Button Prozedur.

Zu Edit2:
Einen anderen Weg kenn ich nicht ^^

Zu Edit3:
s. o.

quendolineDD 4. Apr 2009 15:28

Re: Adressbuch, aber...
 
Doch. Und zwar schreibst du im OnClose-Event der Unit3 folgendes
Delphi-Quellcode:
Form1.SG_KONTAKTE.RowCount := Form1.SG_KONTAKTE.RowCount + 1;

Wessiiii 4. Apr 2009 15:32

Re: Adressbuch, aber...
 
Stimmt, hab ich überlesen...

Wessiiii 6. Apr 2009 17:08

Re: Adressbuch, aber...
 
Nach 2 Tagen kreativ Pause hab ich einen neuen Ansatz für die Suche:

Delphi-Quellcode:
procedure TForm1.ED_SUCHENChange(Sender: TObject);
begin
        for i:=1 to SG_KONTAKTE.RowCount+1 do
                begin
                SG_KONTAKTE.Cells[0, i] := '';
                SG_KONTAKTE.Cells[1, i] := '';
                end;

        for i:=0 to high(kontakte) do
                begin
                if (ED_SUCHEN.Text = kontakte[i].Vorname[length(ED_SUCHEN.Text)]) OR
                   (ED_SUCHEN.Text = kontakte[i].Nachname[length(ED_SUCHEN.Text)]) then
                        begin
                        ff := ff + 1;
                        SG_KONTAKTE.Cells[0, ff] := Kontakte[i].Nachname;
                        SG_KONTAKTE.Cells[1, ff] := Kontakte[i].Vorname;
                        end
                        else
                        end;
                if i=high(kontakte) then
                        begin
                        MessageDlg('Keine Übereinstimmung gefunden', mtError, [mbOK], 0);
                        end;
                end;


    [color=#ff001f]          if ED_SUCHEN.Text = '' then[/color]
                        begin
                        for i:=0 to High(kontakte) do
                                begin
                                Form1.SG_KONTAKTE.Cells[0, i+1] := Kontakte[i].Nachname;
                                Form1.SG_KONTAKTE.Cells[1, i+1] := Kontakte[i].Vorname;
                        end;
Klappt soweit eigentlich. eigentlich.
Denn wenn man mehr als ein Zeichen im Edit Feld eingibt, löscht er einfach alles ^^

Bei der rot makierten IF Bedingung, sagt er mir immer "[Fehler] Unit1.pas(208): Deklaration erwartet, aber 'IF' gefunden".
Versteh aber nicht ganz warum oO

quendolineDD 6. Apr 2009 17:11

Re: Adressbuch, aber...
 
Welche Zeile ist denn bei dir im Quellcode Zeile 208?
Schau dir doch einfach mal die Zeilen davor an. Meist liegt dort der Fehler.

Wessiiii 6. Apr 2009 17:33

Re: Adressbuch, aber...
 
Zeile 208 is:

if ED_SUCHEN.Text = '' then

davor ist end;

jaenicke 6. Apr 2009 18:15

Re: Adressbuch, aber...
 
Du hast da beiden ifs jedesmal ein end zu viel. ;-) Ich rücke einmal richtig ein:
Delphi-Quellcode:
procedure TForm1.ED_SUCHENChange(Sender: TObject);
begin
  for i:=1 to SG_KONTAKTE.RowCount+1 do
  begin
    SG_KONTAKTE.Cells[0, i] := '';
    SG_KONTAKTE.Cells[1, i] := '';
  end;

  for i:=0 to high(kontakte) do
  begin
    if (ED_SUCHEN.Text = kontakte[i].Vorname[length(ED_SUCHEN.Text)]) OR
      (ED_SUCHEN.Text = kontakte[i].Nachname[length(ED_SUCHEN.Text)]) then
    begin
      ff := ff + 1;
      SG_KONTAKTE.Cells[0, ff] := Kontakte[i].Nachname;
      SG_KONTAKTE.Cells[1, ff] := Kontakte[i].Vorname;
    end
    else // Wofür?
  end; // Wofür?
  if i=high(kontakte) then
  begin
    MessageDlg('Keine Übereinstimmung gefunden', mtError, [mbOK], 0);
  end;
end;
// Hier ist die Prozedur zu Ende!

if ED_SUCHEN.Text = '' then
begin
  for i:=0 to High(kontakte) do
  begin
    Form1.SG_KONTAKTE.Cells[0, i+1] := Kontakte[i].Nachname;
    Form1.SG_KONTAKTE.Cells[1, i+1] := Kontakte[i].Vorname;
  end;

Wessiiii 6. Apr 2009 18:32

Re: Adressbuch, aber...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ah, danke, 1 END weg, 2 dabei ^^

Hiermal ein Update, denn die SuFu tut ihren Dienst nicht wie sie soll, wo liegt der Fehler?

quendolineDD 6. Apr 2009 18:46

Re: Adressbuch, aber...
 
Geh doch einfach Schritt für Schritt mit F7/F8 selber durch. Setz dir einen Breakpoint und schau dir die Werte der Variablen an. Ein wenig Eigeninitiative kann man schon verlangen.

Wessiiii 6. Apr 2009 19:16

Re: Adressbuch, aber...
 
Hab ich grade gemacht, Ergebnis:

Wenn ich ein Buchstabe ins Edit feld tippe, funktioniert es noch, bei >1 jedoch nicht mehr.
Wenn ich einen Buchstaben eintippe, der nicht gefunden werden kann, zeigt er aber auch nicht den MessageDlg an.

jaenicke 6. Apr 2009 20:30

Re: Adressbuch, aber...
 
Zitat:

Zitat von Wessiiii
Hab ich grade gemacht, Ergebnis:

Das ist das Ergebnis vom Ausprobieren des Programms, die Frage ist was beim Debuggen herausgekommen ist, wenn du das doch gemacht hast...

Wessiiii 6. Apr 2009 20:33

Re: Adressbuch, aber...
 
mhh, sowas versteh ich jetzt unter debuggen ^^
so hat es mir zumindest mein lehrer gezeigt

jaenicke 6. Apr 2009 20:35

Re: Adressbuch, aber...
 
Das:
Zitat:

Zitat von quendolineDD
Geh doch einfach Schritt für Schritt mit F7/F8 selber durch. Setz dir einen Breakpoint und schau dir die Werte der Variablen an. Ein wenig Eigeninitiative kann man schon verlangen.

Was mir bei deinem Programm auffällt:
Du hast ja überall nur globale Variablen, sogar für deine for-Schleifen, obwohl Delphi beim Kompilieren da ja x Warnungen bringen müsste. :shock:
Dass du da den Überblick verlierst ist kein Wunder, warum wunderst du dich da drüber...

Wenn Delphi Warnungen anzeigt, sollte man diese auch beachten...

Wessiiii 6. Apr 2009 20:44

Re: Adressbuch, aber...
 
i erstell ich immer globa, weil ich sie bei fast jeder prozedur, funktion brauch ^^
die anderen, fast auch immer

Das schadet doch auch nicht, oder?

quendolineDD 6. Apr 2009 20:54

Re: Adressbuch, aber...
 
Es ist einfach nicht gut, wenn eine Zählvariable einen globalen Scope hat. Die könnte ja überall geändert werden. Aus diesem Grund kommt da auch eine Warnung von Delphi.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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