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
Benutzerbild von himitsu
himitsu

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 18:29
(pars[0]+'_B', ['path_B' , 'first_frame_B' , ...

(pars[0], ['path' , 'first_frame' , ...


Schneller ist es nur bedingt ... eher fast gleich schnell oder vielleicht eine Millisekunde langsamer (ein Funktionsaufruf, aber gleich viele String-Vergleiche),
aber es macht den Code kürzer und ohne die viele IF....THEN dazwischen auch etwas übersichlicher.

Hier die 123: als Konstante oder mit {Name}123: , erspart sich, da der Kommentar/Name bereits als .path := dran steht.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Jul 2022 um 18:36 Uhr)
  Mit Zitat antworten Zitat
neumimnemecky

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 18:42
(pars[0]+'_B', ['path_B' , 'first_frame_B' , ...

(pars[0], ['path' , 'first_frame' , ...


Schneller ist es nur bedingt ... eher fast gleich schnell oder vielleicht eine Millisekunde langsamer (ein Funktionsaufruf, aber gleich viele String-Vergleiche),
aber es macht den Code kürzer und ohne die viele IF....THEN dazwischen auch etwas übersichlicher.

Hier die 123: als Konstante oder mit {Name}123: , erspart sich, da der Kommentar/Name bereits als .path := dran steht.

Den letzten Satz verstehe ich nicht. Aber eine Millisekunde langsamer wäre viel. Hatten Sie nicht eine Mikrosekunde im Sinn?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#3

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 18:47
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;
  Mit Zitat antworten Zitat
neumimnemecky

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 19:03
Nein, die ini ist ein Wrapper - sie enthält viele Einstellungen zu Suchfarben, Text, Bildern usw. Das würde sie verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 19:33
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:
// 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
Letztes wie die vielen IFs
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.
AnsiIndexStr(AnsiLowerCase(S), ['FirstFilename', 'CheckIfFilesExist', ...])

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-Referenz durchsuchenTArray.BinarySearch, bzw. im Datenbank-Sprech: IndexScan), anstatt einer Volltextsuche (FullTableScan).



Delphi-Quellcode:
// AnsiIndexStr ist wie

if S = 'Athen ...
else if S = 'Bthen ...
else if S = 'Cthen ...

if AnsiSameStr(S, 'Athen ...
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 ...
Vorteil von IndexText vs. SameText/LowerCase ist, dass das S nur einmal, anstatt in jeder Zeile neu angepasst wird.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Jul 2022 um 19:45 Uhr)
  Mit Zitat antworten Zitat
neumimnemecky

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 19:40
Ich bin mit der jetzigen Lösung zufrieden.
Code:
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;
Ich denke, es ist nur eine Schande, dass ich etwas nicht mit Stil verwenden kann
Code:
ini.basic[group].check_files_exist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 19:49
Ich denke, es ist nur eine Schande, dass ich etwas nicht mit Stil verwenden kann
Könnte man schon, wenn man will
Delphi-Quellcode:
record // oder class
  A: TIrgendwas;
  B: TIrgendwas;
  C: TIrgendwas;
  property basic[S: string]: TIrgendwas read ... write ...; // die Getter/Setter nicht vergessen
end;
Zum Auslesen kein Problem ... beim Zuweisen mit Records muß man "bissl" aufpassen/rumpfuschen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
neumimnemecky

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

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 6. Jul 2022, 20:11
Ich denke, es ist nur eine Schande, dass ich etwas nicht mit Stil verwenden kann
Könnte man schon, wenn man will
Delphi-Quellcode:
record // oder class
  A: TIrgendwas;
  B: TIrgendwas;
  C: TIrgendwas;
  property basic[S: string]: TIrgendwas read ... write ...; // die Getter/Setter nicht vergessen
end;
Zum Auslesen kein Problem ... beim Zuweisen mit Records muß man "bissl" aufpassen/rumpfuschen.
"property name declaration read ... write ..." Ich habe etwas Ähnliches in C/C++ gesehen, aber es ist eine sehr komplexe Sprache (programming language?) für mich. Hier muss ich Wissen hinzufügen. Wonach soll ich suchen? (englischer Begriff oder Name, lerne ich hauptsächlich von http://delphibasics.co.uk)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: einen Datensatzmitgliedsnamen dynamisch zuweisen

  Alt 7. Jul 2022, 06:31
Ich bin mit der jetzigen Lösung zufrieden.
Code:
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;
Da ist noch Luft nach oben.
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);

Geändert von freimatz ( 7. Jul 2022 um 07:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:02 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