ptrInt -> integer

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

ptrInt -> integer

Beitrag von Vbxler »

Wenn ich bei der Compilereinstellung -CR(Methodenaufrufe prüfen) einschalte,
habe ich das Problem, dass ich bei 'TButton(Sender).Tag' (Rückgabetyp ist PtrInt)
nicht in eine Variabel vom Typ Integer speichern kann.

Code: Alles auswählen

  //welcher Button wurde betaetigt?
  iPageAuswahl := TButton(Sender).Tag;  
Wenn ich die Anwendung starte erhalte ich die Meldung: 'Invalid type cast.'
Frage: Wie muss ich das machen, dass der Rückgabewert in Integer gespeichert werden kann.
Oder, welche Compilerschalter sind wichtig bzw. sinnvoll?

Danke für eure Hilfe.
Vbxler
-------------------------

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: ptrInt -> integer

Beitrag von Komoluna »

Bei mir geht das (Lazarus 1.5 FPC 3.1.1 i386-win32-win32/win64) mit Compilerschalter -CR:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i:=TButton(Sender).Tag;
end; 
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ptrInt -> integer

Beitrag von Socke »

Vbxler hat geschrieben:habe ich das Problem, dass ich bei 'TButton(Sender).Tag' (Rückgabetyp ist PtrInt)
nicht in eine Variabel vom Typ Integer speichern kann.
Dann speichere das doch in einer Variablen vom Typ PtrInt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: ptrInt -> integer

Beitrag von Vbxler »

@Socke
habe ich schon Probiert, es kommt die selbe Meldung bei der Übernahme des TAG.

@Komoluna
Das ist ja Witzig, bei mir geht das nicht:

Code: Alles auswählen

procedure TfrmDaten.cmdMain_PageSelection(Sender: TObject);
var
  iPageAuswahl : Integer = 0;
begin
 
  //welcher Button wurde betaetigt?
  iPageAuswahl := TButton(Sender).Tag;   //<-- 'Invalid type cast.'
 
  //Selektion der Seite
  pgMain_Verwaltung.TabIndex  := iPageAuswahl;
  self.Caption                := aPageVerwaltung[iPageAuswahl];
end;    
Dann wird der Schalter -CR eben auf aus bleiben.

Danke für eure Hilfe!
Vbxler
-------------------------

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: ptrInt -> integer

Beitrag von mischi »

Auch wenn es keine Fehlermeldung gibt, wird denn der Pointer richtig dereferenziert, also bekommt i wirklich die Zahl oder doch nur die Adresse? Müsste der Code nicht so lauten (also mit ^ für das Dereferenzieren):

iPageAuswahl := TButton(Sender).Tag^

MiSchi
MiSchi macht die fink-Pakete

Benutzeravatar
theo
Beiträge: 10939
Registriert: Mo 11. Sep 2006, 19:01

Re: ptrInt -> integer

Beitrag von theo »

Vbxler hat geschrieben: @Komoluna
Das ist ja Witzig, bei mir geht das nicht:
Wenn du jetzt statt "bei mir" wie Komoluna die Compilerversion angeben würdest, könnte man daraus vielleicht irgendwelche Rückschlüsse ziehen. :wink:

Benutzeravatar
theo
Beiträge: 10939
Registriert: Mo 11. Sep 2006, 19:01

Re: ptrInt -> integer

Beitrag von theo »

mischi hat geschrieben:Auch wenn es keine Fehlermeldung gibt, wird denn der Pointer richtig dereferenziert,
PtrInt ist eigentlich kein Pointer. http://www.freepascal.org/docs-html/rtl ... trint.html

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ptrInt -> integer

Beitrag von Socke »

Vbxler hat geschrieben: //welcher Button wurde betaetigt?
iPageAuswahl := TButton(Sender).Tag; //<-- 'Invalid type cast.'
Bist du dir sicher, dass sich die Meldung auf Tag und nicht auf TButton(Sender) bezieht?

Was sagt Sender.ClassName?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: ptrInt -> integer

Beitrag von mischi »

