Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Zugriff auf Label.Tag (https://www.delphipraxis.net/75597-zugriff-auf-label-tag.html)

gfjs 22. Aug 2006 07:44


Zugriff auf Label.Tag
 
Guten Morgen, Allerseits.

Ich kann mit
Delphi-Quellcode:
str := Label1.Tag.ToString;
auf das Tag zugreifen, nicht aber mit
Delphi-Quellcode:
n := Label1.Tag;
Fehlermeldung: "E2010 Inkompatible Typen: 'Integer' und 'object'"

Jetzt wollte ich mir mit
Delphi-Quellcode:
n.Parse(str);
behelfen, aber das klappt nicht, denn
Delphi-Quellcode:
Text := n.ToString;
bringt dann als Ergebnis immer '0'.

Wie kann ich nun auf den Integerwert im Tag zugreifen?

Danke im Voraus.

mfg gfjs

JasonDX 22. Aug 2006 08:13

Re: Zugriff auf Label.Tag
 
hmm, wenn du eine direkte Zuweisung vornimmst aka
Delphi-Quellcode:
label1.Tag := 13;
dann solltest du so
Delphi-Quellcode:
label1.Tag as Int32
einwandfrei darauf zugreifen koennen.
Wenn du hingegen das Tag im OI gesetzt hast, ist es iirc ein String. Den Int-Wert herhaelst du dann mit
Delphi-Quellcode:
Int32.Parse(label1.Tag as string)
(ungetestet)

greetz
Mike

Jürgen Thomas 22. Aug 2006 08:16

Re: Zugriff auf Label.Tag
 
Zitat:

Zitat von gfjs
Fehlermeldung: "E2010 Inkompatible Typen: 'Integer' und 'object'"

Wie kann ich nun auf den Integerwert im Tag zugreifen?

Theoretisch sollte es so klappen (ungetestet):
Delphi-Quellcode:
n := (int)Label1.Tag;
//  oder so:
n := Convert.ToInt32(Label1.Tag);
jedenfalls unter Voraussetzung: n ist Integer, und Tag wurde ein Integer zugewiesen.

Hintergrund: In der FCL gibt es fast niemals 'reine' Datentypen, sondern alles sind Klassen (auch Integer). Vermutlich deshalb ist Control.Tag nicht als Integer, sondern als Object deklariert. Beim Schreiben konvertiert CLR den Integer automatisch in ein Integer-Object; beim Lesen muss man manuell konvertieren.

Gruß Jürgen

gfjs 22. Aug 2006 08:36

Re: Zugriff auf Label.Tag
 
@ Jürgen Thomas + JasonDX

Vielen Dank für Eure schnelle Antwort.

Ich habe frmSpielplan_Activated mit
Delphi-Quellcode:
Tag := i;
die Tags als Integer zugewiesen. Das hat auch geklappt, denn wenn ich mit
Delphi-Quellcode:
str := dummy.Tag.ToString;
die Tags anzeigen lasse, klappt es problemlos.

Delphi-Quellcode:
n := int(dummy.Tag) as Int 32;
und
Delphi-Quellcode:
n := int(dummy.tag);
bringen folgende Fehlermeldung:

[Pascal Fehler] uSpielplan.pas(154): E2250 Es gibt keine überladene Version von 'Int', die man mit diesen Argumenten aufrufen kann

Delphi-Quellcode:
n := Convert.ToInt32(dummy.Tag);
bringt keine Fehlermedlung aber mit str := n.ToString; das falsche Ergebnis '0'.

Ich bleibe also so ratlos wie vorher.

mfg gfjs

JasonDX 22. Aug 2006 08:43

Re: Zugriff auf Label.Tag
 
Zitat:

Zitat von gfjs
Delphi-Quellcode:
 := int(dummy.Tag) as Int 32;
und
Delphi-Quellcode:
n := int(dummy.tag);
bringen folgende Fehlermeldung:

[Pascal Fehler] uSpielplan.pas(154): E2250 Es gibt keine überladene Version von 'Int', die man mit diesen Argumenten aufrufen kann

Ja, ein kleiner Ausritt nach C#, dort ist Int32 auch als int verwendbar. Ein Reines
Delphi-Quellcode:
dummy.Tag as Int32
sollte funktionieren.

Zitat:

Zitat von gfjs
Delphi-Quellcode:
n := Convert.ToInt32(dummy.Tag);
bringt keine Fehlermedlung aber mit str := n.ToString; das falsche Ergebnis '0'.

Ja, ueberlege mal, was du machst: Du konvertierst ein object, das einen Int zugewiesen bekommen hat (und entsprechend auch ein solcher ist) in einen Integer. Kurz: Du konvertierst Int in Int. Bloss, dass die Methode nicht weiss, das dummy.Tag ein integer ist ;)
Die Stichworte hier sind Boxen und Unboxen. Bei der zuweisung
Delphi-Quellcode:
dummy.Tag := 1;
"boxt" du die 1 (als Integer) in ein object. (Structs muessen erst auf objects geboxt werden, im Gegensatz zu Klassen). Und du musst nun dummy.Tag "unboxen", um aus dem object wieder einen Integer zu machen. Und dafuer reicht ein purer Typecast:
Delphi-Quellcode:
dummy.Tag as Int32
//oder
Int32(dummy.Tag)
greetz
Mike

xaromz 22. Aug 2006 08:53

Re: Zugriff auf Label.Tag
 
Hallo,

was hier gemacht werden muss, ist das Boxing eines Integer in ein Object. Dazu muss man auch bei der Zuweisung aufpassen:
Delphi-Quellcode:
Label1.Tag := Int32(12345);
Damit ist nämlich der Typ des Objekts festgelegt.
Jetzt kann man wieder mittelns Unboxing
Delphi-Quellcode:
I := Int32(Label1.Tag);
darauf zugreifen.

Gruß
xaromz

gfjs 22. Aug 2006 09:08

Re: Zugriff auf Label.Tag
 
@ JasonDX

Hallo, Mike.

Mit
Delphi-Quellcode:
  n := (sender as System.Windows.Forms.&Label).Tag as Int32;
klappt's jetzt endlich.

Einen Extra-Dank für Deine ausführliche Erklärung.


@ xaromz

Auch mit
Delphi-Quellcode:
n := Int32((sender as System.Windows.Forms.&Label).Tag);
klappt's, obwohl ich bei der Zuweisung nur
Delphi-Quellcode:
Label1.Tag := i;
anstelle von
Delphi-Quellcode:
Label1.Tag := Int32(i);
verwendet habe.

mfg und vielen Dank

Jürgen


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