AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Übersetzung Class MagneticWindow

Ein Thema von EWeiss · begonnen am 9. Okt 2006 · letzter Beitrag vom 18. Dez 2006
Antwort Antwort
Seite 1 von 12  1 2311     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#1

Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 13:59
Wie in anderen Threads schon begonnen ..
Ich möchte meine Magnetic Class nach Delphi übersetzen um meinen
MediPlayer stück für stück nach Delphi zu konvertieren.

Die Classe emuliert die exakten Dockeigenschaften wie sie auch
in Winamp zur verfügung stehen.
Nach der Übersetzung werde ich sie hier zur verfügung stellen.

Meine aktuelle frage.

Code:
Vb:
Private Enum eMsgWhen
    [MSG_AFTER] = 1                                 
    [MSG_BEFORE] = 2                                 
    [MSG_BEFORE_AND_AFTER] = MSG_AFTER Or MSG_BEFORE
End Enum
Wie wird in Delphi Enum declariert ?

gruß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 14:14
Delphi-Quellcode:
Type
  eMsgWhen = ( MSG_AFTER, MSG_BEFORE, MSG_BEFORE_AND_AFTER );
Dabei wird aber die Wertbelegung anders gehandhabt. Das erste Element hat den Ordinalwert von 0, alle weiteren aufsteigend. Ich denke bei diesem Typ würde ein Set besser passen (vergleichbar mit einer Bitmaske):

Delphi-Quellcode:
Type
  eMsgWhen = Set Of ( MSG_AFTER, MSG_BEFORE );
Dann hast du die Möglichkeit die Typen zu kombinieren:

Beispiel:
Delphi-Quellcode:
Var
  lVar: eMsgWhen;
Begin
  lVar := []; // keins
  lVar := [MSG_AFTER, MSG_BEFORE]; // beide
  lVar := [MSG_AFTER]; // nur einer
End;
Zu dem Hinzufügen und Entfernen kannst du auch die Funktionen Include() und Exclude() nutzen. Abfragen ob ein Element in der Menge ist geschieht mit IN:
Delphi-Quellcode:
  If MSG_AFTER In lVar Then
    ShowMessage('jo, after');
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 14:24
Delphi-Quellcode:
Type
  eMsgWhen = Set Of ( MSG_AFTER, MSG_BEFORE );
wenn ich das richtig verstanden habe kann man den wert nicht direkt zuweisen.
Würde bedeuten MSG_AFTER ist gleichzusetzen mit 0 ?

gruß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 14:25
Zitat von EWeiss:
Delphi-Quellcode:
Type
  eMsgWhen = Set Of ( MSG_AFTER, MSG_BEFORE );
wenn ich das richtig verstanden habe kann man den wert nicht direkt zuweisen.
Würde bedeuten MSG_AFTER ist gleichzusetzen mit 0 ?

gruß
Ja, und MSG_BEFORE wäre mit dem Ordinalwert 1 gleich zu setzen.

Hinweis: Ich arbeite maximal mit Delphi 7, daher kann es gut sein, dass es in deiner Delphiversion die Möglichkeit der Wertzuweisung bei den Enum's gibt. Davon weiss ich aber nichts aus Ermangelung einer höheren Version. (Und ich weigere mich Dinge zu erlernen, die ich nicht praktisch anwenden kann...)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 14:36
Zitat:
Hinweis: Ich arbeite maximal mit Delphi 7, daher kann es gut sein, dass es in deiner Delphiversion die Möglichkeit der Wertzuweisung bei den Enum's gibt. Davon weiss ich aber nichts aus Ermangelung einer höheren Version. (Und ich weigere mich Dinge zu erlernen, die ich nicht praktisch anwenden kann...)
Ich habe es mal getestet.
Es scheint so als wenn der compiler es annehmen würde.
Kommt zumindest kein Fehler.

Delphi-Quellcode:
Type
  eMsgWhen = Set Of (MSG_AFTER = 1, MSG_BEFORE = 2, MSG_BEFORE_AND_AFTER = MSG_AFTER Or MSG_BEFORE);
    // MSG_AFTER Message calls back after the original (previous) WndProc
    // MSG_BEFORE Message calls back before the original (previous) WndProc
    // MSG_BEFORE_AND_AFTER Message calls back before and after the original (previous) WndProc
gruß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 14:46
Code:
Private Const ALL_MESSAGES    As Long = -1          'All messages added or deleted
Private Const CODE_LEN        As Long = 197         'Length of the machine code in bytes
Private Const GWL_WNDPROC     As Long = -4          'Get/SetWindow offset to the WndProc procedure address
Private Const PATCH_04         As Long = 88          'Table B (before) address patch offset
Private Const PATCH_05         As Long = 93          'Table B (before) entry count patch offset
Private Const PATCH_08         As Long = 132         'Table A (after) address patch offset
Private Const PATCH_09         As Long = 137         'Table A (after) entry count patch offset
Delphi-Quellcode:
Const
ALL_MESSAGES : Integer = -1; //All messages added or deleted
CODE_LEN : Integer = 197; //Length of the machine code in bytes
GWL_WNDPROC : Integer = -4; //Get/SetWindow offset to the WndProc procedure address
PATCH_04 : Integer = 88; //Table B (before) address patch offset
PATCH_05 : Integer = 93; //Table B (before) entry count patch offset
PATCH_08 : Integer = 132; //Table A (after) address patch offset
PATCH_09 : Integer = 137; //Table A (after) entry count patch offset
Das dürfte wohl so stimmen, GWL_WNDPROC wird man wohl entfernen können
da die Const eigentlich in der Windows.pas vorhanden sein müßte.

Code:
Private Type tSubData                               'Subclass data type
    hwnd                      As Long              'Handle of the window being subclassed
    nAddrSub                  As Long              'The address of our new WndProc (allocated memory).
    nAddrOrig                 As Long              'The address of the pre-existing WndProc
    nMsgCntA                  As Long              'Msg after table entry count
    nMsgCntB                  As Long              'Msg before table entry count
    aMsgTblA()                As Long              'Msg after table array
    aMsgTblB()                As Long              'Msg Before table array
End Type
Hier bin ich nicht sicher wie ich mit dem Variablen array verfahren soll.

Edit:
Denke so gehts!
Delphi-Quellcode:
Type TSubData = ^SubData; //Subclass data type
    SubData = record
    hwnd : Integer; //Handle of the window being subclassed
    nAddrSub : Integer; //The address of our new WndProc (allocated memory).
    nAddrOrig : Integer; //The address of the pre-existing WndProc
    nMsgCntA : Integer; //Msg after table entry count
    nMsgCntB : Integer; //Msg before table entry count
    aMsgTblA : array [] of Integer; //Msg after table array
    aMsgTblB : array [] of Integer; //Msg Before table array
End;
gruß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 14:58
In der Standardeinstellung sind deine Konstanten nicht wirklich konstant: man kann ihnen Werte zuweisen. So sind es dann statische Variablen.

Warum definierst du einen Zeiger auf die Struktur? Im Normalfall wird mit Txxx eine Klasse oder eine Struktur gekennzeichnet. Einem Zeiger auf eine Struktur wird im Normalfall ein Pxxx anstatt einem Txxx vorangestellt.

Und die [] bei dem Array kannst du getrost weglassen...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 15:25
Zitat von Muetze1:
In der Standardeinstellung sind deine Konstanten nicht wirklich konstant: man kann ihnen Werte zuweisen. So sind es dann statische Variablen.

Warum definierst du einen Zeiger auf die Struktur? Im Normalfall wird mit Txxx eine Klasse oder eine Struktur gekennzeichnet. Einem Zeiger auf eine Struktur wird im Normalfall ein Pxxx anstatt einem Txxx vorangestellt.

Und die [] bei dem Array kannst du getrost weglassen...
Delphi-Quellcode:
Type PSubData = ^TSubData; //Subclass data type
    TSubData = record
    hwnd : Integer; //Handle of the window being subclassed
    nAddrSub : Integer; //The address of our new WndProc (allocated memory).
    nAddrOrig : Integer; //The address of the pre-existing WndProc
    nMsgCntA : Integer; //Msg after table entry count
    nMsgCntB : Integer; //Msg before table entry count
    aMsgTblA : array of Integer; //Msg after table array
    aMsgTblB : array of Integer; //Msg Before table array
End;
Mit den Zeiger habe ich mir abgeschaut um die Leute hier nicht zu nerven
Wird hier kein zeiger benötigt? Und wenn warum ?

gruß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#9

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 15:32
Wenn möglich sollte man wohl bei Integer- und Stringkonstanten keinen Typ angeben

Delphi-Quellcode:
const
  abc = 123;
  def = 'xyz';
Das hat vorallem den Vorteil, daß der Typ nicht schon da festgelegt ist und dieser dann anhand des Wertes und bei direkter Übergabe anhand des dortigen Types vom Compiler festgelegt wird.

Speziell den String kann man dann auch als WideString/PWideChar übergeben, ohne daß es zu inkompatiblen Typen (AnsiString<>WideString und PAnsiChar<>PWideChar) kommt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: Übersetzung Class MagneticWindow

  Alt 9. Okt 2006, 15:40
Zitat von himitsu:
Wenn möglich sollte man wohl bei Integer- und Stringkonstanten keinen Typ angeben

Delphi-Quellcode:
const
  abc = 123;
  def = 'xyz';
Das hat vorallem den Vorteil, daß der Typ nicht schon da festgelegt ist und dieser dann anhand des Wertes und bei direkter Übergabe anhand des dortigen Types vom Compiler festgelegt wird.

Speziell den String kann man dann auch als WideString/PWideChar übergeben, ohne daß es zu inkompatiblen Typen (AnsiString<>WideString und PAnsiChar<>PWideChar) kommt.
Das ist allerdings ein argument.
Hab sowieso meine problem mit der konvertierung von einigen variablen.
Aber das kommt noch Eile mit weile.

werd dann mal die integer alle löschen


gruß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 12  1 2311     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 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