[gelöst] Pointer auf verschiedene Typen?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

[gelöst] Pointer auf verschiedene Typen?

Beitrag von mulcheo »

Hallo wieder,

in meinem Projekt gebe ich verschiedene Wörter und Textmarken (Klammern aller Art) auf dem Bildschirm aus, die dann vom User angeklickt werden können. x- und y-Werte dieser 'Objekte' so wie ein Haufen anderes Zeug speicher ich jeweils in eigenen records (TWort und TMarker) bzw. arrays dieser records. Nun würde ich gerne in einer Variable hinterlegen, welches 'Objekt' zuletzt angeklickt wurde. Von welchem Typ das Ding war, weiß ich aber erst zur Laufzeit.

Wie fange ich das an? Ich vermute, es läuft auf pointer raus, aber ich sehe noch nicht, wie ... Ich würde gerne etwas machen wie:

Code: Alles auswählen

var
  letztgeklickt: [???] 
  
[...]
procedure Form1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
[...]
if [...] then letztgeklickt:= [etwas vom Typ TWort]
if [...] then letztgeklickt:= [etwas vom Typ TMarker]
Priorität wäre, 'letztgeklickt' nicht in verschiedene Variablen teilen zu müssen...
Zuletzt geändert von mulcheo am Mo 29. Nov 2021, 14:54, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3158
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: Pointer auf verschiedene Typen?

Beitrag von Socke »

Für sowas gibt es in der objektorientierten Programmierung das Konzept des Polymorphismus. Dann müsstest du aber von Records auf Klassen umstellen.

Bei Records fällt mir hier variant Records ein:

Code: Alles auswählen

type
TReferenceType = (rtWort, rtMarker); // usw.
TLetzterClickRef = record
  case RefType: TReferenceType of
    rtWort: Wort: PWort;
    rtMarker: Marker: PMarker; // usw.
end;

// Zugriff
var
  letztgeklickt: TLetzterClickRef;
begin
  if [...] then
  begin
    letztgeklickt.Wort:= @[etwas vom Typ TWort];
    letztgeklickt.RefType := rtWort;
  end;
  if [...] then
  begin
    letztgeklickt.Marker:= @[etwas vom Typ TMarker];
    letztgeklickt.RefType := rtMarker;
  end;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten