AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TList 10.1 Berlin vs 10.3 Rio

Ein Thema von Int3g3r · begonnen am 18. Aug 2020 · letzter Beitrag vom 18. Aug 2020
Antwort Antwort
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#1

TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 10:42
Delphi-Version: 10.3 Rio
Guten Tag,

Ich verwende unter Delphi 10.3 Rio folgende routine:

Delphi-Quellcode:
procedure Tfrm_Umsatz_Statistik.GUIUmsatzMitKunde(_visible: boolean);
var elements : TList;
      ele : TObject;
begin
   elements := Tlist.Create;
   elements.Add(Label3);
   elements.Add(lblDatumUnbestimmt);
   elements.Add(ChkBoxDatumsbereich);
   elements.Add(chkBoxGattungSelect);
   elements.Add(lblTitelGattung);
   elements.Add(ChkBoxAlleGattung);
   elements.Add(Label7);


   for ele in elements do
   begin
       if ele is TLabel then
       begin
            Tlabel(ele).Visible := _visible;
       end
       else if ele is TCheckBox then
       begin
            TCheckBox(ele).Visible := _visible;
       else if ele is TListBox then
       begin
            TListBox(ele).Visible := _visible;
       end;
   end;
   elements.Free;
end;
Lässt sich unter 10.3 Rio ohne weiteres compillieren.

Unter 10.1 erhalte ich folgende Fehlermeldung:
Zitat:
[dcc32 Fehler] form_Umsatz_Statistik.pas(1412): E2010 Inkompatible Typen: 'TObject' und 'Pointer'
Die Fehlermeldung ist bezogen auf die for-in-Schleife.

Wie lässt sich diese procedure in 10.1 verwenden ?

Ich habe es versucht mit Pointern wie folgt zu realisieren :
Delphi-Quellcode:
procedure Tfrm_Umsatz_Statistik.GUIUmsatzMitKunde(_visible: boolean);
var elements : TList;
      ele : ^TObject;
begin
   elements := Tlist.Create;
   elements.Add(Label3);
   elements.Add(lblDatumUnbestimmt);
   elements.Add(ChkBoxDatumsbereich);
   elements.Add(chkBoxGattungSelect);
   elements.Add(lblTitelGattung);
   elements.Add(ChkBoxAlleGattung);
   elements.Add(Label7);


   for ele in elements do
   begin
       if ele^ is TLabel then
       begin
            Tlabel(ele^).Visible := _visible;
       end
       else if ele^ is TCheckBox then
       begin
            TCheckBox(ele^).Visible := _visible;
       else if ele^ is TListBox then
       begin
            TListBox(ele^).Visible := _visible;
       end;
   end;
   elements.Free;
end;
Hier erhalte ich eine access-violation beim dereferenzieren zur Laufzeit. An der Stelle if ele^ is TLabel then

Gruss Int3g3r
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 10:55
Mach doch ne generische elements : TList<TControl>; draus;

Delphi-Quellcode:
procedure Tfrm_Umsatz_Statistik.GUIUmsatzMitKunde(_visible: boolean);
var
  Controls: TList<TControl>;
  Control: TControl;
begin
  Controls := TList<TControl>.Create;
  try
    Controls.Add(Label3);
    Controls.Add(lblDatumUnbestimmt);
    Controls.Add(ChkBoxDatumsbereich);
    Controls.Add(chkBoxGattungSelect);
    Controls.Add(lblTitelGattung);
    Controls.Add(ChkBoxAlleGattung);
    Controls.Add(Label7);

    for Control in Controls do
    begin
        Control.Visible := _visible
    end;
  finally
    Controls.Free;
  end;
end;
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 11:18
What about
Delphi-Quellcode:
procedure TTestForm.Button1Click(Sender: TObject);
var
  elements: TList;
  i: integer;
begin
  elements := TList.Create;
  try
    elements.Add(Label1);
    for i := 0 to elements.Count - 1 do
    begin
      if TObject(elements.Items[i]) is TLabel then
        TLabel(elements.Items[i]).Visible := true;
    end;
  finally
    elements.Free;
  end;
