Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Der linken Seite wird nichts zugewiesen "Extended Version" (https://www.delphipraxis.net/177107-der-linken-seite-wird-nichts-zugewiesen-extended-version.html)

Bjoerk 16. Okt 2013 14:22

Delphi-Version: 2007

Der linken Seite wird nichts zugewiesen "Extended Version"
 
Ich hab folgende Records und eine Liste (Code ist schon etwas älter).

Delphi-Quellcode:
TQuer = record
private
  FIntergers, FFloats, FString..
public
  property Intergers, Floats, String.. read ... write ...
  procedure Clear;
end;

TStab = record
public
  QuerLeft: TQuer;
  QuerRight: TQuer;
  ..
  procedure CheckQuerRight;
end;

procedure TStab.CheckQuerRight;
var
  AQuer: TQuer;
begin
  AQuer.Clear;
  if QuerRight.Compare(AQuer) then
    QuerRight := QuerLeft;
end;

TStabList = class
private
  FItems: array of TStab;
public
  property Items[Index: integer]: TStab read GetItem write SetItem; default;
end;
Wenn ich von außen mit einer Instanz von TStabList ausführe
Delphi-Quellcode:
FStabList[I].CheckQuerRight;
werden die Werte nicht in FStabList[I] übernommen?

Ist mir unverständlich? Ich hab doch QuerLeft bzw QuerRight public? :gruebel:

uligerhardt 16. Okt 2013 14:28

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Wenn ich's richtig sehe, ist das Problem, dass FStabList[I] per Wert einen temporären Record zurückliefert. Du erhältst keine Referenz auf den Record innerhalb von FItems! Auf diesem temporären Record führst du dann CheckQuerRight aus, und das schreibt auch brav alles da rein, was rein muss. Nur danach löst sich der temporäre Record in Luft auf... und das war's.

Zwei schnelle Lösungen, die mir einfallen, wären:
  • Führe eine Property ein, die einen Zeiger auf TStab zurückliefert.
  • Mache FItems public.
Beides nicht soooo elegant. :mrgreen:

Bjoerk 16. Okt 2013 14:33

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Hallo Uli,
versteh ich dennoch nicht? Das wird doch innerhalb der Klasse TStab geändert. Da ist der Wert doch verfügbar und keine temporäre Kopie?

Gruß
Thomas

Edit: Ja, find ich auch nicht so schön, dann hab ich keine default property mehr.

Mikkey 16. Okt 2013 14:39

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Zitat:

Zitat von Bjoerk (Beitrag 1232192)
Hallo Uli,
versteh ich dennoch nicht? Das wird doch innerhalb der Klasse TStab geändert. Da ist der Wert doch verfügbar und keine temporäre Kopie?

TStab ist keine Klasse, eine Funktionsrückgabe von Record macht eine Kopie


Zitat:

Zitat von Bjoerk (Beitrag 1232192)
Edit: Ja, find ich auch nicht so schön, dann hab ich keine default property mehr

Mach' aus TStab eine Klasse und alles ist gut

Bjoerk 16. Okt 2013 14:46

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Logo, als KLasse und TObjectlist, so würde ich das auch heute machen..

BTW, es gibt keinen Funktionsaufruf sondern die Klasse TStab ändert intern eine Variable. Beim anschließenden Read eines Items sollte der doch verfügbar sein ??

stahli 16. Okt 2013 14:55

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Delphi-Quellcode:
RecordA := RecordB;
Soll das funktionieren bzw. ausreichend sein um alle Eigenschaften zuzuweisen?
(Ich habe lange nichts mit Records gemacht... :oops:)

jaenicke 16. Okt 2013 15:03

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Zitat:

Zitat von Bjoerk (Beitrag 1232196)
BTW, es gibt keinen Funktionsaufruf sondern die Klasse TStab ändert intern eine Variable. Beim anschließenden Read eines Items sollte der doch verfügbar sein ??

Mit
Delphi-Quellcode:
FStabList[I]
holst du dir eine Kopie des Records und führst dann darauf die Prozedur aus. Die Änderungen machst du daher in der Kopie.

Es geht an der Stelle nur mit Pointern, also am sinnvollsten wie schon genannt mit Klassen.

stahli 16. Okt 2013 15:29

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
@jaenicke

Stimmt :thumb:
Ich hatte mir immer merken wollen, dass Records quasi wie Strings übergeben bzw. verarbeitet (die Bytes also kopiert) werden.
Insofern müsste meine Frage von oben mit ja beantwortet werden - richtig?

Das kommt davon, wenn man nur noch mit Klassen arbeitet ;-)

