Extremer cast bei Enum zu Pointer

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Extremer cast bei Enum zu Pointer

Beitrag von Mathias »

Ich mache gerade folgendes, dabei ist mit aufgefallen, das man extrem casten muss, wen man einen Enum-Typ über Funktionen übergeben will, welche für Pointer vorgesehen sind. In meinen Augen ist dies überhaupt nicht elegant.

Code: Alles auswählen

const
  cmdKey='cmdKey';
type
  TCmd = (cmdRemove, cmdRemoveAll, cmdAppend, cmdUp, cmdDown);

Code: Alles auswählen

  function CreateBtnButton(label_, icon_name: Pgchar; cmd: TCmd; listBox: PGtkWidget): PGtkWidget;
    ...
    Result := gtk_button_new;
    ...   
    g_object_set_data(G_OBJECT(Result), cmdKey, Pointer(PtrInt(cmd))); // !!!!!
    ...
  end;

Code: Alles auswählen

  procedure btn_click_cp(widget: PGtkWidget; Data: Tgpointer); cdecl;
  var
    cmd: TCmd;
  begin
    cmd := TCmd(PtrInt(g_object_get_data(G_OBJECT(widget), cmdKey))); // !!!!!
    WriteLn(cmd);
    case cmd of
      cmdRemove: begin
      ...
      end;
      ...
Was alternativ geht ist folgendes, ist aber auch nicht elegant.

Code: Alles auswählen

  var
    obj: Tgpointer;
    cmd: TCmd absolute obj;
  begin
    obj := g_object_get_data(G_OBJECT(widget), cmdKey);
    case cmd of     
g_object_get_data gibt einen Pointer zurück. Und g_object_set_data übergibt einen Pointer.

Gibt es da was besseres oder muss man den doppel-cast in Kauf nehmen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 962
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Extremer cast bei Enum zu Pointer

Beitrag von PascalDragon »

Mathias hat geschrieben: Fr 24. Jan 2025, 20:03 Gibt es da was besseres oder muss man den doppel-cast in Kauf nehmen.
Das ist so beabsichtigt. Die Nicht-Delphi Modi verbieten explizit die Konvertierung von Enum-Werten zu Zeigern, da Enum-Typen meist eine Größe kleiner als die Größe eines 32- oder 64-bit Zeigers haben. Pascal ist hier eben typsicher und man kann es mit einer Umwandlung über einen Integerwert ja dennoch machen.
FPC Compiler Entwickler

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Extremer cast bei Enum zu Pointer

Beitrag von Mathias »

Danke für die Infos.
Ich habe es unterdessen viel eleganter lösen können. Mit g_action, kann man dies mit GTK4 sehr elegant lösen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten