![]() |
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 .... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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 by Thomas Breitkreuz