Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Copy(S, 1) macht was? Wo ist der 3 Parameter? (https://www.delphipraxis.net/211034-copy-s-1-macht-wo-ist-der-3-parameter.html)

Rolf Frei 18. Jul 2022 18:04

Delphi-Version: 5

Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Habe in Data.DB.pas im folgenden Code ein Copy() gefunden, das ich so nicht kenne:
Delphi-Quellcode:
procedure TField.SetEditText(const Value: string);
begin
  if Assigned(FOnSetText) then
  begin
    var S: string := Copy(Value, 1);
    FOnSetText(Self, S);
  end
  else
    SetText(Value);
end;
Diese Zeile mit dem Copy ist in D11 dazugekommen und unterscheidet sich von D10.3. Mich hat nun gewundert was dieser Copy Befehle da genau macht, da ich den nur mit 3 Prametern kenne. Ein Blick in die System Unit hat auch nicht geholfen, da dort der Befehl auch 3 Parameter hat und keiner davon eine Default zu sein scheint. Jemand eine Idee was da wirklich gemacht wird und wieso man den betroffen Code so angeändert hat? Früher wurde da FOnSetText(Self, Value) aufgerufen und hier sieht es aus, als würde nur das 1. Zeichen als Feldtext übergeben?!

jaenicke 18. Jul 2022 18:41

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Dabei wird einfach nur bis zum Ende des Strings kopiert. Das ist also wie:
Delphi-Quellcode:
Copy(Value, 1, MaxInt);


Das kannst du ja auch einfach selbst testen:
Delphi-Quellcode:
  var a := 'Testen';
  ShowMessage(Copy(a, 2));

himitsu 18. Jul 2022 19:01

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Zitat:

Delphi-Quellcode:
var S: string := Copy(Value, 1);

Falls es hier kein {$ZeroStrings ON} ist (also ab zweitem Zeichen, nicht ab dem Ersten, Welches 0 wäre),
dann entspricht es eigentlich einem UniqueString.
Delphi-Quellcode:
var S: string := UniqueString(Value);

(falls doch, dann MaxInt ... siehe jaenicke)

k.A. warum man das dann nicht direkt verwendet hat
und wozu das hier überhaupt gemacht wird.



Bei dynamischen Arrays kann man hier auch den zweiten Parameter weglassen, um das "Gleiche" zu erreichen ... k.A. warum hier die Version für Strings nicht "identisch" reagiert.
Delphi-Quellcode:
A := Copy(B);

Uwe Raabe 18. Jul 2022 21:39

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Zitat:

Zitat von himitsu (Beitrag 1508890)
dann entspricht es eigentlich einem UniqueString.
Delphi-Quellcode:
var S: string := UniqueString(Value);

Ähem, UniqueString ist eine
Delphi-Quellcode:
procedure
und keine
Delphi-Quellcode:
function
.

himitsu 18. Jul 2022 22:00

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
ups :oops:

Delphi-Quellcode:
var S: string := Value;
UniqueString(S);

oder :freak:

Delphi-Quellcode:
procedure TField.SetEditText({const} Value: string);
begin
  if Assigned(FOnSetText) then
  begin
    UniqueString(Value);
    FOnSetText(Self, Value);
  end
  else
    SetText(Value);
end;

Uwe Raabe 18. Jul 2022 23:26

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Da sowohl SetEditText als auch FOnSetText einen const string erwarten, erschließt sich mir der Sinn dieses Kopierens noch nicht. Das wäre vielleicht einen Kommentar wert gewesen.

QuickAndDirty 19. Jul 2022 09:46

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1508900)
Da sowohl SetEditText als auch FOnSetText einen const string erwarten, erschließt sich mir der Sinn dieses Kopierens noch nicht. Das wäre vielleicht einen Kommentar wert gewesen.

Ich denke auch wenn man eine String kopie braucht kann man die doch innerhalb des ereignisses erstellen.

Vielleicht ist der Code Hilfscode zum Debuggen, den man vergessen hat zu entfernen.

himitsu 19. Jul 2022 09:55

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Wenn es sich hier um einen internen Puffer/String handeln würde,
dann könnte man es auch noch verstehen, wenn man ihn nicht direkt raus gibt.
(nicht dass wer böse pointert und den Inhalt der CONST verändert :stupid:)

Aber hier kommt Value ja von extern und hat diese DB-Klasse garnicht zu interessieren.




Vermutlich:
  • jemand gibt von außen einen uniquen String rein
    • durch das CONST wird der Referenzzähler nicht hochgezählt (obwohl die Parameter ja eigentlich nun eine "Kopie" haben)
  • und dann ist jemand so blöd unvorsichtig und greift aus dem Event raus auf diese externe Variable zu und ändert sie, dann rauscht das nachträglich die Parameter durch
    • werden nur Chars geändert, dann geht die Änderung durch (Variable und Parameter zeigen ja auf den selben Speicher)
    • wird der String selber verändert (Speicher verschoben/freigegeben), dann zeigen die Parameter nun ins Nirvana (zeigen immernoch auf die alte Adresse)

Aber ganz im Ernst, dann läßt man eben das CONST weg und Gut ist. (die Referenzzählung funktioniert wieder und bei Änderung wird eine Kopie angelegt)
(wenn beim OnSetText, anstatt SetEditText, dann passiert es nur beim Eventaufruf innerhalb des IF)

Das "Unique" macht hier aber IMHO wirklich keinen Sinn. (ein Kommentar wäre tatsächlich von Nöten gewesen)

Rolf Frei 19. Jul 2022 12:31

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Danke für eure Beiträge. Da bin ich ja erleichtert, dass ich nicht der einzige bin, der den Sinn dieser Änderung nicht nachvollziehen kann.

Dennis07 5. Sep 2022 13:25

AW: Copy(S, 1) macht was? Wo ist der 3 Parameter?
 
Zitat:

Zitat von himitsu (Beitrag 1508890)
Bei dynamischen Arrays kann man hier auch den zweiten Parameter weglassen, um das "Gleiche" zu erreichen ... k.A. warum hier die Version für Strings nicht "identisch" reagiert.
Delphi-Quellcode:
A := Copy(B);

Joa, oder halt einfach A.SubString(0) anstelle von Copy(A, 1) verwenden. Damit hast du eh immer einen Zero-Offset.
Aber noch einfacher wäre es natürlich mit String.Copy(A): Kein Rumgefussle mehr mit UniquString und irgendwelchen temporären Variablen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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