![]() |
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:
Fieldcount ist 68, aber nach 60 geht i wieder auf 0. bitte erleuchtet mich mit eurer Weisheit ;-)
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; |
Re: Problem mit Zähler in For-Schleife
Eigentlich müsste es
Delphi-Quellcode:
heissen
for i := 0 to DataSet.FieldCount-1 do
|
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.
|
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.
|
Re: Problem mit Zähler in For-Schleife
Dein Code ist sehr umständlich. Die Lösung heisst Zwischenvariable:
Delphi-Quellcode:
Damit ist die Sache schon viel übersichtlicher.
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; 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? |
Re: Problem mit Zähler in For-Schleife
ah ich hab's =
Zitat:
|
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.
|
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; |
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 |
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:
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:
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 .... |
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.
|
Re: Problem mit Zähler in For-Schleife
Zitat:
Hier noch ein kleiner Bonus: Nach den ![]()
Delphi-Quellcode:
ist das Gleiche wie
if not ((EditableField = true) and (NotEditableField = False)) then
Delphi-Quellcode:
Man darf and in or umwandeln wenn man jeden einzelnen Term negiert und dann auch noch das Gesamtergebnis negiert.
if not EditableField or NotEditableField then
|
Re: Problem mit Zähler in For-Schleife
Zitat:
Delphi-Quellcode:
erstmal die "bösen" Vergleiche weg
if not ((EditableField = true) and (NotEditableField = False)) then
Delphi-Quellcode:
und nun stimmt das "ist das Gleiche wie"
if not (EditableField and not NotEditableField) then
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 |
Re: Problem mit Zähler in For-Schleife (gelöst)
Hatte ich das nicht bereits erwähnt?
|
Re: Problem mit Zähler in For-Schleife (gelöst)
Zitat:
|
Re: Problem mit Zähler in For-Schleife (gelöst)
Das Gefühl habe ich auch :zwinker:
|
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 12:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz