Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TAlignment welcher Datentype? (https://www.delphipraxis.net/99704-talignment-welcher-datentype.html)

Chemiker 16. Sep 2007 12:44


TAlignment welcher Datentype?
 
Hallo,

ich bin dabei mir eine eigene TEdit – Komponente zu programmieren. Jetzt habe ich mal folgende Frage: Welcher Datentype muss TAlignment haben?

Delphi-Quellcode:
const
  Alignments: array[TAlignment] of {DWORD} {integer}{WORD}Smallint =
                                                            (ES_LEFT, ES_RIGHT, ES_CENTER);
Mit diesen funktioniert es, aber welcher Datentype ist angezeigt?

Bis bald Chemiker

Hansa 16. Sep 2007 13:11

Re: TAlignment welcher Datentype?
 
machs so :

Delphi-Quellcode:
const
  Alignments: array[TAlignment] of Byte = (ES_Left, ES_Right, ES_Center);

Chemiker 16. Sep 2007 13:27

Re: TAlignment welcher Datentype?
 
Hallo Hansa,

ich habe für TAligmnent jetzt schon so viele Datentypen gesehen, aber Byte hatte ich noch nicht.
Für mich wäre von Interesse zu erfahren, nach welchen Kriterien man dabei vorgeht. Wird das von Windows vorgeschrieben?

Bis bald Chemiker

SirThornberry 16. Sep 2007 13:28

Re: TAlignment welcher Datentype?
 
eine enumeration wäre wohl das richtige. Und es gibt auch bereits einen Typ (siehe Alignment von TLabel).

Wenn du es unbedingt neu definieren willst:
Delphi-Quellcode:
type
  TAlignment = (esLeft, esCenter, esRight);

Christian Seehase 16. Sep 2007 13:34

Re: TAlignment welcher Datentype?
 
Moin Chemiker,

Zitat:

Zitat von Chemiker
Für mich wäre von Interesse zu erfahren, nach welchen Kriterien man dabei vorgeht. Wird das von Windows vorgeschrieben?

Bei Konstanten, die durch das OS vorgegeben sind, wie eben die Stile beim Erstellen von Controls, sollte man im PSDK (ggf. den Header-Files) mal nachschauen, welcher Datentyp verlangt wird.
In diesem Falle werden die Konstanten in MSDN-Library durchsuchenCreateWindow/MSDN-Library durchsuchenCreateWindowEx für den Parameter dwStyle benötigt, woraus sich dann ergibt, dass sie vom Typ her DWORD sein sollten.


[EDIT]
@Jens:
Schau Dir mal die WinUser.h an.
Zufällig passt es in diesem Falle mit einem Aufzählungstyp, aber auch nur, weil nach dem dritten Schluss gemacht wird.
Der nächste mögliche Stil hätte dann nämlich die 4, der übernächste die 8 usw..
Da sie alle im gleichen Parameter übergeben werden, und somit eine Bitmaske darstellen müssen, verdoppelt sich der Wert immer (vom ersten einmal abgesehen ;-))
[/EDIT]

Hansa 16. Sep 2007 13:52

Re: TAlignment welcher Datentype?
 
Wenn Windows 32 Bit braucht, für mögliche 3 Ganzzahlwerte darzustellen, dann muss man diese Verschwendung nicht noch im eigenen Programm fortsetzen. Für das hier :

Zitat:

Zitat von Windows.pas
ES_LEFT = 0;
ES_CENTER = 1;
ES_RIGHT = 2;

reicht Byte allemal aus. Die unnötige Vervierfachng macht in dem Fall wohl kaum was aus, aber es braucht sich zumindest keiner über den Speicherhunger von Windows zu ärgern. Um das wieder einzusparen kann man ja auch alles WinAPI-mäßig programmieren. :mrgreen:

Christian Seehase 16. Sep 2007 14:05

Re: TAlignment welcher Datentype?
 
Moin Hansa,

Zitat:

Zitat von Hansa
Wenn Windows 32 Bit braucht, für mögliche 3 Ganzzahlwerte darzustellen

dann werfe auch Du mal einen Blick in die WinUser.h. :mrgreen:

Die Edit-Styles beschränken sich nicht auf die drei genannten, sondern benötigen mindestens 16-Bit, ausserdem sind sie als Long deklariert.
Da die Werte zumindest intern mit den API-Funktionen verwendet werden, die dann, wie schon gesagt, ein DWORD erwarten, macht das Deklarieren als Byte auch keinen Sinn.

Luckie 16. Sep 2007 14:16

Re: TAlignment welcher Datentype?
 
Desweiteren liest eine 32-Bit CPU immer 32 Bit egal ob der Datentyp kleiner ist.

Chemiker 16. Sep 2007 21:40

Re: TAlignment welcher Datentype?
 
Hallo,

ich habe mir mal die WinUser.h angesehen und kann die Aussage von Christian bestätigen.
Siehe:

Delphi-Quellcode:
/*
 * Edit Control Styles
 */
#define ES_LEFT            0x0000L
#define ES_CENTER       0x0001L
#define ES_RIGHT         0x0002L
usw.

Beim Memo-Feld ist Alignments auch ein DWORD.

Delphi-Quellcode:
procedure TCustomMemo.CreateParams(var Params: TCreateParams);
const
  Alignments: array[Boolean, TAlignment] of DWORD =
    ((ES_LEFT, ES_RIGHT, ES_CENTER),(ES_RIGHT, ES_LEFT, ES_CENTER));
Allerdings habe ich bei einem anderen Control das auch schon als WORD gesehen, allerdings finde ich es zurzeit nicht mehr.
Bei der Suche nach dem richtigen Datentyp ist mir aufgefallen, dass fast alle Integer – Datentypen verwendet wurden.
Das finde ich irgendwie schon interessant, dass das nicht so ganz klar ist.

Ich bin aber jetzt der Meinung, wie Christian das DWORD der Richtige Datentyp ist.

Noch mal Danke an alle, für die Hilfe.


Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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