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 Zähler in For-Schleife (gelöst) (https://www.delphipraxis.net/150548-problem-mit-zaehler-schleife-geloest.html)

JannesDKS 20. Apr 2010 16:00


Problem mit Zähler in For-Schleife (gelöst)
 
Hallo,

ich habe ein kleines Problem mit einer For-Schleife. Sie befindet sich in dem Before-Post eines Datasets.

Delphi-Quellcode:
  for i := 1 to DataSet.FieldCount do
  begin
    if DataSet.Fields.FieldByNumber(i).FieldName = 'DONE' then
    begin
      if DataSet.Fields.FieldByNumber(i).NewValue<> DataSet.Fields.FieldByNumber(i).oldValue then CheckCertified := False;
    end else
    begin
      if DataSet.Fields.FieldByNumber(i).NewValue<> DataSet.Fields.FieldByNumber(i).oldValue then CheckCertified := True;
    end;
  end;
Fieldcount ist 68, aber nach 60 geht i wieder auf 0. bitte erleuchtet mich mit eurer Weisheit ;-)

mkinzler 20. Apr 2010 16:02

Re: Problem mit Zähler in For-Schleife
 
Eigentlich müsste es
Delphi-Quellcode:
for i := 0 to DataSet.FieldCount-1 do
heissen

s.h.a.r.k 20. Apr 2010 16:03

Re: Problem mit Zähler in For-Schleife
 
Jup, so sollte es eigentlich sein. Aber bei dem gegebenen Code müsste dann ja eine Exception auftreten, oder? :gruebel: Und nicht der beschrieben Fehler, den ich mal mehr als strange finde.

JannesDKS 20. Apr 2010 16:04

Re: Problem mit Zähler in For-Schleife
 
ich dachte, das fieldbynumber auch mit 1 anfängt. bei 0 gibt er auf jeden fall eine Zugriffsverletzung an.

shmia 20. Apr 2010 16:18

Re: Problem mit Zähler in For-Schleife
 
Dein Code ist sehr umständlich. Die Lösung heisst Zwischenvariable:
Delphi-Quellcode:
var
  f : TField;
begin
  CheckCertified := False; // sollte nicht fehlen, da CheckCertified ansonsten undefiniert sein könnte
  for i := 1 to DataSet.FieldCount-1 do
  begin
    f := Dataset.Fields[i];
    if f.FieldName = 'DONE' then
    begin
      if f.NewValue<> f.oldValue then CheckCertified := False;
    end else
    begin
      if f.NewValue<> f.oldValue then CheckCertified := True;
    end;
  end;
Damit ist die Sache schon viel übersichtlicher.
Dann gibt es noch einen logischen Fehler.
Die Variable CheckCertified kann bei jedem Feld neu gesetzt werden.
Das letzte veränderte Feld entscheidet über den Inhalt von CheckCertified.
Es ist also wichtig, an welcher Feldposition das Feld 'DONE' steht.
Aber das willst du sicher nicht, oder?

JannesDKS 20. Apr 2010 16:20

Re: Problem mit Zähler in For-Schleife
 
ah ich hab's =

Zitat:

Mit FieldByNumber können Sie Feldinformationen für ein Feld abrufen, von dem nur die Feldnummer bekannt ist. Beachten Sie bitte, dass die Feldnummer die Position des Feldes in der zugrunde liegenden Datenbanktabelle angibt, nicht den Index des Feldes in dem TFields-Objekt.
in der Delphi-Hilfe steht's klar drin. Trotzdem Danke für die Antworten

JannesDKS 20. Apr 2010 16:23

Re: Problem mit Zähler in For-Schleife
 
hey shmia, das ist kein logischer Fehler, sondern so gewollt. Wenn zum Beispiel Done und(!) ein anderes Feld geändert wurden, dann soll das Result True sein. Ansonsten hättest du natürlich recht.

DeddyH 20. Apr 2010 16:24

Re: Problem mit Zähler in For-Schleife
 
Falls ich die Logik richtig verstanden habe:
Delphi-Quellcode:
var
  f : TField;
begin
  CheckCertified := true; //Standardwert festlegen
  for i := 1 to DataSet.FieldCount-1 do
  begin
    f := Dataset.Fields[i];
    if f.FieldName = 'DONE' then
      CheckCertified := f.NewValue<> f.oldValue;
  end;
end;

