![]() |
Move innerhalb von TBytes
Folgende Situation:
TB:TBytes mit 1000 Bytes. Jetzt dieser Code:
Delphi-Quellcode:
Funktionieren tut es. Ist das sinnvoll? Sollte man über eine Temp-Variable gehen? Wobei wird am wenigsten Aufwand betrieben (umkopieren etc.)?
Move(TB[200],TB[0],800;
SetLength(TB,800); |
AW: Move innerhalb von TBytes
Würde ich mir jetzt keine Gedanken machen und einfach Delete aufrufen. Das funktioniert auch mit anderen Array-Typen.
Delphi-Quellcode:
Delete(TB, 0, 200);
|
AW: Move innerhalb von TBytes
Tatsächlich so einfach? Ich hatte schwer rumgesucht und war unter anderem auf
![]() Egal, das ist ja schön, danke. |
AW: Move innerhalb von TBytes
Joar, aber erschreckender Weise wurden diese string-like Array-Operatoren erst im Delphi 10.1 eingeführt, wenn ich mich nicht irre.
+ , Insert und Delete ... Copy ging schon vorher ![]() ![]() ![]() Über die Record-Operatoren könnte man sich sowas aber auch schon früher selbst bauen. |
AW: Move innerhalb von TBytes
Ich benutze noch teilweise selbstgebaute, mit Move und Pointern ...
aber möchte auch generell auf die "Neuen" umstelllen. Gibt es vielleicht irgendwo einen Benchmark zu den String-Like Funktionen ? Wäre gut mal zu sehen wie performant die wirklich sind. (Bei Delphi hatte ich schon öfters mal zu hohe Erwartungen :stupid:) |
AW: Move innerhalb von TBytes
Zitat:
Delphi-Quellcode:
?! Ich glaub's nicht.
string.Join
|
AW: Move innerhalb von TBytes
Zu cool um wahr zu sein?
![]() Und nee, nicht getestet. Aber bis auf Ausnahmen versuche ich die Standardfunktionen zu verwenden, bevor ich eigenes Einbau. (weniger eigener Code = theoretisch weniger Fehler) |
AW: Move innerhalb von TBytes
Zitat:
Ich finde aber, hier überwiegt Lesbarkeit und Wartbarkeit. Sollte es wirklich zu Performance-Problemen kommen, kann man ja immer noch auf den nativen Ansatz zurückgreifen. Aber eben auch nur dann. |
AW: Move innerhalb von TBytes
Zitat:
Zitat:
|
AW: Move innerhalb von TBytes
Zitat:
|
AW: Move innerhalb von TBytes
Zitat:
![]() Daher sind auch Einige der neuen Funktionen in den Record-Helper bissl delphi-untypisch/unhandlich. |
AW: Move innerhalb von TBytes
Jetzt lese ich deinen Link durch und denke: "Ja, und warum haben sie dann nicht auch
Delphi-Quellcode:
implementiert, das wäre doch mal vernünftig!" Vorsichtshalber suche ich mal und tatsächlich, das gibt es, und wo? In System.SysUtils.TIntegerHelper! Ja, klar, wenn ich einen String konvertieren möchte, dann suche ich doch bei Integer.
TryParse
Hab's mal probiert:
Delphi-Quellcode:
Welcher Logik folgt sowas?
var i:integer;
begin If i.TryParse('1',i) then ... |
AW: Move innerhalb von TBytes
Damit es nicht auffällt, dass auch Anderes fehlt. :lol:
|
AW: Move innerhalb von TBytes
Zitat:
Delphi-Quellcode:
Deutlicher wird es ohne das Try:
var i:integer;
begin If Integer.TryParse('1',i) then ...
Delphi-Quellcode:
var i:integer;
begin i := Integer.Parse('1') |
AW: Move innerhalb von TBytes
Ja, verstehe. Trotzdem empfinde ich das als irgendwie unpassend. Allenfalls bei deinem zweiten Beispiel stellt sich so etwas wie eine Logik ein. Naja, egal. Man ist versucht zu sagen: CodeInsight geht nicht, aber für sowas hamse Zeit.
|
AW: Move innerhalb von TBytes
Diese Operatoren kannst auch selbst erweitern, wenn dir was fehlt oder etwas besseres einfällt. (es wäre nur einfacher, wenn die "vererbung" nicht so unglücklich gelöst wäre)
|
AW: Move innerhalb von TBytes
Ich nehme immer noch gerne TryStrToInt oder StrToIntDef.
Weil letzendlich die Parse und TryParse Funktionen diese auch benutzen, welche aber nicht inline sind. Am Ende der Kette wird bei Ganzzahlen wohl immer Val() benutzt, auch das könnte mal Sinn machen, benutze ich aber auch nicht direkt.
Delphi-Quellcode:
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var E: Integer; begin Val(S, Value, E); Result := E = 0; end; |
AW: Move innerhalb von TBytes
Jo,
![]() Wobei Val anstelle von TryStrToInt, hat nur dann einen Vorteil hat, wenn man wirklich mal die Fehlerposition wissen möchte ... ansonsten schleppt man nur sinnlos die ungenutzte Variable mit sich rum.
Delphi-Quellcode:
S := Edit1.Text;
Val(S, i, E); if i > 0 then begin Edit1.SetFocus; Edit1.SelStart := E; Edit1.SelLength := 9999; raise Exception.Create('ungültige Zahl'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 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