AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

einen Datensatzmitgliedsnamen dynamisch zuweisen

Ein Thema von neumimnemecky · begonnen am 6. Jul 2022 · letzter Beitrag vom 7. Jul 2022
Antwort Antwort
Seite 3 von 4     123 4      
neumimnemecky

Registriert seit: 21. Dez 2018
45 Beiträge
 
#21

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 08:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#22

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 10:07
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

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;
$2B or not $2B

Geändert von himitsu ( 7. Jul 2022 um 10:23 Uhr)
  Mit Zitat antworten Zitat
neumimnemecky

Registriert seit: 21. Dez 2018
45 Beiträge
 
#23

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 10:08
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;

Geändert von neumimnemecky ( 7. Jul 2022 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#24

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 10:55
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.







BasicGroupSettings = class und dann in TBasicSettings.Create die beiden Instanzen erstellen.

Und natürlich im TBasicSettings.Destroy wieder freigeben,
oder Beides als = 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;
$2B or not $2B

Geändert von himitsu ( 7. Jul 2022 um 11:04 Uhr)
  Mit Zitat antworten Zitat
neumimnemecky

Registriert seit: 21. Dez 2018
45 Beiträge
 
#25

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 11:08
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;
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#26

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 11:11
In Delphi 7 gibt es diese Möglichkeiten noch nicht.
  Mit Zitat antworten Zitat
neumimnemecky

Registriert seit: 21. Dez 2018
45 Beiträge
 
#27

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 11:34
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.
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];
:

Geändert von neumimnemecky ( 7. Jul 2022 um 11:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#28

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 12:24
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)
property Value[Name: Variant]: String ...; default;

um sowas machen zu können

Delphi-Quellcode:
xyz.Value[123]
xyz.Value['abc']
xyz[123]
xyz['abc']
$2B or not $2B

Geändert von himitsu ( 7. Jul 2022 um 12:35 Uhr)
  Mit Zitat antworten Zitat
neumimnemecky

Registriert seit: 21. Dez 2018
45 Beiträge
 
#29

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 12:44
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#30

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 13:05
Wo ist da ein "String"?

Und was ist "Falsch"?


; default; gibt es ausschließlich für Array-Property.
default EineOrdinaleKonstante; , bzw. 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:
property group[Index: Byte = 0]: TBasicGroupSettings read GetB write SetB; läßt der Compiler erstmal durch, aber dann beim Setter/Getter knallt es, weil
procedure GetB(Index: Byte = 0): TBasicGroupSettings); zwar noch geht,
es aber hier procedure SetB(Index: Byte = 0; Value: TBasicGroupSettings {= nil}); leider nicht.
$2B or not $2B

Geändert von himitsu ( 7. Jul 2022 um 13:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 16:13 Uhr.
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