AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi generic TList of Record - Direktzugriff auf Feld

generic TList of Record - Direktzugriff auf Feld

Ein Thema von himitsu · begonnen am 30. Aug 2011 · letzter Beitrag vom 30. Aug 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#1

generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 19:47
Kennt folgendes schon jemand?
Delphi-Quellcode:
var Y: TList<TMyRec>;

Y := TList<TMyRec>.Create;
R.S := 'abc';
Y.Add(R);
Y[0].S := 'xyz'; // [DCC Fehler] Project2.dpr(25): E2064 Der linken Seite kann nichts zugewiesen werden
WriteLn(Y[0].S);
Y.Free;
ging vor D2010 mal, aber die Änderung wurde nicht in die Liste übernommen
siehe http://www.delphipraxis.net/162591-r...delphi-xe.html

Vor D2010 gab es noch keine Fehlermeldung, aber dafür gingen die Änderungen gerne mal verloren.




Eventuell gäbe es da ja Abhilfe, wenn man nur den Record als Pointer zugänglich machen würde.
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, DList;

type
  TMyRec = record
    S: String;
    i: Integer;
  end;

var
  X: TDirectList<TMyRec>;
  R: TMyRec;
  i: Integer;

begin
  try
    X := TDirectList<TMyRec>.Create;
    try
      R.S := 'Hallo';
      R.i := 1;
      X.Add(R); // der normale Weg halt

      with X.Add^ do begin // wenn kein Punkt folgt, sollte man den ^ nicht vergessen
        S := 'du';
        i := 2;
      end;

      X.Add.S := 'Welt';

      i := X.AddP;
      X[i].S := '^^'; // eigentlich X.ItemsD[i].S := '^^'; aber ist ja das Default

      for i := 0 to X.Count - 1 do begin
        WriteLn(X[i].i, ' ', X[i].S);
        X[i].S := X[i].S + ' ';
      end;

      for R in X do
        Write(R.S); // hier aber nur Lesezugriffe möglich, es sei denn, ...
      WriteLn;
    finally
      X.Free;
    end;

    WriteLn('*Ende*');
    ReadLn;
  except
    on E: Exception do begin
      WriteLn(E.ClassName, ': ', E.Message);
      ReadLn;
    end;
  end;
end.


Ja ja, man könnte natürlich auch eine Klasse aus dem Record machen und würde dann eine TObjectList<TMyClass> verwenden.






@SirThornberry: Wie findest du meinen brutalen Weg, um an FItems ranzukommen?
Angehängte Dateien
Dateityp: pas DList.pas (4,5 KB, 24x aufgerufen)
Dateityp: pas Project2.dpr.pas (1,4 KB, 12x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (30. Aug 2011 um 19:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.921 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 20:59
Die Möglichkeit, einen nested Type als Pointer auf einen Typenparameter innerhalb eines generischen Typens zu deklarieren, ist ein Bug (Quelle: Barrys Antwort).

Also nicht wundern oder jammern, wenn das mal nicht so klappt, wie gedacht.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 21:05
So wie ich das dort glaube verstanden zu haben, ist das schon richtig.
Aber es gibt manchmal einen Bug, welcher irgendwann in ferner Zukunft (also nie, wie immer) gefix werden solle.



Ich glaub in D2009 hatte ich da mal einen derartigen Bug
und der Workaround war nicht schön und dazu noch Fehleranfällig.

Delphi-Quellcode:
type
  TMyGenType<T, P> = class(...)
  end;

  TNewType = TMyGenType(Byte, PByte);
Denn es könnte passieren, daß ^T <> P.


Nja, ist man ja langsam gewohnt, daß immer irgendwas nicht funktioniert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (30. Aug 2011 um 21:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.921 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 21:07
So wie ich das dort gelesen hab, ist das schon richtig, aber es gibt manchmal einen Bug, welcher irgendwann in ferner Zukunft (also nie, wie immer) gefix werden soll.
Zitat:
Pointers to open generic types are not supported because generic pointer types are not supported, although it is possible (compiler bug) to create them in certain circumstances (particularly pointers to nested types inside a generic type)
Das ist der wichtige Satz
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (30. Aug 2011 um 21:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 21:18
Hmmm, aber schön, daß die Generics noch mehr beschränkt werden sollen ... man kann ja schon jetzt nicht viel damit anfangen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.921 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 21:19
Hmmm, aber schön, daß die Generics noch mehr beschränkt werden sollen ... man kann ja schon jetzt nicht viel damit anfangen
Wenn du nicht viel damit anfangen kannst, versuchst du einfach nur das falsche damit.

Und ich sehe auch nicht, dass sie noch mehr beschränkt werden sollen - eher im Gegenteil:
Zitat von Barry Kelly:
The limitation on generic pointer types ought to be removed in the future, but I can't make promises when.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 21:28
Die ein bis zwei billigen Standardsachen funktionieren ja.

Aber wenn nichtmal Pointer funktionieren (also DAS Delphifeature schlechthin), dann ...
Oder wo ist die starke Typbindung von Delphi geblieben? (TMyGenType<T: TStrings> )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.921 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: generic TList of Record - Direktzugriff auf Feld

  Alt 30. Aug 2011, 21:56
Zitat:
Aber wenn nichtmal Pointer funktionieren (also DAS Delphifeature schlechthin)
Äh, wat? Wohl eher, dass man fast keine (ich zähle dazu jetzt nicht Objektreferenzen) davon braucht oder nicht immer jedes ^ schreiben muss, wenn man sie mal doch braucht.

Oder wo ist die starke Typbindung von Delphi geblieben? (TMyGenType<T: TStrings> )
Soll mir was genau sagen?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (30. Aug 2011 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf