Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Variablen in Array packen? (erledigt) (https://www.delphipraxis.net/214369-variablen-array-packen-erledigt.html)

DieDolly 2. Jan 2024 17:56


Variablen in Array packen? (erledigt)
 
Es wurden mehrere Variablen vom Typ Integer und String irgendwo deklariert.
Leider brauche ich diese an mehreren Stellen und es geht einfach nicht anders als mit einem case-of darauf (an mehreren Stellen) zuzugreifen, Werte zu lesen und zu schreiben.
Demnach gibt es mehrere case-of. Bei Änderungen im Code müssen die immer alle angepasst werden. Das soll weg.

Damit das alles weniger und besser lesbarer Code wird, würde ich gerne diese Integer- und String-Variablen in ein Array packen.
Im Kopf bin ich das alles schon durchgegangen und der Code wird danach insgesamt weniger und besser. Nur die geht man sowas an?

Ich weiß nicht, ob mein Text verständlich ist.

Aber grundsätzlich geht es darum: wie packt man Variablen in ein Array

Hier ein Beispiel
Delphi-Quellcode:
  case Column.Index of
    1:
     VST.Header.Columns[Column.Index].Width := Variable1;
    2:
     VST.Header.Columns[Column.Index].Width := Variable2;
    3:
     VST.Header.Columns[Column.Index].Width := Variable3;
  ...
Delphi-Quellcode:
  case Column.Index of
    1:
     VST.Header.Columns[Column.Index].Position:= Variable1_1;
    2:
     VST.Header.Columns[Column.Index].Position:= Variable2_2;
    3:
     VST.Header.Columns[Column.Index].Position:= Variable3_3;
  ...
Daraus soll am Ende werden
Delphi-Quellcode:
     VST.Header.Columns[i].Position:= [variable-i-aus-array-X];
Einfach ein Array mit diesen Werten füllen funktioniert nicht. Die eigentlichen Variablen haben aussagekräftige Namen und werden woanderswo auch einzeln mal verwendet).
Kann man vielleicht in einer Datenstruktur ein Property (array) deklarieren, welches dann, jenachdem auf welchen Index man zugreift, den Wert dieser Variable zurückgibt? Das impliziert, dass man wieder eion case-of braucht. Aber nur eines und nicht 4.

himitsu 2. Jan 2024 18:12

AW: Variablen in Array packen?
 
Warum geht ein Array nicht?

Anstatt namentlicher Vrariablen einfach namentliche Konstanten mit dem jeweiligen Array-Index.

Oder ein Assoziatives Array (Dictionary) und Konstanten mit dem jeweiligen Namen,
und dazu noch ein Übersetungsarray mit Name zu Index (bzw. andersrum).

DieDolly 2. Jan 2024 18:34

AW: Variablen in Array packen?
 
Ich habe mir alles nochmal angeguckt. Es ist besser ich lasse alles so wie es ist. Es geht nicht anders denn sonst würde ich denselben Code nur an eine andere Stelle packen.

Es gibt 2 case-of in welchen Width und Position in die Variablen geschrieben werden und es gibt 2 case-of welche die aktuellen Werte zurück in die Variablen schreiben.

Ein TDictionary<string, string> wäre vielleicht eine Idee, mal gucken.

mytbo 2. Jan 2024 20:26

AW: Variablen in Array packen? (erledigt)
 
Zitat:

Zitat von DieDolly (Beitrag 1531372)
Aber grundsätzlich geht es darum: wie packt man Variablen in ein Array

Wenn ich richtig sehe, möchtest du die Eigenschaften der Columns eines VirtualTrees speichern/wiederherstellen. Einfach geht es mit einem mORMot DocVariant:
Delphi-Quellcode:
uses
  VirtualTrees, VirtualTrees.Types,
  mormot.core.base,
  mormot.core.json,
  mormot.core.variants;

type
  TViewManager = class(TObject)
  strict private
    const
      COLUMN_VALUENAME_INDEX = 'idx';
      COLUMN_VALUENAME_WIDTH = 'wth';
      COLUMN_VALUENAME_POSITION = 'pos';
      COLUMN_VALUENAME_VISIBLE = 'vis';
  public
    class function SaveListViewColumnsToJson(pmTreeList: TCustomVirtualStringTree): RawJson;
  end;


type
  TCustomVirtualStringTreeAccess = class(TCustomVirtualStringTree);

class function TViewManager.SaveListViewColumnsToJson(pmTreeList: TCustomVirtualStringTree): RawJson;
var
  header: TVTHeader;
  column: TVirtualTreeColumn;
  columnValues: TDocVariantData;
begin
  Assert(pmTreeList <> Nil);

  columnValues.InitFast(dvArray);
  header := TCustomVirtualStringTreeAccess(pmTreeList).Header;
  for var columnIdx: Integer := 0 to header.Columns.Count - 1 do
  begin
    column := header.Columns[columnIdx];
    if (coResizable in column.Options)
      and (column.Width > 0) then
    begin
      columnValues.AddObject([
        COLUMN_VALUENAME_INDEX, columnIdx,
        COLUMN_VALUENAME_WIDTH, column.Width,
        COLUMN_VALUENAME_POSITION, column.Position,
        COLUMN_VALUENAME_VISIBLE, (coVisible in column.Options)]);
    end;
  end;

  Result := columnValues.ToJson;
end;
Das Wiederherstellen lässt sich auf die gleiche Weise umsetzen.

Bis bald...
Thomas

freimatz 3. Jan 2024 07:51

AW: Variablen in Array packen?
 
Zitat:

Zitat von DieDolly (Beitrag 1531374)
... Es geht nicht anders ...

Doch. :P
Neben dem bisher vorgeschlagenen gibt es noch weitere Ideen.
Alles ist besser als zig mal "VST.Header.Columns[Column.Index]" zu schreiben.

DieDolly 3. Jan 2024 12:37

AW: Variablen in Array packen? (erledigt)
 
Ich habe in den letzten Stunden alles angepasst. Ich habe nicht direkt den Vorschlag von mytbo übernommen, aber ich habe mich davon inspirieren lassen und es an meinen Code allgemein angepasst.
Das Resultat ist, dass es nicht ein einziges case-of mehr gibt.

freimatz 3. Jan 2024 14:10

AW: Variablen in Array packen? (erledigt)
 
:thumb:

himitsu 3. Jan 2024 14:59

AW: Variablen in Array packen? (erledigt)
 
Dafür nun mit ein paar Goto? :snowball:

DieDolly 3. Jan 2024 15:02

AW: Variablen in Array packen? (erledigt)
 
Natürlich nicht.

dummzeuch 3. Jan 2024 18:01

AW: Variablen in Array packen? (erledigt)
 
Zitat:

Zitat von himitsu (Beitrag 1531396)
Dafür nun mit ein paar Goto? :snowball:

LOL! :cheer:


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