JannesDKS 20. Apr 2010 16:28

Re: Problem mit Zähler in For-Schleife
 
Danke, das sieht gut aus, besser als meins. FieldbyNumber war der Hauptfehler. hab ich grad schon gemerkt. der Fields[i] ist das wahre.
Probier ich gleich mal aus

JannesDKS 20. Apr 2010 16:44

Re: Problem mit Zähler in For-Schleife
 
So, ich denk ich hab's. Vielen Dank nochmal.

wen's interessier hier nochmal Die Lösung:

Delphi-Quellcode:
Fieldcount := DataSet.FieldCount;
  for i := 0 to FieldCount-1 do
  begin
    f := Dataset.Fields[i];
    if (f.FieldName = 'DONE')
    or (f.FieldName = 'DOCUMENT_NAME')
    or (f.FieldName = 'REFERENCE')
    or (f.FieldName = 'CONTACT_NAME')
    or (f.FieldName = 'REMINDER_DATE')
    or (f.FieldName = 'REMARKS_ACTION') then
    begin
      if f.NewValue<> f.oldValue then EditableField := True;
    end else
    begin
      if f.NewValue<> f.oldValue then NotEditableField := True;
    end;
  end;

  if not ((EditableField = true) and (NotEditableField = False)) then
  begin
....
Der Sinn war halt, dass nur bestimmte Felder in einer zertifizierten Periode geändert werden können sollen. Sogesehen hatte shmia doch recht und ich hab das mit dem Logikfehler nicht richtig durchschaut. Asche auf mein Haupt :oops:

DeddyH 20. Apr 2010 16:53

Re: Problem mit Zähler in For-Schleife (gelöst)
 
Das sieht mir zwar umständlich aus, sollte aber meist funktionieren. Aaaaaber: nimm bitte die Vergleiche auf true und false raus, das kann danebengehen.

shmia 20. Apr 2010 16:55

Re: Problem mit Zähler in For-Schleife
 
Zitat:

Zitat von JannesDKS
Asche auf mein Haupt :oops:

Na wenigstens bist du ja lernfähig; ich dachte schon ich hätte umsonst geschrieben.
Hier noch ein kleiner Bonus:
Nach den De Morganschen Gesetzen kann man umformen:
Delphi-Quellcode:
if not ((EditableField = true) and (NotEditableField = False)) then
ist das Gleiche wie
Delphi-Quellcode:
if not EditableField or NotEditableField then
Man darf and in or umwandeln wenn man jeden einzelnen Term negiert und dann auch noch das Gesamtergebnis negiert.

himitsu 20. Apr 2010 17:08

Re: Problem mit Zähler in For-Schleife
 
Zitat:

Zitat von shmia
ist das Gleiche wie

Nicht wirklich, denn wie du bestimmt weißt, sollte man nicht auf True oder False vergleichen.

Delphi-Quellcode:
if not ((EditableField = true) and (NotEditableField = False)) then
erstmal die "bösen" Vergleiche weg
Delphi-Quellcode:
if not (EditableField and not NotEditableField) then
und nun stimmt das "ist das Gleiche wie"
Delphi-Quellcode:
if not EditableField or NotEditableField then

Denn korrekt wäre es sonst so gewesen (Achtung, diese Codes sind fehlerhaft, so wie der allererste Code)
Delphi-Quellcode:
if (EditableField <> true) or (NotEditableField <> False) then
// gekürzt, da FALSE nur einen Wert besitzt
if (EditableField <> true) or NotEditableField then

DeddyH 20. Apr 2010 17:13

Re: Problem mit Zähler in For-Schleife (gelöst)
 
Hatte ich das nicht bereits erwähnt?

mkinzler 20. Apr 2010 18:03

Re: Problem mit Zähler in For-Schleife (gelöst)
 
Zitat:

Zitat von DeddyH
Hatte ich das nicht bereits erwähnt?

Frank liest grundsätzlich keine andere Antworten :zwinker:

DeddyH 20. Apr 2010 18:05

Re: Problem mit Zähler in For-Schleife (gelöst)
 
Das Gefühl habe ich auch :zwinker:

JannesDKS 20. Apr 2010 21:23

Re: Problem mit Zähler in For-Schleife (gelöst)
 
hey, danke nochmal. das mit den De-Morganschen Regeln muss ich mir mal durchlesen, das hab ich noch nicht 100% verstanden.


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