![]() |
Delphi-Version: 10.3 Rio
TList 10.1 Berlin vs 10.3 Rio
Guten Tag,
Ich verwende unter Delphi 10.3 Rio folgende routine:
Delphi-Quellcode:
Lässt sich unter 10.3 Rio ohne weiteres compillieren.
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; Unter 10.1 erhalte ich folgende Fehlermeldung: Zitat:
Wie lässt sich diese procedure in 10.1 verwenden ? Ich habe es versucht mit Pointern wie folgt zu realisieren :
Delphi-Quellcode:
Hier erhalte ich eine access-violation beim dereferenzieren zur Laufzeit. An der Stelle
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;
Delphi-Quellcode:
if ele^ is TLabel then
Gruss Int3g3r |
AW: TList 10.1 Berlin vs 10.3 Rio
Mach doch ne generische
Delphi-Quellcode:
draus;
elements : TList<TControl>;
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; |
AW: TList 10.1 Berlin vs 10.3 Rio
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 |
AW: TList 10.1 Berlin vs 10.3 Rio
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.
Delphi-Quellcode:
ist doch fast das gleiche wie
if ele^ is TLabel then
Delphi-Quellcode:
?!
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 |
AW: TList 10.1 Berlin vs 10.3 Rio
Ich hab noch mal weitergespielt:
Delphi-Quellcode:
TList enhält eine Liste von Pointern. Mit ele vom Typ Pointer klappts denn auch.
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; Grüsse Uli |
AW: TList 10.1 Berlin vs 10.3 Rio
Zitat:
Warum muss man bei
Delphi-Quellcode:
nicht dereferenzieren ?
TObject(ele)
Ich möchte ja das Objekt an der Adresse "ele" casten und nicht die Adresse selbst.:shock: TObject(ele) lese ich so das die Adresse "ele" in ein TObject gecastet wird, dies sollte aber nicht möglich sein. Gruss Int3g3r |
AW: TList 10.1 Berlin vs 10.3 Rio
|
AW: TList 10.1 Berlin vs 10.3 Rio
Du hast eine TList mit Pointern, also muß ele ein Pointer sein.
Delphi-Quellcode:
Man kann sowas versuchen, aber leider mag der Compiler das oft nicht. "... muß eine Variable sein, bla bla bla"
var ele: Pointer;
for ele in elements do if TObject(ele) is ... then
Delphi-Quellcode:
Oder man ist mal etwas böse.
var ele: TObject;
for Pointer(ele) in elements do
Delphi-Quellcode:
var
_ele: Pointer; ele: TObject absolute _ele; for _ele in elements do if ele is ... then Wieso keine TObjektList oder gar eine generische TList<TObject> (oder TComponent/TMyIrgendwas/...) ? Und ja, da hier überall VISIBLE vorkommt, ist es eigentlich nötig sich den gemeinsamen Vorfahren rauszusuchen und dann das nur einmal zu machen. Da Visible aber in der Basis protected ist, und man hier weiß, dass ALLEs ein Visible (das Selbe) hat, kann man hier auch blind in einen Typen casten, wo es public ist ... siehe UliBru.
Delphi-Quellcode:
procedure TTestForm.Button1Click(Sender: TObject);
var ele: Pointer; for ele in elements do if TObject(ele) is TControl then TLabel(ele).Visible := true; |
AW: TList 10.1 Berlin vs 10.3 Rio
Zitat:
Ich denke das ist gensu für sowas erfunden worden :stupid: |
AW: TList 10.1 Berlin vs 10.3 Rio
Zitat:
Bei einer TObjectList ist es noch notwendig eine unit einzubinden. Den Namen dieser unit vergesse ich sehr schnell daher ist es für mich einfacher mit einer TList zu arbeiten. In meinem Fall ist es doch nicht notwenig eine TObjectList zu benutzen, eine TList reicht komplett aus für mein vorhaben. Dazu kommt das eine TObjectList auch einen Pointer erwartet. Somit ist dann eine generische TList<> die bessere Wahl. Mir geht es aber darum etwas zu lernen. Damit ich mir bei solchen Problemen selbst helfen könnte. Daher möchte ich auch wissen warum das obere Beispiel mit dem Pointer nicht funktioniert.
Delphi-Quellcode:
ist auch ein Pointer.
ele : ^TObject
Warum muss beim casten von TObject(ele) der Pointer nicht dereferenziert werden ? Warum erhalte ich bei meinem Beispiel(mit Pointer) oben eine access-violation exception ? Gruss Int3g3r |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 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