![]() |
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Ginge es eventuell auch so?
Delphi-Quellcode:
var
ini : TBasicSettings; begin case group of 'A' : ini := ini.basic.A; 'B' : ini := ini.basic.B; end; case AnsiIndexText(pars[0], ['path', 'first_frame', 'end_frame', 'first_filename', 'check_if_files_exist']) of // Wenn pars[0] immer in Kleinbuchstaben vorliegt, ginge auch // case AnsiIndexStr(pars[0], ['path', 'first_frame', 'end_frame', 'first_filename', 'check_if_files_exist']) of // das spart dann auch noch die Verpflichtung, // beim Vergleich nicht zwischen Groß- und Kleinschreibung zu unterscheiden. 0: ini.path := pars[1]; 1: ini.first := pars[1]; 2: ini.last := pars[1]; 3: ini.start_name := pars[1]; 4: ini.check_files_exist := true; end; end; |
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Nein, die ini ist ein Wrapper - sie enthält viele Einstellungen zu Suchfarben, Text, Bildern usw. Das würde sie verlieren.
|
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Der Funktionsaufruf ist nur einen "Hauch" langsamer ('ne Hand voll CPU-Takte),
dagegen beim case-insensitven braucht der eine Parameter nur einmal kleingemacht werden, anstatt mehrmal je Zeile/IF.
Delphi-Quellcode:
Letztes wie die vielen IFs
// turborennschnecke
if TArray.BinarySearch(['a', 'b', 'c'], AnsiLowerCase(S)) // kleingeschrieben und sortiert // und natürlich ist ein if AnsiIndexStr(AnsiLowerCase(S), ['a', 'b', 'c']) // Suchwerte direkt kleingeschrieben // schneller/optimaler als ein if AnsiIndexText(S, ['A', 'B', 'C']) // und noch schneller als if AnsiIndexStr(AnsiLowerCase(S), [AnsiLowerCase('A'), AnsiLowerCase('B'), AnsiLowerCase('C')]) // fast gleichschnell wie K := AnsiLowerCase(S); if K = AnsiLowerCase('A') if K = AnsiLowerCase('B') if K = AnsiLowerCase('C') // aber schneller als if AnsiLowerCase(S) = AnsiLowerCase('A') if AnsiLowerCase(S) = AnsiLowerCase('B') if AnsiLowerCase(S) = AnsiLowerCase('C') // und die bummelschnecke die RTTI (siehe vorher) ist am Kürzesten, aber dafür ist "langsam" etwas untertrieben ... aber eben einfach ... dagegen aber auch vom Compiler nicht validierbar, weil erst zur Laufzeit und die ersten Beiden ... halt wie der Code schöner Lesbar ist. Kommt halt drauf an, wie man es sieht ... lieber 'nen Hauch langsamer, aber dafür einfach/lesbar, oder eben nur schnell.
Delphi-Quellcode:
AnsiIndexStr(AnsiLowerCase(S), ['FirstFilename', 'CheckIfFilesExist', ...])
Delphi-Quellcode:
AnsiIndexText(S, ['firstfilename', 'checkiffilesexist', ...])
Wobei schnell, da nimmt man dann ein Directory, bzw. eine "sortierte" Liste/Array und macht dann eine binäre Suche ( ![]()
Delphi-Quellcode:
Vorteil von IndexText vs. SameText/LowerCase ist, dass das
// AnsiIndexStr ist wie
if S = 'A' then ... else if S = 'B' then ... else if S = 'C' then ... if AnsiSameStr(S, 'A' then ... else if AnsiSameStr(S, 'B') then ... else if AnsiSameStr(S, 'C') then ... // AnsiIndexText ist wie if AnsiLowerCase(S) = AnsiLowerCase('A') then ... else if AnsiLowerCase(S) = AnsiLowerCase('B') then ... else if AnsiLowerCase(S) = AnsiLowerCase('C') then ... if AnsiSameText(S, 'A') then ... else if AnsiSameText(S, 'B') then ... else if AnsiSameText(S, 'C') then ...
Delphi-Quellcode:
nur einmal, anstatt in jeder Zeile neu angepasst wird.
S
|
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Ich bin mit der jetzigen Lösung zufrieden.
Code:
Ich denke, es ist nur eine Schande, dass ich etwas nicht mit Stil verwenden kann
if group = 'A' then
case AnsiIndexText(pars[0], ['path', 'first_frame', 'end_frame' , 'first_filename' , 'check_if_files_exist']) oF 0: ini.basic.A.path := pars[1]; 1: ini.basic.A.first := pars[1]; 2: ini.basic.A.last := pars[1]; 3: ini.basic.A.start_name := pars[1]; 4: ini.basic.A.check_files_exist := true; end else if group = 'B' then case AnsiIndexText(pars[0], ['path' , 'first_frame' , 'end_frame' , 'first_filename', 'check_if_files_exist']) oF 0: ini.basic.B.path := pars[1]; 1: ini.basic.B.first := pars[1]; 2: ini.basic.B.last := pars[1]; 3: ini.basic.B.start_name := pars[1]; 4: ini.basic.B.check_files_exist := true; end;
Code:
ini.basic[group].check_files_exist
|
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Zitat:
Delphi-Quellcode:
Zum Auslesen kein Problem ... beim Zuweisen mit Records muß man "bissl" aufpassen/rumpfuschen.
record // oder class
A: TIrgendwas; B: TIrgendwas; C: TIrgendwas; property basic[S: string]: TIrgendwas read ... write ...; // die Getter/Setter nicht vergessen end; |
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Zitat:
![]() |
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
![]() ![]() in älteren Delphis ging eine Überladung nicht (mehrere Array-Property), aber wenn, dann gingen sie nur als Default-Property, und in noch älteren Delphi ging es nur in Klassen aber noch nicht in Records. Und die string-like Array-Operatoren gab es im Delphi 7 auch noch lange nicht.
Delphi-Quellcode:
var X, Y: array of Integer;
X := [4, 5, 6]; Y := [7]; // SetLength(Y, 1); Y[0] := 7; X := X + Y; X := X + [1, 2, 3]; Insert(9, X, 2); // [4, 5, 9, 6, 7, 1, 2, 3] ![]() ![]() ![]() |
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Ich bin im Abschnitt "Indexspezifizierer" (Index Specifiers) verloren. Warum verwenden sie im Folgenden keine Klammern []? "property Left: Longint index 0 read GetCoordinate "
![]() |
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Das ist was Anderes.
Über "diesen" Index kann man für mehrere Property den selben Getter/Setter verwenden.
Delphi-Quellcode:
Man kann den Index einfach einfach nur zur Verwendung der Erkennung welches Irgendwas# gemeint ist nutzen,
property IrgendwasA: TSonstwas index 1 read GetItgendwas ...
property IrgendwasB: TSonstwas index 2 read GetItgendwas ... property IrgendwasC: TSonstwas index 3 read GetItgendwas ... oder man kann diese 32 Bit auch verwende, u darin was zu Kodieren. z.B. Property für den Zugriff auf einen/mehrere Bits (Bismaske) und darin codieren welche/wieviele Bits jeweils gemeint sind. Oder man kann auch jeden anderen Ordinalen Typen dort angeben (z.B. Konstanten/Enums)
Delphi-Quellcode:
z.B. im Getter/Setter mit Index "rechnen",
const cA = 1; // = Ord('A');
property IrgendwasA: TSonstwas index cA read GetItgendwas ... property IrgendwasB: TSonstwas index cB read GetItgendwas ... type TIrgendwasEnum = (iwA, iwB); property IrgendwasA: TSonstwas index Ord(iwA) read GetItgendwas ... property IrgendwasB: TSonstwas index Ord(iwB) read GetItgendwas ... das als Index für eine Array/Liste-Variable verwenden oder für ein
Delphi-Quellcode:
bzw.
CASE index OF
Delphi-Quellcode:
oder ...
CASE TIrgendwasEnum(index) OF
|
AW: einen Datensatzmitgliedsnamen dynamisch zuweisen
Zitat:
a) Lokale Variablen mit schönen Namen verwenden und pars[0] bzw pars[1] zuweisen. b) Prozedur machen für den doppelten Code und übergeben von ini.basic.A oder ini.basic.B. Dann spart man sich den doppelten Code. Dann der Aufruf: Mach(group, 'A', pars[0], pars[1], ini.basic.A); Mach(group, 'B', pars[0], pars[1], ini.basic.B); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 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