![]() |
Record über mehrere Prozeduren hinweg übergeben
Dadurch, dass ich Code aufgeräumt habe, ist ein neues Problem entstanden.
Ich demonstriere es am besten mit Dummy-Code Unit 1
Delphi-Quellcode:
Unit 2
// procedure 1
var // <== NICHT global, sondern in Procedure 1 ! DataRecord: TDataRecord; begin DataRecord.A := -1; DataRecord.B := 2; // usw DataUnit.ProcA(DataRecord);
Delphi-Quellcode:
// procedure 2
procedure TDataUnit.ProcA(aDataRecord: TDataRecord); begin if not IsDataOK(aDataRecord) then Exit; showmessage( aDataRecord.A ); // ist noch immer -1, sollte 0 sein. // ansonsten erzeuge hier Klasseninstanz von XYZ anhand der Daten von aDataRecord + schiebe diese Instanz in eine generische TList. end;
Delphi-Quellcode:
Ich dachte, dass ich wegen des Var-Parameters in IsDataOK() in Prozedur 3 nun die korrigierten Daten in Prozedur2 weitergeben kann.
// procedure 3
functionTDataUnit.IsDataOK(var aDataRecord: TDataRecord): Boolean; begin Result := False; // überprüfe Daten (strings und integer) aus aDataRecord. // Wenn etwas kaputt ist, korrigiere es. Beispiel if aDataRecord.A < 0 then aDataRecord.A := 0; // Bei einer ganz bestimmten Sache wird ggf. Raise ausgelöst (von mir). Dann wird eh abgebrochen. Result := True; end; Wo ist mein Fehler? Ich könnte das Record auch in der Unit-2 selber deklarieren statt in Unit 1 in der Prozedur. Aber ich weiß nicht ob das Nebenwirkungen hat. Dann wär ich aber die ganzen var-Parameter los. |
AW: Record über mehrere Prozeduren hinweg übergeben
Zitat:
|
AW: Record über mehrere Prozeduren hinweg übergeben
Zitat:
aDataRecord :zwinker: Der Parameter aDataRecord ist natürlich eine Kopie. Du solltest dir dringend überlegen, wieso überhaupt in ProcA auf das "globale?" DataRecord zugergriffen werden kann. [add] Und der Name "IsDataOK" ist natürlich komplett falsch, denn da wird nicht "nur" geprüft, sondern auch verändert. |
AW: Record über mehrere Prozeduren hinweg übergeben
Zitat:
Im Code steht natürlich ein A davor. Habe es oben korrigiert. Das DataRecord ist nicht global. Es ist in Procedure 1 deklariert. Zitat:
|
AW: Record über mehrere Prozeduren hinweg übergeben
Hmmm, wenn es wirklich so wie oben ist, dann seh ich keinen weiteren Fehler und es funktioniert somit. :angle2:
Also nur auf diese Variable bezogen. IF mit Prozedur steht ja nicht zu Frage ;) Ansonsten wird nur innerhalb von ProcA die Kopie verändert und danach ist es wieder wie vorher. |
AW: Record über mehrere Prozeduren hinweg übergeben
Delphi-Quellcode:
Könnte es so funktionieren?
// procedure 3
function TDataUnit.IsDataOK(var aDataRecord: TDataRecord) : Boolean; begin // überprüfe Daten (strings und integer) aus aDataRecord. // Wenn etwas kaputt ist, korrigiere es. Beispiel if aDataRecord.A < 0 then begin aDataRecord.A := 0; Result := True; end else Result := False; end; |
AW: Record über mehrere Prozeduren hinweg übergeben
Ich dachte wenn die Daten in IsDataOK() verändert werden, stehen sie mir im Aufrufer (ProcA) zur Verfügung. Aber dort habe ich nur die alten Daten.
Übrigens, noch ein Tippfehler den ich aber nicht im Code habe. isDataok ist natürlich eine Function. Und nee, ich habe in ProcA trotzdem nur die alten Daten. Was auch immer ich in IsDataOK ändere, es steht mir in ProcA leider nicht zur Verfügung. |
AW: Record über mehrere Prozeduren hinweg übergeben
Ach ja, eine globale/zentrale Variable DataRecord anstatt der Übergabe (Parameter/Property) wäre der falsche Weg, für einen sauber Code.
PS: Einfache Struktur-Prüffunktionen baue ich auch gern als Methode in den Record ein, zu dem sie gehören. Wobei Viele hier natürlich auch lieber zu Daten-Objekten raten würden. |
AW: Record über mehrere Prozeduren hinweg übergeben
Zitat:
@aDataRecord in IsDataOK und in ProcA ansehen ... das sollte ja identisch sein |
AW: Record über mehrere Prozeduren hinweg übergeben
Ich habe den PC mal neu gestartet... warum nicht.
Jetzt funktioniert es genau wie es soll. Ich hatte im Laufe des Tages auch bestimmt ein halbes Dutzend mal den Fehler, dass beim Kompilieren Stellen als Fehler markiert wurden, wo gar keine Fehler waren. Vielleicht ist das ein Bug der durch diesen Bug kommt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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