AGB  ·  Datenschutz  ·  Impressum  







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

Zugriff auf Label.Tag

Ein Thema von gfjs · begonnen am 22. Aug 2006 · letzter Beitrag vom 22. Aug 2006
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Zugriff auf Label.Tag

  Alt 22. Aug 2006, 07:44
Guten Morgen, Allerseits.

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

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

Wie kann ich nun auf den Integerwert im Tag zugreifen?

Danke im Voraus.

mfg gfjs
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: Zugriff auf Label.Tag

  Alt 22. Aug 2006, 08:13
hmm, wenn du eine direkte Zuweisung vornimmst aka label1.Tag := 13; dann solltest du solabel1.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 Int32.Parse(label1.Tag as string) (ungetestet)

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Zugriff auf Label.Tag

  Alt 22. Aug 2006, 08:16
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Zugriff auf Label.Tag

  Alt 22. Aug 2006, 08:36
@ Jürgen Thomas + JasonDX

Vielen Dank für Eure schnelle Antwort.

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

n := int(dummy.Tag) as Int 32; und 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

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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#5

Re: Zugriff auf Label.Tag

  Alt 22. Aug 2006, 08:43
Zitat von gfjs:
 := int(dummy.Tag) as Int 32; und 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 dummy.Tag as Int32 sollte funktionieren.

Zitat von gfjs:
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 zuweisungdummy.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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Zugriff auf Label.Tag

  Alt 22. Aug 2006, 08:53
Hallo,

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

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Zugriff auf Label.Tag

  Alt 22. Aug 2006, 09:08
@ JasonDX

Hallo, Mike.

Mit
  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
n := Int32((sender as System.Windows.Forms.&Label).Tag); klappt's, obwohl ich bei der Zuweisung nur Label1.Tag := i; anstelle von Label1.Tag := Int32(i); verwendet habe.

mfg und vielen Dank

Jürgen
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  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 02:18 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