Autor Beitrag
DaKirsche
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Mo 08.10.07 13:59 
Hallo Community,
ich habe ein kleines Problem mit TStringList...

...ich habe gerade ein Programm, welches in ein Stringlist.Commatext einen "Datensatz" speichern soll.
Das klappt ja auch ohne Probleme...
Jedoch will ich prüfen, ob ein entsprechender Eintrag bereits in der Datei vorhanden ist.

Dazu prüfe ich erstmal die Anzahl der Felder. Die sollten 3 sein --> Sonst: MEldung "Fehlerhafter Datensatz"
Dann prüft das Programm, ob die Einträge mit den Daten in den Editfeldern übereinstimmt --> Ja : Meldung "Doppelter Eintrag".

Hier mal der Code:
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:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
procedure Tfm_newpers.SpeedButton2Click(Sender: TObject);
var sl,sl2,sl3: TStringList;
    a,b: Integer;
    Item,aindex,iindex: Integer;
    Overriding, Exists: Boolean;
begin
  sl:= TStringList.Create;
  sl2:=TStringList.Create;
  Overriding := False;
  Exists:= False;
  Item := -1;
  aindex:=0;
  try
    case TabControl1.TabIndex of
      0 :      //Einheiten anlegen
      begin
      //Alle Felder befüllt?
        if not (Edit1.Text = ''then 
        begin
          if not (Edit2.Text = ''then 
          begin
          //Datenbankdatei existent?
            if FileExists('.\Data\db_einheiten.mmb'then
              //Laden der Datei
              sl.LoadFromFile('.\Data\db_einheiten.mmb');
              //Einträge bereits vorhanden?
            if sl.Count > 0 then
            begin
              //Schleife [Jeder Eintrag wird geprüft]
              for a := 0 to sl.Count - 1 do
              begin
                //Einlesen in sl2
                sl2.Commatext := sl.Strings[a];
                //Auf Anzahl der Items checken
                if sl2.Count = 3 then
                begin
                  if strtoint(sl2.Strings[0]) > aindex then
                    aindex:=strtoint(sl2.Strings[0]);
                  //Prüfe Datenbankinhalte auf Redundanzen
                  if (StrLower(PChar(DeCrypt(sl2.Strings[1]))) = StrLower(PChar(Edit1.Text))) AND (StrLower(PChar(DeCrypt(sl2.Strings[2]))) = StrLower(PChar(Edit2.Text))) then
                  begin
                    Exists := True;
                    case ShowMessageDlgEx('Es wurde ein Eintrag in der Datenbank gefunden, der mit den angegebenen übereinstimmt.'+sLineBreak+sLineBreak+'Soll der gefundene Eintrag überschrieben werden?','Doppelter Eintrag entdeckt!',101,mb_yesno) of
                      IDYES :
                      begin
                        Item:=a;
                        Overriding:= True;
                      end;
                    end;
                  end
                  else
                  if (StrLower(PChar(DeCrypt(sl2.Strings[1]))) = StrLower(PChar(Edit1.Text))) then 
                  begin
                    Exists := True;
                    case ShowMessageDlgEx('Ein Eintrag mit derselben Bezeichnung wurde gefunden!'+sLineBreak+sLineBreak+'Soll der gefundene Eintrag überschrieben werden?','Doppelter Eintrag entdeckt!',101,mb_yesno) of
                      IDYES :
                      begin
                        Item:= a;
                        Overriding:= True;
                      end;
                    end ;
                  end 
                  else
                  if (StrLower(PChar(DeCrypt(sl2.Strings[2]))) = StrLower(PChar(Edit2.Text))) then 
                  begin
                    Exists := True;
                    case ShowMessageDlgEx('Ein Eintrag mit derselben HAL-Nummer wurde gefunden!'+sLineBreak+sLineBreak+'Soll der gefundene Eintrag überschrieben werden?','Doppelter Eintrag entdeckt!',101,mb_yesno) of
                      IDYES :
                      begin
                        item:= a;
                        Overriding:= True;
                      end;
                    end;
                  end;

                end
                else 
                begin
                  case ShowMessageDlgEx('Bei einer Überprüfung der Datenbank wurde ein fehlerhafter Datensatz entdeckt.'+sLineBreak+sLineBreak+'Soll dieser Datensatz gelöscht werden?','Ungültiger Datensatz',101,mb_yesno) of
                    IDYES:
                      sl.Delete(a);
                  end;
                end;
              end;
            end;
            //Datensatz speichern
            Showmessage(BoolToStr(Overriding) + ' # ' + Booltostr(Exists) + ' + ' + Inttostr(Item));
            if (Overriding) AND (Exists) AND (Item >= 0then
            begin
              //Eintrag ersetzen
              sl3 := TStringList.Create;
              try
                sl3.add(inttostr(iindex));
                sl3.add(Crypt(edit1.text));
                sl3.Add(Crypt(edit2.text));
                sl.Strings[Item]:=(sl3.Commatext);
                ShowMessageDlgEx('Der vorhandene Eintrag wurde mit den neuen Daten ersetzt!','Eintrag ersetzt',101,mb_OK);
              finally
                sl3.free;
              end;
            end
            else
            if not (Exists) then
            begin
            //Neuer Eintrag
              sl3 := TStringList.Create;
              try
                sl3.add(inttostr(aindex + 1));
                sl3.add(Crypt(edit1.text));
                sl3.Add(Crypt(edit2.text));
                sl.Add(sl3.Commatext);
                ShowMessageDlgEx('Der Eintrag wurde gespeichert!','Eintrag gespeichert',101,mb_OK);
              finally
                sl3.Free;
              end;
            end
            else 
              ShowMessageDlgEx('Es ist ein Problem beim Speichern aufgetreten. Bitte versuchen Sie es erneut!','Eintrag nicht gespeichert',101,mb_OK);
            sl.SaveToFile('.\Data\db_einheiten.mmb');
            Edit1.Text := '';
            Edit2.Text := '';
          end 
          else 
          ShowMessageDlgEx('Das Feld "HAL Nummer" muss ausgefüllt sein!','Fehlerhafte Angaben',101,mb_OK);
        end 
        else 
        ShowMessageDlgEx('Das Feld "Name der Einheit" muss ausgefüllt sein!','Fehlerhafte Angaben',101,mb_OK);
      end;
    end;
    finally
    sl.Free;
    sl2.free;
  end;
end;


Die Ausgaben von
ausblenden Delphi-Quelltext
1:
ShowMessage(StrLower(PChar(DeCrypt(sl2.Strings[1]))) + StrLower(PChar(Edit1.Text))) + (StrLower(PChar(DeCrypt(sl2.Strings[2]))) + StrLower(PChar(Edit2.Text)))					

ergibt 2 identische Datensätze. Trotzdem geht er nicht in die Schleife (siehe Highlight)...

kann mir bitte jemand helfen?
Ich kann den Fehler nicht finden und suche da schon ewig dran...

MFG
DaKirsche


Moderiert von user profile iconjasocul: Topic aus Dateizugriff verschoben am Di 09.10.2007 um 08:03

_________________
Die simpelsten Fehler sind meist die Schwersten...
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 09.10.07 00:07 
Moin!

Da es Teil der betreffenden Bedingung ist: zeig doch mal den Code von DeCrypt(). :nixweiss:

cu
Narses

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

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Di 09.10.07 07:34 
Nagut, dann mal die "Crypt und DeCrypt" Funktionen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function Crypt(aString: String):String;
var I:Integer;
begin
Result:='';
 for I := Length(aString) downto 1 do
    Result := Result + char(14 Xor Ord(aString[I]));

end;

function DeCrypt(aString: String):String;
var I:Integer;
begin
Result:='';
 for I := Length(aString) downto 1 do
    Result := Result + char(14 Xor Ord(aString[I]));
end;


Sind nur dazu, dass man nicht auf Anhieb die Daten aus der Datei lesen kann...

Aber er geht auch dann nicht in die Schleife, wenn er folgendes hat:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function Crypt(aString: String):String;
begin
Result:=aString;
end;

function DeCrypt(aString: String):String;
begin
Result:=aString;
end;


So gesehen liegt das denke ich auch nicht daran...aber wer weiss;)

Ich habe auch versucht die zu speichernden Daten ebenfalls in eine Stringlist zu laden, durch die Funktion "Crypt" zu jagen und beim Vergleich beide zu DeCrypten, jedoch ebenfalls ohne Erfolg...

MFG
DaKirsche

---

Naja...jetzt habe ich einen Weg gefunden, bei dem er mir indie Schleife geht:

Ich überprüfe die Inhalte nun via AnsiCompareText(var string1: String;var string2: String):Integer; und es klappt...

Trotzdem danke...

Moderiert von user profile iconNarses: Beiträge zusammengefasst.

_________________
Die simpelsten Fehler sind meist die Schwersten...