theo hat geschrieben:
mischi hat geschrieben:Auch wenn es keine Fehlermeldung gibt, wird denn der Pointer richtig dereferenziert,
PtrInt ist eigentlich kein Pointer. http://www.freepascal.org/docs-html/rtl ... trint.html
Stimmt. Mein Missverständnis. Müsste aber die Fehlermeldung dann nicht bedeuten, dass entweder integer oder ptrint nicht mehr longint ist, oder werden die abgeleiteten Typen als nicht mehr kompatibel eingestuft?

Brute force sollte auch gehen oder übersehe ich schon wieder etwas:

iPageAuswahl := integer(TButton(Sender).Tag);

Kann man dann -CR nicht wieder einschalten?

MiSchi.
MiSchi macht die fink-Pakete

Benutzeravatar
theo
Beiträge: 10939
Registriert: Mo 11. Sep 2006, 19:01

Re: ptrInt -> integer

Beitrag von theo »

mischi hat geschrieben: Müsste aber die Fehlermeldung dann nicht bedeuten, dass entweder integer oder ptrint nicht mehr longint ist, oder werden die abgeleiteten Typen als nicht mehr kompatibel eingestuft?
Der Hund liegt wahrscheinlich woanders begraben.
Socke hat schon recht, es ist ja ein Laufzeitfehler.
Da stimmt ziemlich sicher was mit dem Typecasting von TButton(Sender) nicht.

Warf
Beiträge: 2155
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: ptrInt -> integer

Beitrag von Warf »

Mir würde ein workaround a'la quick and dirty einfallen:

Code: Alles auswählen

var i: IntPtr;
...
I:=(Sender as TButton).Tag;
Move(i, iPageAuswahl, SizeOf(iPageAuswahl));
 

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: ptrInt -> integer

Beitrag von mischi »

theo hat geschrieben:
mischi hat geschrieben: Müsste aber die Fehlermeldung dann nicht bedeuten, dass entweder integer oder ptrint nicht mehr longint ist, oder werden die abgeleiteten Typen als nicht mehr kompatibel eingestuft?
Der Hund liegt wahrscheinlich woanders begraben.
Socke hat schon recht, es ist ja ein Laufzeitfehler.
Da stimmt ziemlich sicher was mit dem Typecasting von TButton(Sender) nicht.
Du, meinst das der Sender entweder kein TButton ist, oder zumindest nichts kompatibles, so dass .Tag irgendwo im Karpfenteich des Speichers angel?
MiSchi macht die fink-Pakete

Benutzeravatar
theo
Beiträge: 10939
Registriert: Mo 11. Sep 2006, 19:01

Re: ptrInt -> integer

Beitrag von theo »

mischi hat geschrieben: Du, meinst das der Sender entweder kein TButton ist, oder zumindest nichts kompatibles, so dass .Tag irgendwo im Karpfenteich des Speichers angel?
Ja. Die Laufzeitmeldung 'Invalid type cast' kann man ja bei -CR bspw. so provozieren:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var AObj:TComponent;
begin
 AObj:=TRadioButton(Sender);
end;
 
 
Aber was Vbxler genau gemacht hat, wissen wir ja nicht.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ptrInt -> integer

Beitrag von Socke »

mischi hat geschrieben:Du, meinst das der Sender entweder kein TButton ist, oder zumindest nichts kompatibles, so dass .Tag irgendwo im Karpfenteich des Speichers angel?
Solange Sender ebenfalls von TComponent abstammt, ist der Speicherzugriff korrekt, da die Eigenschaft Tag dort definiert wird.
Im Allgemeinen gillt bei Typecasts:

Code: Alles auswählen

TButton(Sender).Tag; // wirft keine Exception, wenn Sender kein TButton ist
(Sender as TButton).Tag; // wirft Exception, wenn Sender kein TButton ist
Wobei -CR das weiter beeinflusst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: ptrInt -> integer

Beitrag von Vbxler »

Hallo Leute, sorry das ich mich erst heute melde,
da ich die letzten Tage unterwegs war.

@Socke:
Solange Sender ebenfalls von TComponent abstammt, ist der Speicherzugriff korrekt, da die Eigenschaft Tag dort definiert wird.
Das ist genau der Grund, warum ich den Fehler hatte!
Ich habe nämlich keinen TButton, sondern einen TBCButton verwendet.

Wie immer, 80% der Probleme sind 60cm vom Monitor entfernt.

Vielen Dank für eure Hilfe!!!
Vbxler
-------------------------

Antworten