![]() |
mehrere Record-Variablen über Procedure ändern
Hallo!
Ich stehe gerade minimal auf dem Schlauch... In meinem Programm habe ich einen Record mit mehreren Bool-Variablen. Diese müssen an Hand von Text-Informationen aus einem JSON-Array ggf. auf true gesetzt werden. Da ich das merfach machen muss und eig. keine direkte Anweisung für jede Variable definieren will war das mein Gedanke: Ich schreibe eine Procedure, welche die String-Infos aus dem JSON-Array mit denen abgleicht, welche für den true-Status relevant sind. Entsprechend eines Treffers will ich eine einzelne Variable auf true setzten. Mein Problem / Fehler ist, dass ich die Record-Variablen nicht in meine Procedure übergeben kann, um diese direkt zu ändern ("var" Angabe der Definition): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden Teile vom Record:
Delphi-Quellcode:
type
TRecEvent = record //... bCustomMediaHidePrint, bCustomMediaHideApp : Boolean; end; Funktion zum überarbeiten der Boolean-Werte:
Delphi-Quellcode:
procedure proc_loadCustomFiedBooleanState(const sUrl : String; const sArrTrueText : Array of String; var bArrTrueState : Array of Boolean; var jObj : TJSONObject);
var i, j : Integer; jArr : TJSONArray; begin if (Length(sArrTrueText) = 0) or (Length(bArrTrueState) = 0) or (Length(sArrTrueText) <> Length(bArrTrueState)) then Exit; try jArr := func_jsonGetArray(sUrl, jObj); for i := 0 to jArr.Count-1 do for j := 0 to High(sArrTrueText) do if jArr[i].Value.Equals( sArrTrueText[j] ) then begin bArrTrueState[j] := true; Break; end; except end; end; Funktionsaufruf:
Delphi-Quellcode:
Vom Record baue ich einen Array, um diesen später weiterzuverarbeiten.
proc_loadCustomFiedBooleanState( sWebMecEventCustomMediaHideUrl,
[sWebMecEventCustomMediaHidePrint, sWebMecEventCustomMediaHideApp], [Result[High(Result)].bCustomMediaHidePrint, Result[High(Result)].bCustomMediaHideApp], JSONObject); Result = TArray<TRecEvent> Hat jemand eine Idee? |
AW: mehrere Record-Variablen über Procedure ändern
*entfernt* (ob eine globale definition per type eine option wäre)
|
AW: mehrere Record-Variablen über Procedure ändern
Das Array wird ja gerade erst neu erstellt und ist somit eine implizite lokale Variable. Da dieses Array aber nicht in einer echten Variable steht, würdest du Änderungen daran ja nicht nutzen können. Deshalb kannst du es nicht als Referenz übergeben.
Das sieht für mich auch recht kompliziert aus. Wie wäre es mit einem objektorientierten Ansatz? Wenn du eine TObjectList mit Objekten nutzen würdest, könntest du die Werte direkt in den Objekten ändern, weil das ohnehin Referenzen sind (anders als Records). Oder alternativ könntest du ein TDictionary<string, Boolean> verwenden und direkt die Booleanwerte zuordnen. Was da am sinnvollsten ist, kann ich so nicht sagen. Es seht für mich jedenfalls unnötig umständlich aus. Was eventuell eine Möglichkeit wäre, wenn ich das richtig verstanden habe:
Delphi-Quellcode:
Und generell:
procedure proc_loadCustomFiedBooleanState(const AUrl: string; const AValues: TDictionary<string, Boolean>; var AObj : TJSONObject);
var i: Integer; jArr: TJSONArray; begin if AValues.Count = 0 then Exit; jArr := func_jsonGetArray(sUrl, jObj); for i := 0 to jArr.Count - 1 do if AValues.ContainsKey(jArr.Items[i].Value) then AValues[jArr.Items[i].Value] := True; end; Meistens macht man sich bei solchen Themen das Leben mit einem objektorientierten Ansatz statt einzelner Funktionen und Prozeduren deutlich leichter. |
AW: mehrere Record-Variablen über Procedure ändern
Delphi-Quellcode:
heißt nicht, dass das ein array von by ref parametern ist, sondern ein by ref array. Da kann man also nicht einfach einzelne Werte reingeben, sondern nur ein schon bestehendes Array by ref übergeben.
var array of X
Aber du kannst ein
Delphi-Quellcode:
als Parameter nehmen und dann so übergeben:
const bArrTrueState: array of PBoolean
Delphi-Quellcode:
[@Result[High(Result)].bCustomMediaHidePrint, @Result[High(Result)].bCustomMediaHideApp]
@jaenicke: Für 2 key/value Pairs nen Dictionary hochfahren? puhhh :pale: |
AW: mehrere Record-Variablen über Procedure ändern
Zitat:
Auf jedenfall werden ich mich mal mit allen genannten Sachen intensiver auseinandersetzen. DANKE für die schnelle Hilfe! |
AW: mehrere Record-Variablen über Procedure ändern
Zitat:
Dazu hätte ich vielleicht noch ein Wort schreiben sollen. |
AW: mehrere Record-Variablen über Procedure ändern
Nur so als Denkanstoss: Ein Record mit Bool-Feldern kann man evtl. auch durch ein Set von Enums ersetzen. Dann kann man ggf. die einzelnen Werte mittels ihrer Namen setzen.
|
AW: mehrere Record-Variablen über Procedure ändern
Hallo,
ich hätte den Record ja einfach als Var-Parameter an die Prozedur übergeben... |
AW: mehrere Record-Variablen über Procedure ändern
Endlich sagt jemand, daß der Kaiser nackt ist...
Andreas |
AW: mehrere Record-Variablen über Procedure ändern
Zitat:
Sie Ausgangsbeschreibung und die ersten 2 - 3 Antworten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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