AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi mehrere Record-Variablen über Procedure ändern

mehrere Record-Variablen über Procedure ändern

Ein Thema von apm · begonnen am 19. Apr 2021 · letzter Beitrag vom 20. Apr 2021
Antwort Antwort
Seite 1 von 2  1 2   
apm

Registriert seit: 22. Nov 2010
28 Beiträge
 
#1

mehrere Record-Variablen über Procedure ändern

  Alt 19. Apr 2021, 19:06
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?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.081 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: mehrere Record-Variablen über Procedure ändern

  Alt 19. Apr 2021, 19:17
*entfernt* (ob eine globale definition per type eine option wäre)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.145 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: mehrere Record-Variablen über Procedure ändern

  Alt 19. Apr 2021, 19:26
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.842 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: mehrere Record-Variablen über Procedure ändern

  Alt 19. Apr 2021, 19:30
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 const bArrTrueState: array of PBoolean als Parameter nehmen und dann so übergeben: [@Result[High(Result)].bCustomMediaHidePrint, @Result[High(Result)].bCustomMediaHideApp]
@jaenicke: Für 2 key/value Pairs nen Dictionary hochfahren? puhhh
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (19. Apr 2021 um 19:33 Uhr)
  Mit Zitat antworten Zitat
apm

Registriert seit: 22. Nov 2010
28 Beiträge
 
#5

AW: mehrere Record-Variablen über Procedure ändern

  Alt 19. Apr 2021, 19:42
Aber du kannst ein const bArrTrueState: array of PBoolean als Parameter nehmen und dann so übergeben: [@Result[High(Result)].bCustomMediaHidePrint, @Result[High(Result)].bCustomMediaHideApp]
Klasse, es funktioniert mit dem Pointer und die Anpassung ist minimal!

Auf jedenfall werden ich mich mal mit allen genannten Sachen intensiver auseinandersetzen.
DANKE für die schnelle Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.145 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: mehrere Record-Variablen über Procedure ändern

  Alt 20. Apr 2021, 08:40
@jaenicke: Für 2 key/value Pairs nen Dictionary hochfahren? puhhh
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
956 Beiträge
 
Delphi 2007 Professional
 
#7

AW: mehrere Record-Variablen über Procedure ändern

  Alt 20. Apr 2021, 09:44
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.
Thomas Mueller
  Mit Zitat antworten Zitat
hoika
Online

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.011 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: mehrere Record-Variablen über Procedure ändern

  Alt 20. Apr 2021, 10:12
Hallo,
ich hätte den Record ja einfach als Var-Parameter an die Prozedur übergeben...
Heiko

Geändert von hoika (20. Apr 2021 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
440 Beiträge
 
Delphi XE5 Professional
 
#9

AW: mehrere Record-Variablen über Procedure ändern

  Alt 20. Apr 2021, 10:17
Endlich sagt jemand, daß der Kaiser nackt ist...
Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher.
John C. Cornelius
  Mit Zitat antworten Zitat
apm

Registriert seit: 22. Nov 2010
28 Beiträge
 
#10

AW: mehrere Record-Variablen über Procedure ändern

  Alt 20. Apr 2021, 13:02
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf