Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi mehrere Record-Variablen über Procedure ändern (https://www.delphipraxis.net/207653-mehrere-record-variablen-ueber-procedure-aendern.html)

apm 19. Apr 2021 18:06

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:
          proc_loadCustomFiedBooleanState(  sWebMecEventCustomMediaHideUrl,
                                            [sWebMecEventCustomMediaHidePrint, sWebMecEventCustomMediaHideApp],
                                            [Result[High(Result)].bCustomMediaHidePrint, Result[High(Result)].bCustomMediaHideApp],
                                            JSONObject);
Vom Record baue ich einen Array, um diesen später weiterzuverarbeiten.
Result = TArray<TRecEvent>



Hat jemand eine Idee?

KodeZwerg 19. Apr 2021 18:17

AW: mehrere Record-Variablen über Procedure ändern
 
*entfernt* (ob eine globale definition per type eine option wäre)

jaenicke 19. Apr 2021 18:26

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:
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;
Und generell:
Meistens macht man sich bei solchen Themen das Leben mit einem objektorientierten Ansatz statt einzelner Funktionen und Prozeduren deutlich leichter.

Stevie 19. Apr 2021 18:30

AW: mehrere Record-Variablen über Procedure ändern
 
Delphi-Quellcode:
var array of X
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.

Aber du kannst ein
Delphi-Quellcode:
const bArrTrueState: array of PBoolean
als Parameter nehmen und dann so übergeben:
Delphi-Quellcode:
[@Result[High(Result)].bCustomMediaHidePrint, @Result[High(Result)].bCustomMediaHideApp]

@jaenicke: Für 2 key/value Pairs nen Dictionary hochfahren? puhhh :pale:

apm 19. Apr 2021 18:42

AW: mehrere Record-Variablen über Procedure ändern
 
Zitat:

Zitat von Stevie (Beitrag 1487419)
Aber du kannst ein
Delphi-Quellcode:
const bArrTrueState: array of PBoolean
als Parameter nehmen und dann so übergeben:
Delphi-Quellcode:
[@Result[High(Result)].bCustomMediaHidePrint, @Result[High(Result)].bCustomMediaHideApp]

Klasse, es funktioniert mit dem Pointer und die Anpassung ist minimal! :thumb:

Auf jedenfall werden ich mich mal mit allen genannten Sachen intensiver auseinandersetzen.
DANKE für die schnelle Hilfe!

jaenicke 20. Apr 2021 07:40

AW: mehrere Record-Variablen über Procedure ändern
 
Zitat:

Zitat von Stevie (Beitrag 1487419)
@jaenicke: Für 2 key/value Pairs nen Dictionary hochfahren? puhhh :pale:

Für diesen Zweck ist es sicherlich wie mit Kanonen auf Spatzen geschossen. Angesichts der prozeduralen Herangehensweise wollte ich aber einmal zeigen, dass es auch solche Möglichkeiten gibt, ohne dass man sich selbst unbedingt eigene Klassen erstellen muss.

Dazu hätte ich vielleicht noch ein Wort schreiben sollen.

dummzeuch 20. Apr 2021 08:44

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.

hoika 20. Apr 2021 09:12

AW: mehrere Record-Variablen über Procedure ändern
 
Hallo,
ich hätte den Record ja einfach als Var-Parameter an die Prozedur übergeben...

Andreas13 20. Apr 2021 09:17

AW: mehrere Record-Variablen über Procedure ändern
 
Endlich sagt jemand, daß der Kaiser nackt ist...
Andreas

apm 20. Apr 2021 12:02

AW: mehrere Record-Variablen über Procedure ändern
 
Zitat:

Zitat von hoika (Beitrag 1487450)
Hallo,
ich hätte den Record ja einfach als Var-Parameter an die Prozedur übergeben...

Das war halt auch mein erster Gedanke. Aber genau das ging nicht!
Sie Ausgangsbeschreibung und die ersten 2 - 3 Antworten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 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