Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 08.02.07 23:49 
Guten Abend,
wahrscheinlich ist es ganz einfach: Ich suche die "Umkehrfunktion" von Ord(x), aber nicht chr!

Ich nutze Ord, um einen Typ der ungefähr so deklariert ist als integer zu speichern: type TDockOrientation = (doScreen,doWorkArea,doDesktop);
Wenn ich den integer dann wieder aus der INI lade, muss ich natürlich einer Variable den entsprechenden Wert zuweisen:

ausblenden Delphi-Quelltext
1:
2:
INI.WriteInteger('DockOptions','Orientation',ord(DockOptions.Orientation)); //speichern
DockOptions.Orientation := ord^-1(INI.ReadInteger('DockOptions','Orientation',ord(doWorkArea))); //laden


... weil sonst ja die Compiler-Fehlermeldung Inkompatible Typen 'TDockOrientation' und 'integer' kommt.


Zuletzt bearbeitet von Jakob Schöttl am Fr 09.02.07 00:07, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 08.02.07 23:58 
Kommt auf den Datentyp an ...

Für Char heißt die Funktion Chr.

Für die meisten anderen Datentypen musst Du explizit auf den Datentyp casten.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.02.07 00:00 
ausblenden Delphi-Quelltext
1:
2:
INI.WriteInteger('DockOptions''Orientation', Ord(DockOptions.Orientation)); //speichern
DockOptions.Orientation := TDockOrientation(INI.ReadInteger('DockOptions''Orientation', Ord(doWorkArea))); //laden
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 09.02.07 00:08 
user profile iconBenBE hat folgendes geschrieben:
Kommt auf den Datentyp an ...

Für Char heißt die Funktion Chr.

Für die meisten anderen Datentypen musst Du explizit auf den Datentyp casten.


ja, die hab ich ja oben schon erwähnt (nur falsch geschrieben) ;)



user profile iconjaenicke hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
INI.WriteInteger('DockOptions''Orientation', Ord(DockOptions.Orientation)); //speichern
DockOptions.Orientation := TDockOrientation(INI.ReadInteger('DockOptions''Orientation', Ord(doWorkArea))); //laden


das geht leider nicht! da kommt genau die gleiche fehlermeldung Inkompatible Typen 'TDockOrientation' und 'integer'
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 09.02.07 00:15 
Bei Set-Typen (oder Enums???) gab's beim direkten Casten meist Probleme ...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure Solve;
var
    DO: TDockOrientation;
    DOSolve : Integer absolute DO;
Begin
    DOSolve := INI.ReadInteger({...});
    Form.DockOrientation := DO;
end;


Wobei die Größe des Typs TDockOrientation zu beachten ist. Für 2 Byte muss DOSolver Word und 1 Byte Byte respektive sein ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 09.02.07 08:05 
user profile iconBenBE hat folgendes geschrieben:
Bei Set-Typen (oder Enums???) gab's beim direkten Casten meist Probleme ...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure Solve;
var
    DO: TDockOrientation;
    DOSolve : Integer absolute DO;
Begin
    DOSolve := INI.ReadInteger({...});
    Form.DockOrientation := DO;
end;


Wobei die Größe des Typs TDockOrientation zu beachten ist. Für 2 Byte muss DOSolver Word und 1 Byte Byte respektive sein ...


Ahh! Ist doch nicht so leicht, wie ich erst dachte - und ich kann mich entsinnen, ich hab schon mal von absolute gelesen. Das ist ja echt praktisch!

absolute gefällt mir sehr :D

Und bei Settypen und Enums geht das beides dann eigentlich auf die gleiche Weise?

Aber bei Records kann ichs wohl leider nicht gleich einbauen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TDockOptions = record
    CanDock: Boolean;
    DockingBand: integer;
    Orientation: TDockOrientation;
    iOrientation: Byte absolute Orientation;
  end;

