Hallo,
ich habe mal wieder eine Frage: Was ist Euer Meinung nach besser? Als lokale Variable den Record selber zu nehmen, oder einen POointer auf diesen? Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| Typ pRec = ^Rec; Rec = record Var1 , Var2 : extended; end;
function TueWas(const Wert1, Wert2 : extended) : extended; var LokalRec : Rec; begin LokalRec.Var1 := Wert1; LokalRec.Var2 := Wert2; Result := LokalRec.Var1 * LokalRec.Var2; end;
function TueWasAnderes(const Wert1, Wert2 : extended) : extended; var pLokalRec : pRec; begin pLokalRec^.Var1 := Wert1; pLokalRec^.Var2 := Wert2; Result := pLokalRec^.Var1 * pLokalRec^.Var2; end; |
Oder gibt es da keine Unterschiede? Bei einem habe ich schon etwas entdeckt, und das ist, wenn z.B. der Typ Rec in einer Class auftaucht, als Variable:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type pRec = ^Rec; Rec = record Var1 , Var2 : extended; end;
: TD = Class(TList); RecVar : Rec; end; TForm = Class(TForm); function TueWas(const Wert1, Wert2 : extended) : extended; end;
var Daten : TD; Form : TForm; |
Dann funktioniert z.B.
Delphi-Quelltext
1:
| Daten.RecVar.Var1 := Wert1 |
Fehler: Der linken Seite kann nichts zugewiesen werden. Erst die Überführung in eine lokale Variable des Typs Rec löst dann das Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TForm.TueWas(const Wert1, Wert2 : extended) : extended; var LokalRec : Rec; begin LokalRec := Daten.RecVar; LokalRec.Var1 := Wert1; LokalRec.Var2 := Wert2; Result := LokalRec.Var1 * LokalRec.Var2; end; |
Ich hoffe, ich habe das Ganze einleuchtend dargestellt. Ich habe in meinen Programmen oft Listen mit komplexen Strukturen (u.a. Analysenergebnisse (Konzentrationen, Elemente, Sollwerte, Vergleiche, Korrekturflags ....) und daher habe ich häufig solche Mehrfachreferenzierungen. Ich habe festgestellt, dass - die Daten stammen aus Datenbanken - das einmalige Erzeugen solch einer Liste und die nachfolgenden Operationen an dieser Liste und das abschließende Speichern der geänderten Daten in die Datenbank sehr viel schneller ablaufen als dauernd in der Datenbank "herumzuwühlen". Wie gesagt, Analysenergebnisse (z.B. Stahl mit 26 Elementen pro Analyse, 1-25 verschiedene Proben pro Auftrag und dazu noch Vergleichsproben. Da lohnt es sich schon, die Daten zu übertragen. Ich rede hier von 10 Sekunden statt 10 Minuten Abarbeitungszeit (z.B. für Korrelationsanalysen, Vergleiche mit Sollwerkstoffen, Veränderungen von Nachkommastellen und erneute Vergleiche ....). Das nur zum Hintergrund meines Anliegens.
Danke schon mal für Anmerkungen, Hinweise und Tips.
Gunther
Toleranz ist eine Grundvoraussetzung für das Leben.