AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Kurzreferenz
Tutorial durchsuchen
Ansicht
Themen-Optionen

Delphi Kurzreferenz

Ein Tutorial von Luckie · begonnen am 20. Dez 2010 · letzter Beitrag vom 7. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 16:50
Notiert. Danke für den Hinweis.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 16:53
Hallo Luckie,

was ich mir häufig nicht merken kann (und deshalb in einer Kurzreferenz gerne enthalten sehen würde) ist die Frage, ob über eine einfache Zuweisung Strukturen kopiert werden oder ggf. nur eine Referenz. (Arrays, Records, Objekte, etc.)
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 17:47
Ich hab's nur kurz überflogen,

das ist SAHNE!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 20:00
Hallo Luckie,

was ich mir häufig nicht merken kann (und deshalb in einer Kurzreferenz gerne enthalten sehen würde) ist die Frage, ob über eine einfache Zuweisung Strukturen kopiert werden oder ggf. nur eine Referenz. (Arrays, Records, Objekte, etc.)
Könntest du mal bitte ein Beispiel machen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 21:37
leider wurde schon seit ewigen Zeiten und immernoch in XE ein bissl was vergessen.
Delphi-Quellcode:
var
  s, t: String;
  a, b: array of Byte;

s := '12345';
t := s;
t[3] := '-';
// s = '12345'
// t = '12-45'

a := (1, 2, 3, 4, 5);
b := a;
b[3] := 888;
// a := (1, 2, 888, 4, 5)
// b := (1, 2, 888, 4, 5)
beim Schreibzugriff sollte ja, sobald mehrere Referenzen auf die selben Array-Daten zeigen, das zu beschreibende Array kopiert werden, bevor der Schreibzugriff startet.

PS: String entspricht einem quasi einem aufgemotzten array of Char
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 21:53
leider wurde schon seit ewigen Zeiten und immernoch in XE ein bissl was vergessen.
Delphi-Quellcode:
var
  a, b: array of Byte;

a := (1, 2, 3, 4, 5);
b := a;
b[3] := 888;
// a := (1, 2, 888, 4, 5)
// b := (1, 2, 888, 4, 5)
beim Schreibzugriff sollte ja, sobald mehrere Referenzen auf die selben Array-Daten zeigen, das zu beschreibende Array kopiert werden, bevor der Schreibzugriff startet.

PS: String entspricht einem quasi einem aufgemotzten array of Char
Jetzt mußt Du nu nur noch verraten, wie Du 888 in ein Byte unterbringen kannst, und es offensichtlich wieder auslesen kannst! Oder hast Du etwas geschummelt ohne nachzudenken?
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 08:45
@himitsu:
Dafür gibt es ja die Funktion Copy.
b := Copy(a);

Allgemein:
Es muss eig. nicht immer inherited aufgerufen werden. Bei Konstruktoren schon gar nicht und bei Destruktoren kann man es weg lassen, wenn man von TObject ableitet
Auch dass inherited als letzte Anweisung im Destruktor stehen muss finde ich so nicht richtig. In den meisten Fällen wir dies wohl stimmen, aber es gibt auch Szenarien, wo es so nicht geht.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 16:50
Allgemein:
Es muss eig. nicht immer inherited aufgerufen werden. Bei Konstruktoren schon gar nicht und bei Destruktoren kann man es weg lassen, wenn man von TObject ableitet
Wenn man im Konstruktor das inherited nicht aufruft, dann wird keiner der ererbten Konstruktoren aufgerufen.
Das kann zu Zugriffsfehlern führen, wenn dadurch z.B. in der Basisklasse eingebettete Objekte nicht angelegt werden.
Beim Destruktor kann ein fehlendes inherited zu Speicherlecks und Resourcenverlust führen.
Man ist nur dann auf der sicheren Seite wenn man grundsätzlich immer inherited verwendet.
Der Name der Basisklasse ist ja ganz leicht von TObject auf eine andere Klasse geändert;
wenn man im Konstruktor oder Destruktor schlampig war können leicht (sehr heimtückische) Probleme auftreten.

Auch dass inherited als letzte Anweisung im Destruktor stehen muss finde ich so nicht richtig. In den meisten Fällen wir dies wohl stimmen, aber es gibt auch Szenarien, wo es so nicht geht.
Nach dem Aufruf von inherited ist das Objekt freigegeben, jeder Zugriff auf ein Feld des Objekt ist also ein Zugriff auf ungültigen Speicher.
Oftmals bleibt der Zugriff auf den freigegebenen Speicher folgenlos, aber man hat eine tickende Zeitbombe im Sourcecode!
Delphi-Quellcode:
destructor TKlasseXY.Destroy; // Beispiel für potentiell gefährlichen Code
begin
  inherited;
  // Ab diesem Zeitpunkt ist "FHandle" ungültiger Speicher
  CloseHandle(FHandle); // dieser Aufruf kann zu einer Zugriffsverletzung führen
end;
Also ich kenne kein Szenario in dem es nötig wäre nach den Aufruf von inherited noch etwas anderes zu tun.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 17:07
War ja klar das meine Worte wieder mal angezweifelt werden und ich als doof abgestempelt werde

Beispiel aus der Classes.pas, wo KEIN inherited stehen sollte:
Delphi-Quellcode:
constructor TStringStream.Create;
begin
  Create('', TEncoding.Default, False);
end;
Solche Konstrukte gibt es zu tausenden. Es zu einem Dogma zu machen, dass in einem Konstruktor inherited vorkommen muss, ist somit einfach nicht richtig.

Beispiel, wo der geerbte Konstruktor und Destruktor nicht in der dogmatisch genannten Reihenfolge aufgerufen werden:
Delphi-Quellcode:
constructor TAbgeleiteteKlasse.Create;
begin
  FStream := TMemoryStream.Create;
  inherited Create(FStream);
end;

destructor TAbgeleiteteKlasse.Destroy;
begin
  inherited; // Könnte ja auf den übergebenen Stream noch zugreifen.
  FStream.Free;
end;
Ich kenne auch niemanden, der jüdischen Glaubens wäre. Und trotzdem gibt es Juden
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Delphi Kurzreferenz

  Alt 5. Jan 2011, 21:57
Hallo Luckie,

was ich mir häufig nicht merken kann (und deshalb in einer Kurzreferenz gerne enthalten sehen würde) ist die Frage, ob über eine einfache Zuweisung Strukturen kopiert werden oder ggf. nur eine Referenz. (Arrays, Records, Objekte, etc.)
Könntest du mal bitte ein Beispiel machen?
Ja:

Delphi-Quellcode:
type
  TMyArray = array[1..5] of Integer;
  TMyRec = record
    intVal: Integer;
    eVal: Extended;
  end;

var
  a1, a2: TMyArray;
  rec1, rec2 : TMyRec;
  ...

begin
  for i := 1 to 5 do
    a1[i] := i;

  a2 := a1;

  // enthält jetzt a2 eine komplette Kopie for a1 oder ist es nur eine Referenez auf a1?

  a1[3] := 12;

  // was ist jetzt a2[3] ?

  rec1.intVal := 4;
  rec1.eVal := 3.1415;

  rec2 := rec1;
  // was enthält jetzt rec2 ?

  // und wie sieht es bei 2 Objekten derselben Klasse aus?
Das wären jetzt ein paar Beispiele.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:47 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