AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Rolf Frei · begonnen am 18. Jul 2022 · letzter Beitrag vom 5. Sep 2022
Antwort Antwort
Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 18. Jul 2022, 19:04
Delphi-Version: 5
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?!

Geändert von Rolf Frei (18. Jul 2022 um 19:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 18. Jul 2022, 19:41
Dabei wird einfach nur bis zum Ende des Strings kopiert. Das ist also wie:
Copy(Value, 1, MaxInt);

Das kannst du ja auch einfach selbst testen:
Delphi-Quellcode:
  var a := 'Testen';
  ShowMessage(Copy(a, 2));
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 18. Jul 2022, 20:01
Zitat:
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.
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.
A := Copy(B);
$2B or not $2B

Geändert von himitsu (18. Jul 2022 um 20:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 18. Jul 2022, 22:39
dann entspricht es eigentlich einem UniqueString.
var S: string := UniqueString(Value);
Ähem, UniqueString ist eine procedure und keine function .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 18. Jul 2022, 23:00
ups

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

oder

Delphi-Quellcode:
procedure TField.SetEditText({const} Value: string);
begin
  if Assigned(FOnSetText) then
  begin
    UniqueString(Value);
    FOnSetText(Self, Value);
  end
  else
    SetText(Value);
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 19. Jul 2022, 00:26
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 19. Jul 2022, 10:46
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 19. Jul 2022, 10:55
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 )

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)
$2B or not $2B

Geändert von himitsu (19. Jul 2022 um 11:13 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 19. Jul 2022, 13:31
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.
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 5. Sep 2022, 14:25
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.
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...
Dennis
  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 23:23 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