Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   einen Datensatzmitgliedsnamen dynamisch zuweisen (https://www.delphipraxis.net/210966-einen-datensatzmitgliedsnamen-dynamisch-zuweisen.html)

neumimnemecky 7. Jul 2022 07:20

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Zitat:

Zitat von himitsu (Beitrag 1508520)
Das ist was Anderes.

Ich habe keinen Hochschulabschluss. Ohne konkrete Anwendungsbeispiele aus der Praxis sind mir diese Dinge zu kompliziert. Im Allgemeinen ist es für mich also nur eine Theorie, und Theorien sind für mich ohne ein konkretes Beispiel schwer zu verstehen. Deswegen verstehe ich das nicht. Insgesamt ist mir der Artikel zu schwer.

himitsu 7. Jul 2022 09:07

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Array-Property, das ist sowas, wie bei TList/TStrings/TStringList ... halt wie beim Array.
Delphi-Quellcode:
property Strings[Index: Integer]: string read GetString write SetStrings;

SL.Strings[index]
SL.Value[Name]
Default-Property, sind jene, welche "implizit" genutzt werden können.
Delphi-Quellcode:
property Strings[Index: Integer]: string read GetString write SetStrings; default;

SL.Strings[index] // direkt
SL[index] // default
dagegen die Default-Value bzw. Default-Property-Value

Delphi-Quellcode:
property Cool: Boolean read GetCool write SetCool default True;

Die Klasse Instanz neu erstelt, da ist der Wert True ... bzw. eigentlich heißt es, dass "True" nicht in der DFM gespeichert wird, also nur "False" steht drin.
(stimmen beide Aussagen aber nicht überein, dann hast du ein Problem, beim Laden einer DFM ... also aufpassen, wenn du Klassen baust)

Delphi-Quellcode:
property StringEx: string index 123 read GetString write SetStrings;

SL.StringEx // Index nur intern, z.B. zur Haldung von Kontroll-Daten und/oder um für mehrere Property nur "einen" Getter/Setter zu nutzen


// aber so fällt bestmmt auf, dass diese beiden "Index" nicht das Gleiche sind
property StringEx[Index2: Integer]: string index 123 read GetString write SetStrings;


// der Getter und Setter sieht hier erstmal gleich aus
property A: string index 1 read GetABC write SetABC;
property B: string index 2 read GetABC write SetABC;
property C: string index 3 read GetABC write SetABC;

property X[Index: Integer]: string read GetABC write SetABC;

procedure GetABC(Index: Integer): string;
begin
  //Assert((Index => 1) and (Index <= 3), 'peng');
  case Index of
    1: Result := 'Aaa';
    2: Result := 'Bbb';
    3: Result := 'Ccc';
    else raise Exception.Create('peng');
  end;
end;

neumimnemecky 7. Jul 2022 09:08

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Ich habe versucht, dem Beispiel in # 15 zu folgen. der Übersetzer nimmt keine Aufzeichnungen vor (Der Übersetzer nimmt den Code nicht; The compiler does not accept that). Ich probiere die Klasse aus. Fehler:

Code:
TBasicGroupSettings = record
  path: string;
  check_files_exist: boolean;
  start_name: string; // first_filename
  first: string; // first_filename
  last: string;  // end_frame
end;
// ini.basic has some general settings too
type TBasicSettings = class
  is_scroll_vertical: boolean;
  is_image_direction_up: boolean;
  is_search_colors_HSL: boolean;
  check_files_exist_A: boolean;
  check_files_exist_B: boolean;
  RAM_disk: string;
  RAM_free: LongWord; // v MB
  A: TBasicGroupSettings;
  B: TBasicGroupSettings;
  fps: byte;
  scroll_max_shift: integer;
  property basic[G:String] TBasicGroupSettings read Get_A write Set_A;
end;
[Error] constants_ini.pas(47): ':' expected but identifier 'TBasicGroupSettings' found

Code:
property basic[G:String] TBasicGroupSettings read Get_A write Set_A;

himitsu 7. Jul 2022 09:55

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Die Hilfe ist kaputt ... bei der automatischen Übersetzung sind ein paar Zeichen verloren gegangen.

Zitat:

[Error] constants_ini.pas(47): ':' expected but identifier 'TBasicGroupSettings' found
Rate mal, was zwischen Name und Typ kommt, bzw. vor den Typ. :zwinker:







Delphi-Quellcode:
BasicGroupSettings = class
und dann in TBasicSettings.Create die beiden Instanzen erstellen.

Und natürlich im TBasicSettings.Destroy wieder freigeben,
oder Beides als
Delphi-Quellcode:
= class(TComponent)
, beim Erstellen das den Owner auf Self und automatisch freigeben lassen.

Zitat:

Set_A
Als RECORD kann nur der gesamte Record zugewiesen werden.

Delphi-Quellcode:
// bei einem RECORD landet "first" nur im Result von Get_A, aber wird nicht automatisch in Set_A zurückgeschrieben.
basicsetting.basic['A'].first := 'abc';

// daher .... als CLASS gäbe es dieses Problem nicht
// eventuell vorher auslesen: temp := basicsetting.basic['A'];
temp.first := 'abc';
basicsetting.basic['A'] := temp;

neumimnemecky 7. Jul 2022 10:08

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Dann habe ich versucht, es mit einem Array zu tun, aber dort sagt es mir inkompatible Typen hinter dem Wort write.

Code:
type TBasicSettings = class
  private
  fGroups: array[0..1] of TBasicGroupSettings;
  function getA(Index: byte): TBasicGroupSettings;
  function getB(Index: byte): TBasicGroupSettings;
  procedure setA(Index: byte; O: TBasicGroupSettings);
  procedure setB(Index: byte; O: TBasicGroupSettings);
  public
  is_scroll_vertical: boolean; //  scroll_type=vertical
  is_image_direction_up: boolean; //  image_direction
  is_search_colors_HSL: boolean;
  check_files_exist_A: boolean;
  check_files_exist_B: boolean;
  RAM_disk: string;
  RAM_free: LongWord; // v MB
  start_name_A: string;
//  A: TBasicGroupSettings;
//  B: TBasicGroupSettings;
  fps: byte;
  scroll_max_shift: integer;
  // property basic[G:String] TBasicGroupSettings read Get_A write Set_A;
  property A: TBasicGroupSettings Index 0 read GetA write SetA;
  property B: TBasicGroupSettings Index 1 read GetB write SetB;
end;

Delphi.Narium 7. Jul 2022 10:11

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
In Delphi 7 gibt es diese Möglichkeiten noch nicht.

neumimnemecky 7. Jul 2022 10:34

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Zitat:

Zitat von himitsu (Beitrag 1508535)
Die Hilfe ist kaputt ... bei der automatischen Übersetzung sind ein paar Zeichen verloren gegangen.

Zitat:

[Error] constants_ini.pas(47): ':' expected but identifier 'TBasicGroupSettings' found
Rate mal, was zwischen Name und Typ kommt, bzw. vor den Typ. :zwinker:

Also wie hier (ich bevorzuge diese Quelle - das ist für mich leichter zu verstehen - weil sie die Beispiele enthält):
http://www.delphibasics.co.uk/RTL.asp?Name=Property

Code:
7.Property Name[Index : IndexType] : BaseType read Getter {default;}
Das habe ich in Beitrag 15# nicht gesehen.

Sie erklären auch das Standardwort, das mir unklar war.
"Default allows the Getter and Setter method calls to be replaced as in the following example:"
Code:
myValue := MyClass.Getter(23);
// can be replaced by :
myValue := MyCLass[23];
:

himitsu 7. Jul 2022 11:24

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Array-Property gingen in D7, aber Einiges davon funktioniert oftmals nur, wenn es auch als Default deklariert ist, sonst nicht.


Darum ist es in der StringList auch so
Delphi-Quellcode:
property Value[Name: String]: String ...
property ValueByIndex[Index: Integer]: String ...
weil es so nicht ging
Delphi-Quellcode:
property Value[Name: String]: String ...
property Value[Index: Integer]: String ...
seit den class-operators hatte ich mir dann so beholfen
Delphi-Quellcode:
type
  TIndexName = record
    Index: Integer;
    Name: string;
    class operator Implicit(Value: Integer): TIndexName;
    class operator Implicit(Value: String): TIndexName;
  end;

property Value[Name: TIndexName]: String ...; default;
ja, hier wäre auch Variant möglich , aber alles da oben stellt sicher, dass "nur" Integer oder String rein geht (Float, Boolean und Anderes wird direkt vom Compiler bemängelt)
Delphi-Quellcode:
property Value[Name: Variant]: String ...; default;


um sowas machen zu können

Delphi-Quellcode:
xyz.Value[123]
xyz.Value['abc']
xyz[123]
xyz['abc']

neumimnemecky 7. Jul 2022 11:44

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Also habe ich verschiedene Dinge ausprobiert, aber alles falsch ...

property A: TBasicGroupSettings Index 0 read GetA write SetA;default;
property B: TBasicGroupSettings Index 1 read GetB write SetB;default;
property group[Index: byte]: TBasicGroupSettings read GetB write SetB;default;

Denn dort muss String vorhanden sein, nicht Objekt. Das Objekt, das ich manuell in den Getter- und Setter-Implementierungscode implementieren muss.

himitsu 7. Jul 2022 12:05

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
 
Wo ist da ein "String"?

Und was ist "Falsch"?


Delphi-Quellcode:
; default;
gibt es ausschließlich für Array-Property.
Delphi-Quellcode:
default EineOrdinaleKonstante;
, bzw.
Delphi-Quellcode:
stored TrueOderFalseOderFunktion;
, gibt es dagegen nur für einfache Property.


String: Meinst du sowas?
Delphi-Quellcode:
property Value[GroupABC: Char; Value: string]: string read GetValue write SetValue;

xxx.Value['A', 'start_name'] := 'abc';
xxx['A', 'start_name'] := 'abc'; // wenn mit "default"



PS:
Delphi-Quellcode:
property group[Index: Byte = 0]: TBasicGroupSettings read GetB write SetB;
läßt der Compiler erstmal durch, aber dann beim Setter/Getter knallt es, weil
Delphi-Quellcode:
procedure GetB(Index: Byte = 0): TBasicGroupSettings);
zwar noch geht,
es aber hier
Delphi-Quellcode:
procedure SetB(Index: Byte = 0; Value: TBasicGroupSettings {= nil});
leider nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.
Seite 3 von 4     123 4      

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