Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit if-Bedingung (https://www.delphipraxis.net/64416-problem-mit-if-bedingung.html)

mlspider 3. Mär 2006 11:40


Problem mit if-Bedingung
 
Hallo,

entweder habe ich einen Denkfehler, oder die gesamte Bedingung taugt nichts:

Delphi-Quellcode:
procedure TRechnung.Button3Click(Sender: TObject);
begin
 Table1.Next;

 DateTimePicker2.Date:=StrToDateTime(DBText4.Caption);
 DateTimePicker3.Date:=StrToDateTime(DBText5.Caption);
 DateTimePicker4.Date:=StrToDateTime(DBEdit22.Text);
 DateTimePicker5.Date:=StrToDateTime(DBEdit23.Text);
 DateTimePicker6.Date:=StrToDateTime(DBEdit24.Text);
 Rechnung.Label21.Caption:=FormatDateTime('dd.mm.yyyy',date+StrToInt(Rechnung.DBText6.Caption));
 spSkinButton1.Enabled := True;
 spSkinButton2.Enabled := True;
 if DateTimePicker1.Date <= DateTimePicker3.Date then begin
 Table1.Edit;
 DBEdit17.Text:='offen';
 DBText5.Font.Color:=clYellow;
 Button1Click(nil);
 end else begin
 Table1.Edit;
 Button1Click(nil);
 end;
 if DateTimePicker1.Date >= DateTimePicker3.Date then begin
 Table1.Edit;
 DBEdit17.Text:='1. Mahnstufe';
 DBText5.Font.Color:=clRed;
 Button1Click(nil);
 end else begin
 Table1.Edit;
 Button1Click(nil);
 end;
 if DateTimePicker1.Date >= DateTimePicker4.Date then begin
 Table1.Edit;
 DBEdit17.Text:='2. Mahnstufe';
 DBText5.Font.Color:=clRed;
 Button1Click(nil);
 end else begin
 Table1.Edit;
 Button1Click(nil);
 end;
 if DateTimePicker1.Date >= DateTimePicker5.Date then begin
 Table1.Edit;
 DBEdit17.Text:='3. Mahnstufe';
 DBText5.Font.Color:=clRed;
 Button1Click(nil);
 end else begin
 Table1.Edit;
 Button1Click(nil);
 end;
 if DateTimePicker1.Date >= DateTimePicker6.Date then begin
 Table1.Edit;
 DBEdit17.Text:='Klage';
 DBText5.Font.Color:=clRed;
 Button1Click(nil);
 end else begin
 Table1.Edit;
 Button1Click(nil);
 end;
 if vergleicheStringsN(Label27.Caption, DBEdit21.Text, 50)=True then begin
 Table1.Edit;
 DBEdit17.Text:='Bezahlt';
 DBText5.Font.Color:=clYellow;
 Button1Click(nil);
 end else begin
 Table1.Edit;
 Button1Click(nil);
 end;
 if Table1.EOF then begin
 spSkinButton4Click(Self);
 spSkinButton17.Enabled:=True;
 Timer1.Enabled:=False;
end;
end;
Die vorletzte Bedingung wird nicht geprüft. Was läuft hier schief?

Klaus01 3. Mär 2006 11:49

Re: Problem mit if-Bedingung
 
So, habe das ganze mal etwas eingerückt und wenn Du jetzt noch sagst
was die procedure machen soll und mit welchen Werten sie aussteigt
dann kann man vielleicht auch besser helfen.

Grüße
Klaus

Delphi-Quellcode:
procedure TRechnung.Button3Click(Sender: TObject);
begin
Table1.Next;

DateTimePicker2.Date:=StrToDateTime(DBText4.Caption);
DateTimePicker3.Date:=StrToDateTime(DBText5.Caption);
DateTimePicker4.Date:=StrToDateTime(DBEdit22.Text);
DateTimePicker5.Date:=StrToDateTime(DBEdit23.Text);
DateTimePicker6.Date:=StrToDateTime(DBEdit24.Text);
Rechnung.Label21.Caption:=FormatDateTime('dd.mm.yyyy',date+StrToInt(Rechnung.DBText6.Caption));
spSkinButton1.Enabled := True;
spSkinButton2.Enabled := True;

if DateTimePicker1.Date <= DateTimePicker3.Date then
  begin
    Table1.Edit;
    DBEdit17.Text:='offen';
    DBText5.Font.Color:=clYellow;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
  end;

if DateTimePicker1.Date >= DateTimePicker3.Date then
  begin
    Table1.Edit;
    DBEdit17.Text:='1. Mahnstufe';
    DBText5.Font.Color:=clRed;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
end;

if DateTimePicker1.Date >= DateTimePicker4.Date then
  begin
    Table1.Edit;
    DBEdit17.Text:='2. Mahnstufe';
    DBText5.Font.Color:=clRed;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
  end;

if DateTimePicker1.Date >= DateTimePicker5.Date then
  begin
    Table1.Edit;
    DBEdit17.Text:='3. Mahnstufe';
    DBText5.Font.Color:=clRed;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
  end;

if DateTimePicker1.Date >= DateTimePicker6.Date then
  begin
    Table1.Edit;
    DBEdit17.Text:='Klage';
    DBText5.Font.Color:=clRed;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
  end;

if vergleicheStringsN(Label27.Caption, DBEdit21.Text, 50)=True then
  begin
    Table1.Edit;
    DBEdit17.Text:='Bezahlt';
    DBText5.Font.Color:=clYellow;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
  end;

if Table1.EOF then
  begin
    spSkinButton4Click(Self);
    spSkinButton17.Enabled:=True;
    Timer1.Enabled:=False;
  end;

end;

mlspider 3. Mär 2006 12:00

Re: Problem mit if-Bedingung
 
Erst mal danke für's einrücken. Die Bedingungen 1 bis 5 überprüfen anhand des heutigem Tagesdatum (DateTimePicker1) mit einem festgelegtem Datum (DateTimePicker2 - 6) ob das jeweilige festgelegte Datum überschritten worden sind und setzen den jeweiligen Status. Die Bedingung 6, die mein Problem darstellt, überprüft den jeweiligen Datensatz. Ich habe ein weiteres Label auf der Form zu liegen, dessen Caption "Bezahlt" hat. Steht in der Tabelle "Bezahlt" ist das Ergebnis True. Es müßte eigentlich nun vielmehr der Status des Datensatzes in der Tabelle auf Bezahlt gesetzt werden. Macht es aber nicht.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.

Klaus01 3. Mär 2006 12:09

Re: Problem mit if-Bedingung
 
Hallo Mario,

Delphi-Quellcode:
if vergleicheStringsN(Label27.Caption, DBEdit21.Text, 50){=True} then
  begin
    Table1.Edit;
    DBEdit17.Text:='Bezahlt';
    DBText5.Font.Color:=clYellow;
    Button1Click(nil);
  end
else
  begin
    Table1.Edit;
    Button1Click(nil);
  end;
hast Du mal einen Haltepunkt auf die if Anweisung gesetzt und bist mit F7
weitergegangen.

Gehst Du da in den then Zweig oder in den else Zweig.
Sind die Strings label27.caption und DBEdit21.text auch gleich?
Was macht vergleicheStringsN genau?

Grüße
Klaus

mlspider 3. Mär 2006 12:22

Re: Problem mit if-Bedingung
 
Die Strings label27.caption und DBEdit21.text sind, wenn die jeweilige Rechnung als bezahlt markiert wurde, gleich und sollte then ausführen. Bei Rechnungen die als nicht bezahlt markiert sind, sollte der else-Zweig ausgeführt werden. Zum vergleichen der beiden Strings verwende ich folgende Funktion:

Delphi-Quellcode:
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;

 var i: Word;
  function delLZ(s: string): string;
  var ss: string;
      i, j: Word;
  begin
   j:=0; ss:='';
   for i:=1 to Length(s) do
   begin
    if (s[i] <> ' ') and (s[i] <> '-') then
    begin
     Inc(j);
     ss:= ss + s[i]
    end;
    if j=n then Break
   end;
   Result := UpperCase(ss)
  end;

  begin
   if delLZ(s1)=delLZ(s2) then Result:=True else Result:=False;
  end;
  var flag:word;
Button1 hat folgende Prozedur:

Delphi-Quellcode:
procedure TRechnung.Button1Click(Sender: TObject);
begin
 Table1.Post;
 Table1.Refresh;
 Timer1.Enabled:=True;
end;
Timer1:

Delphi-Quellcode:
procedure TRechnung.Timer1Timer(Sender: TObject);
begin
 Timer1.Enabled:=False;
 if Table1.EOF then begin
 spSkinButton17.Enabled:=True;
 end else begin
 Button3Click(nil); //wieder zurück
end;
end;

Klaus01 3. Mär 2006 12:45

Re: Problem mit if-Bedingung
 
Delphi-Quellcode:
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;

var i: Word;

  function delLZ(s: string): string;
  var ss: string;
      i, j: Word;
  begin                         // hier auch einen Haltepunkt setzen
   j:=0; ss:='';
   for i:=1 to Length(s) do
   begin
    if (s[i] <> ' ') and (s[i] <> '-') then
    begin
     Inc(j);
     ss:= ss + s[i]
    end;
    if j=n then Break
   end;
   Result := UpperCase(ss)
  end;
 
begin   // hier Haltepunkt setzen und s1 und s2 abfragen
  if delLZ(s1)=delLZ(s2) then Result:=True else Result:=False;
end;


  var flag:word
;

Delphi-Quellcode:
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;

  function delLZ(s: string): string;
    begin
      s:=trim(s); // entfernt führende und folgende Leerzeichen

      while pos('-',s) <> 0 DO    // entfernt - aus dem String
        delete(s,pos('-',s),1);
     
     while pos(' ',s) <> 0 DO
       delete(s,pos(' ',s),1)   // entfernt Leerzeichen aus dem String;
     
     if length(s) >= n then
       result:=''
     else
       result:=uppercase(s);
    end;

begin
  if (s1 = '') and (s2 = '') then // abfangen wenn s1 und s2 leer sind
     result:=false
  else
    result:=(delLZ(s1)=delLZ(s2));
end;
Kannst Du bitte mal in Deiner Funktion einen Haltepunkt an der obigen Stelle setzen
und schauen wie s1 und s2 aussehen.
Wie schauen s1 und s2 nach der Bearbeitung durch delLZ aus?
s1 und s2 kannst Du mit Ctrl-F5 anschauen, vorher die Variable markieren.

Grüße
Klaus

sk.Silvia 3. Mär 2006 14:43

Re: Problem mit if-Bedingung
 
by us in school the were telling us we should use

if not (pos(' ',s)=0) then
inspite of
if pos(' ',s) <> 0 then

cause it should be faster and better...
that was just btw:)

marabu 3. Mär 2006 15:31

Re: Problem mit if-Bedingung
 
Hallo Mario,

ich würde den gesamten Code nochmal überdenken. Du verschachtelst Ereignisse der Benutzerschnittstelle - Button1Click wird in Button3Click aufgerufen - und speicherst abgeleitete Informationen, die man normalerweise in calculated fields ablegt.

Freundliche Grüße vom marabu

mlspider 3. Mär 2006 16:02

Re: Problem mit if-Bedingung
 
Hallo marabu, ist bereits geschehen. Mir selbst hat der Code auch nicht so richtig "gefallen". :lol:

So, ich mache jetzt Feierabend. Mir platzt sonst der Schädel.


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