Delphi-PRAXiS
Seite 1 von 2  1 2      

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.
Seite 1 von 2  1 2      

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