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

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

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

  Alt 18. Jul 2022, 19: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);
Ein Therapeut entspricht 1024 Gigapeut.

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

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

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

  Alt 18. Jul 2022, 21: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.550 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 18. Jul 2022, 22: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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 18. Jul 2022, 23: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)
2.058 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 19. Jul 2022, 09: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
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 19. Jul 2022, 09: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)
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 19. Jun 2006
656 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 19. Jul 2022, 12: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
496 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 5. Sep 2022, 13: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 01:00 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