Autor Beitrag
IndexHunter
Hält's aus hier
Beiträge: 5


Delphi 2007
BeitragVerfasst: Mi 18.08.10 17:23 
Hallo!

Musik zum beantworten meiner Frage: www.youtube.com/watch?v=Z1oQm1NjR8U

Ich habe ein kleines Bestellprogramm. Dazu habe ich mehrere Klassen. TProdukt, TBestellPosten und TBestellung. TBestellung enthält alle TBestellPosten in einer TList.

Ich habe das ganze in einer TList und möchte das ganze jetzt in eine TListBox bekommen. Wer lieber Pastie bevorzugt. Wer im Forum den Code lesen möchte:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
var
  // TBestellung besteht aus einer BenutzerID sowie aus einer TList mit den TBestellPosten
  best: TBestellung;

  // TBestellPosten besteht aus einem TProdukt sowie der Anzahl als Integer
  // TProdukt besteht aus Strings und Integern
  posten1: TBestellPosten; produkt1: TProdukt;
  posten2: TBestellPosten; produkt2: TProdukt;
  posten3: TBestellPosten; produkt3: TProdukt;
  
  // In diese TList werden alle TBestellPosten hineingeladen
  list: TList;

  // Ein Counter fuer die Schleife
  i: integer;
begin
  // Produkte erstellen mit: Name, Hersteller, ID, Preis, HerstellerID
  produkt1 := TProdukt.Create('Läyberkäißß', 'SCHTROBL', 0, 10, 0);
  produkt2 := TProdukt.Create('Hackfleisch', 'SCHTROBL', 1, 20, 0);
  produkt3 := TProdukt.Create('LAABLA', 'SCHTROBL', 2, 31, 0);

  // BestellPosten erstellen mit: TProdukt, Anzahl
  posten1 := TBestellPosten.Create(produkt1, 5);
  posten2 := TBestellPosten.Create(produkt2, 6);
  posten3 := TBestellPosten.Create(produkt3, 7);

  // Liste mit allen Posten bauen
  list := TList.Create;
    list.Add(posten1);
    list.Add(posten2);
    list.Add(posten3);

  // Bestellung aus BenutzerID und der Liste erstellen
  best := TBestellung.Create(312312, list);

  // Alle Items aus der TList in die TListBox zu schreiben.
  for i := 0 to list.Count - 1 do
    begin
      { Hier gibt es den Fehler: [Pascal Fehler] TestUnit.pas(80): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
        Was ich hier versuche: Alle Items aus der TList in die TListBox zu schreiben. Die TListBox.AddItem Prozedur hat zwei Parameter:
        Item: String -> Das soll der Name des Produktes sein. Also TProdukt.ProduktName
        AObject: TObject -> Das soll das Objekt TBestellPosten sein. Muss zum auslesen natürlich noch gecastet werden mit (TObject as TBestellPosten)
      }

      ListBox2.AddItem(  (list.Items[i] as TBestellPosten)^.Produkt.ProduktName, (list.Items[i] as TBestellPosten)^);
    end;
end;


Kritisiert gerne auch mein Design.

Ich möchte jedoch viel lieber mein Fehler in Zeile 44 wissen =)

IH.


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 18.08.2010 um 18:34
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 18.08.10 17:36 
Moin und :welcome: im Forum!

user profile iconIndexHunter hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
ListBox2.AddItem(  (list.Items[i] as TBestellPosten)^.Produkt.ProduktName, (list.Items[i] as TBestellPosten)^);					
Objekte müssen nicht dereferenziert werden, das weiß der Compiler auch so schon. ;)

user profile iconIndexHunter hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte jedoch viel lieber mein Fehler in Zeile 44 wissen =)
Probier das mal so: :idea:
ausblenden Delphi-Quelltext
1:
ListBox2.AddItem( (list.Items[i] as TBestellPosten).Produkt.ProduktName, list.Items[i] );					
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
IndexHunter Threadstarter
Hält's aus hier
Beiträge: 5


Delphi 2007
BeitragVerfasst: Do 19.08.10 02:40 
Same shit, different Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// [Pascal Fehler] TestUnit.pas(80): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
ListBox2.AddItem( (list.Items[i] as TBestellPosten).Produkt.ProduktName, list.Items[i] );

// Funktioniert
ListBox2.AddItem( 'Zufall', list.Items[i] );

// So funktionierts auf einmal
// Habs hier gefunden: http://forum.ubuntuusers.de/topic/delphi-lazarus-fpc-objekte-aus-tlist-auslesen/
ListBox2.AddItem( TBestellPosten(list.Items[i]).Produkt.ProduktName, list.Items[i]);


Stellt sich aber weiterhin die Frage warum das Casten nicht geklappt hat.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 19.08.10 04:44 
Das funktioniert nicht, weil der Typ Pointer ist, der in TList gespeichert ist. Und der geht nicht weich zu casten.

Grund: Mit as kannst du schauen, ob ein Objekt ein Klassentyp ist und wenn ja dorthin casten, wenn nein wird eine Exception geworfen. Ein Pointer ist aber kein Objekt. Deshalb musst du das hart auf TObject casten um Delphi zu sagen, dass es zumindest ein Objekt auf jeden Fall ist:
ausblenden Delphi-Quelltext
1:
(TObject(list.Items[i]) as TBestellPosten).Produkt.ProduktName					
Dann sollte die Prüfung mit as auch korrekt durchgeführt werden.

Warum benutzt du nicht einfach TObjectList oder gleich eine eigene typisierte Variante davon?
IndexHunter Threadstarter
Hält's aus hier
Beiträge: 5


Delphi 2007
BeitragVerfasst: Do 19.08.10 13:41 
Eine eigene Typisierte Liste müsste man dann von TObjectList ableiten, richtig?

tänx =)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 20.08.10 20:33 
In Delphi 2007 ja, wenn du auf eine neuere Version updatest kannst du Generics verwenden z.B. TObjectList<TBestellPosten>.