da kommt leider ein Compiler-Fehler, dass er den Bezeichner 'absolute' nicht akzeptiert.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Fr 09.02.07 09:37 
Äähm ... Leute, mir ist kein Fall bewusst, wo ein solcher Typecast Schwierigkeiten macht (jedenfalls nicht unter D7). Und ich glaube nicht, dass dieses hier der erste Fall sein wird, den ich sehe. :wink:


user profile iconJakob Schöttl hat folgendes geschrieben:


user profile iconjaenicke hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
INI.WriteInteger('DockOptions''Orientation', Ord(DockOptions.Orientation)); //speichern
DockOptions.Orientation := TDockOrientation(INI.ReadInteger('DockOptions''Orientation', Ord(doWorkArea))); //laden


das geht leider nicht! da kommt genau die gleiche fehlermeldung Inkompatible Typen 'TDockOrientation' und 'integer'


Weil mit ziemlicher Sicherheit dein DockOptions.Orientation vom Typ Integer und nicht vom Typ TDockOrientation ist, stimmt's? 8)

Wenn DockOptions.Orientation vom Typ TDockOrientation ist, dann funktioniert das auch.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 09.02.07 15:14 
user profile iconIngoD7 hat folgendes geschrieben:
Weil mit ziemlicher Sicherheit dein DockOptions.Orientation vom Typ Integer und nicht vom Typ TDockOrientation ist, stimmt's? 8)

Wenn DockOptions.Orientation vom Typ TDockOrientation ist, dann funktioniert das auch.


Oje, du hast recht! DockOptions.Orientation ist zwar ein TDockOrientation, aber der Fehler kam, als ich den Ausdruck Combobox1.ItemIndex zugewiesen habe, also wirklich einem Integer.

Das habe ich wohl übersehen.

Danke trotzdem an user profile iconBenBE, die Möglichkeit finde ich wie gesagt super und universell...
Und danke dir user profile iconIngoD7!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 09.02.07 15:52 
Ach ja und für sowas:
user profile iconJakob Schöttl hat folgendes geschrieben:
Aber bei Records kann ichs wohl leider nicht gleich einbauen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TDockOptions = record
    CanDock: Boolean;
    DockingBand: integer;
    Orientation: TDockOrientation;
    iOrientation: Byte absolute Orientation;
  end;

da kommt leider ein Compiler-Fehler, dass er den Bezeichner 'absolute' nicht akzeptiert.


Gibt's variante Records:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TDockOptions = record
    CanDock: Boolean;
    DockingBand: integer;
    Orientation: record case Boolean of
      False: (TDO: TDockOrientation;);
      True: (B: Byte;);
    end;
  end;


Man kann das Case auch direkt schreiben, dann muss Orientation aber das letzte Feld sein. Verschachtelt man einen Record, kann man das auch in der Mitte machen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 09.02.07 16:17 
Variante Records verstehe ich leider immer noch fast nicht.
Wenn ich Orientation True setze, dann gibt es zusätzlich das Feld TDO, wenn Orientation False ist, dann gibt es statt TDO B?

Aber in meinem Fall hab ich nichts davon glaube ich, weil ich ja gern hätte, dass man das eine Feld zuweist, und das andere dadurch auch geändert wird - so wie bei absolut eben.


Zuletzt bearbeitet von Jakob Schöttl am Fr 09.02.07 17:12, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 09.02.07 16:51 
Bei Varianten Records wird das mit dem True\False nur gemacht, damit Delphi mehrere eindeutige Teilbereiche kennt ...

Geht genauso auch mit Integern. Die Werte, die im Case vor dem Doppelpunkt stehen, sind dabei im Speicher nirgends vorhanden. Du kannst einfach auf TDO oder B zugreifen - nur Delphi brauch diese Unterscheidung.
Intern liegen TDO und B am gleichen Offset - so wie bei Absolute auch ... Siehe ggf. auf die Object Pascal Reference in der Delphi-Hilfe ... Dort steht das noch etwas genauer ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.