Bjoerk 16. Okt 2013 15:33

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Falls nur Wertetypen oder stat Arrays kann man records so umspeichern.

Klassen kann ich da keine mehr draus machen. Dann halt die public Items.

Danke für die Antworten!

Bjoerk 16. Okt 2013 15:43

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Vielleicht doch noch was.

Statt eines Array eine TList bringt an der Stelle ja nichts, weil die Items laufen dort ja auch über den Getter. Richtig?

jaenicke 16. Okt 2013 20:29

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Sonst bleibt nur die Prozedur in der Liste zu implementieren und den Index mit zu übergeben...

Zitat:

Zitat von Bjoerk (Beitrag 1232208)
Klassen kann ich da keine mehr draus machen.

Hab ich zwar noch keinen Fall getroffen, aber wenn du dir da sicher bist...

Bjoerk 16. Okt 2013 22:19

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Gehen würde das schon, logo, würde ich auch gerne..

Die Zeit, die Zeit ist das Problem.

Bei Records bin ich mir oft unsicher, mache deshalb meistens:

Delphi-Quellcode:
  AItem := List[Index];
  AItem.Machwas;
  List[Index] := AItem;

jaenicke 17. Okt 2013 04:13

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Das funktioniert auch. Aber letztlich ist es dann Unsinn Records zu verwenden, wenn du eigentlich die Funktionalität von Klassen brauchst...

Um den bestehenden Code nicht groß ändern zu müssen, blieben sonst auch noch Pointer auf Records, die du aus der Liste zurückgeben könntest. Wenn die auf das Original zeigen, geht es ja auch.

uligerhardt 17. Okt 2013 06:23

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Zitat:

Zitat von jaenicke (Beitrag 1232242)
Um den bestehenden Code nicht groß ändern zu müssen, blieben sonst auch noch Pointer auf Records, die du aus der Liste zurückgeben könntest. Wenn die auf das Original zeigen, geht es ja auch.

Genau. Stand auch schon in Post Nr. 2. :mrgreen:

jaenicke 17. Okt 2013 08:12

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Ich weiß, schien aber untergegangen zu sein. ;-)

Bjoerk 25. Okt 2013 08:39

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Zitat:

Zitat von jaenicke (Beitrag 1232248)
Ich weiß, schien aber untergegangen zu sein. ;-)

Stimmt, hatte ich übersehen. Hab’s nämlich jetzt genau so gemacht: :)

Delphi-Quellcode:
    property Items[Index: integer]: PStab read GetPItems write SetPItems; default;

function TStabList.GetPItems(Index: integer): PStab;
begin
  Result := @FItems[Index];
end;

procedure TStabList.SetPItems(Index: integer; const Value: PStab); // Assign;
begin
  FItems[Index] := Value^;
end;

uligerhardt 25. Okt 2013 11:04

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Zitat:

Zitat von Bjoerk (Beitrag 1233120)
Delphi-Quellcode:
property Items[Index: integer]: PStab read GetPItems write SetPItems; default;

function TStabList.GetPItems(Index: integer): PStab;
begin
  Result := @FItems[Index];
end;

procedure TStabList.SetPItems(Index: integer; const Value: PStab); // Assign;
begin
  FItems[Index] := Value^;
end;

Den Schreibzugriff würde ich schnell wieder streichen. :mrgreen:
Wenn ich als Benutzer deines Records `Liste[i] := PtrToSomeRecord` schreibe, ist das von der Syntax her eine flache Kopie von Referenzen/Zeigern, die du mittels `SetPItems` zu einer tiefen Kopie machst. Das halte ich für sehr verwirrend. Die Alternative wäre:
Delphi-Quellcode:
    property Items[Index: integer]: PStab read GetPItems; default;

function TStabList.GetPItems(Index: integer): PStab;
begin
  Result := @FItems[Index];
end;

// Benutzung:
Liste[i]^ := PtrToSomeRecord^;
Das erfordert zwei Haken mehr, dafür ist eindeutig klar, was passiert.

Bjoerk 25. Okt 2013 13:10

AW: Der linken Seite wird nichts zugewiesen "Extended Version"
 
Hallo Uli, mag sein, aber das Assign möchte da schon haben (was natürlich bedeutet, daß der Item auch existiert).


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