end;
?

Grüsse
Uli
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 11:32
Vielen Dank für die Lösungsvorschläge.
Die Generische Liste zu verwenden ist wohl die einfachste Lösung.

Trotzdem möchte ich wissen warum ich eine access-violation erhalte im Beispiel mit dem Pointer oben.
Solche Fehlermeldungen sind für mich sehr schwierig nachvollziebar.

if ele^ is TLabel then ist doch fast das gleiche wie TObject(elements.Items[i]) is TLabel then ?!
Darum habe ich oben auch ein typisierten-^TObject-Pointer genommen, somit wird beim dereferenzieren der Wert/Objekt in ein TObject gecastet.

Gruss Int3g3r
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 11:37
Ich hab noch mal weitergespielt:
Delphi-Quellcode:
procedure TTestForm.Button1Click(Sender: TObject);
var
  elements: TList;
  ele: Pointer;
begin
  elements := TList.Create;
  try
    elements.Add(Label1);
    for ele in elements do
    begin
      if TObject(ele) is TLabel then
        TLabel(ele).Visible := true;
    end;
  finally
    elements.Free;
  end;
end;
TList enhält eine Liste von Pointern. Mit ele vom Typ Pointer klappts denn auch.

Grüsse
Uli
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 12:17
Ich hab noch mal weitergespielt:
TList enhält eine Liste von Pointern. Mit ele vom Typ Pointer klappts denn auch.
Grüsse
Uli
Danke Uli!
Warum muss man bei TObject(ele) nicht dereferenzieren ?
Ich möchte ja das Objekt an der Adresse "ele" casten und nicht die Adresse selbst.
TObject(ele) lese ich so das die Adresse "ele" in ein TObject gecastet wird, dies sollte aber nicht möglich sein.

Gruss Int3g3r
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 12:43
Wieso nicht das?

https://www.delphipraxis.net/1471996-post2.html
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TList 10.1 Berlin vs 10.3 Rio

  Alt 18. Aug 2020, 14:15
Einiges fehlte noch und den Rest zusammenfassend mit aufgeführt.

Ich möchte ja das Objekt an der Adresse "ele" casten und nicht die Adresse selbst.
Du hast reinzu auch direkt TObject-Nachfahren nach Pointer (implizit) gecastet,
also muß es rückzu genauso sein, also Pointer nach TObjekt aka TObject(ele) .

Was bietet mir eine TObjectList im gegensatz zu einer TList ?
Weil es bereits einen passenderen Typen besitzt und man nicht erst böse casten muß?
Objekte rein, Objekte raus und das alles inklusive einer funktionierenden Typprüfung.

Bei Pointer mußt du ja harte Casts benutzen, womit die Typ-Prüfung des Compilers umgangen wird.

Da Einzige, was der Compiler prüfen kann, ist dass sie zumindestens die gleiche Größe haben, aber ob in ele wiklich "Objekte" drin ist, kann nicht geprüft werden.
Falls das nicht stimmt, kann der Code extrem schöne Fehler produzieren, welches nicht passieren würde, hätte man die Typprüfung des Compilers auf seiner Seite.

Mit TList<TControl> sogar noch sicherer, da man hier gleich weiß, dass in der Liste nur Objekte sein können, welche die Visible-API enthalten.
(gut, es kann sein, dass hier Visible nicht verwendet wird, aber dennoch lässt es sich auffrufen und macht dann einfach nichts ... aber es knallt wenigstens nicht)


Implizit:
TObjekt nach Pointer geht, da ein Objektzeiger (Variable oder Parameter) "zufällig" genauso groß wie ein Pointer ist, weil er "intern" einen Zeiger enthält, drum besitzt Delphi hier einen impliziten Cast (weil sowas oft von Entwicklern gemacht wird),
aber andersrum geht es nicht, da ein Pointer nicht immer ein Objekt-Zeiger sein muß und es sich auch nicht 100% sicher prüfen lässt, ob es so ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Aug 2020 um 14:21 Uhr)
  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:27 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