Delphi-PRAXiS
Seite 6 von 12   « Erste     456 78     Letzte »    

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/)
-   -   Übersetzung Class MagneticWindow (https://www.delphipraxis.net/78689-uebersetzung-class-magneticwindow.html)

xaromz 11. Okt 2006 09:14

Re: Übersetzung Class MagneticWindow
 
Hallo,

eine grundsätzliche Anmerkung habe ich noch. Du benutzt reichlich kryptische Variablennamen (m_uWndInfo ist so ein Beispiel). Wenn Du auch nach zwei Wochen noch verstehen willst, was Dein Programm macht, dann solltest Du Dir vielleicht aussagekräftigere Namen ausdenken. Diese sind dann automatisch Teil der Dokumentation des Programms, d. h. der Quellcode wird selbstbeschreibend. Und Unterstriche in Variablennamen sind in Delphi sowieso verpönt. Übrigens können wir Dir auch besser helfen, wenn wir verstehen, was Du da schreibst :wink: .

Hilfreich ist möglicherweise der Object Pascal Style Guide.

Gruß
xaromz

Muetze1 11. Okt 2006 10:59

Re: Übersetzung Class MagneticWindow
 
Wieso kryptisch? Ich habe (intuitiv) seine Variablen so verstanden:

- Wenn es ein Klassenmember ist, dann kommt vorne ein "m_" als Präfix vor.
- Dann folgt der Typ. So ist ein Boolean in einer Klasse deklariert: m_bXXX, ein Long und nicht als Member: lngXXX

Und der Name dahinter gibt den Inhalt an sich an, also die Bedeutung. Der Typ und Deklarationsort sind zuvor definiert. Was ist daran unklar? Ok, das mit dem Unterstrich. Grundlegend könnte ich an seinen bisherigen Benennungen nichts wirklich schlechtes vorwerfen - da gibt es genug andere Beispiel wo gar nichts in der Richtung gesagt wird.

EWeiss 11. Okt 2006 13:05

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Muetze1
Wieso kryptisch? Ich habe (intuitiv) seine Variablen so verstanden:

- Wenn es ein Klassenmember ist, dann kommt vorne ein "m_" als Präfix vor.
- Dann folgt der Typ. So ist ein Boolean in einer Klasse deklariert: m_bXXX, ein Long und nicht als Member: lngXXX

Und der Name dahinter gibt den Inhalt an sich an, also die Bedeutung. Der Typ und Deklarationsort sind zuvor definiert. Was ist daran unklar? Ok, das mit dem Unterstrich. Grundlegend könnte ich an seinen bisherigen Benennungen nichts wirklich schlechtes vorwerfen - da gibt es genug andere Beispiel wo gar nichts in der Richtung gesagt wird.

absolut korrect.
Ich konnte im ersten moment die argumentation wegen der benennung
auch nicht nachvollziehen.

@xaromz
Habe aber nichts gegen einzuwenden ihn auf den Pascal Style zu konvertieren.
das könnte man zum schluss erledigen, wenn es komplett durchgelaufen ist.

gruß

EWeiss 11. Okt 2006 13:11

Re: Übersetzung Class MagneticWindow
 
Also so:
Delphi-Quellcode:
// Add info
m_uWndInfo[m_lWndCount -1].hwnd := Handle;
m_uWndInfo[m_lWndCount -1].hWndParent := hWndParent;
Gutes argument.
Werde es ändern. ;)

Das verändern der Variablen(Namen) möchte ich erst in angriff wenn der erste Durchlauf
mal erfolgreich war.

Gruß

EWeiss 11. Okt 2006 13:28

Re: Übersetzung Class MagneticWindow
 
Altes aber dennoch neues Problem.

Gerate bei der Übergabe einer neuen SnapWidth in eine Endlosschleife.
Kann also irgendetwas mit der Property SnapWidth noch nicht stimmen.

Habe beide Varianten versucht.
Delphi-Quellcode:
    property SnapWidth: Integer read FSnapWidth write SetSnapWidth;
Delphi-Quellcode:
    property SnapWidth: Integer read GetSnapWidth write SetSnapWidth;
Die eine verursacht eine endlosschleife, die andere einen AV.

Hat sich erledigt!


gruß

EWeiss 11. Okt 2006 15:18

Re: Übersetzung Class MagneticWindow
 
Original
Code:
        'Convert the string from hex pairs to bytes and store in the machine code buffer
        i = 1
        Do While j < CODE_LEN
            j = j + 1
            sc_aBuf(j) = CByte("&H" & Mid$(sSubCode, i, 2)) 'Convert a pair of hex characters to an eight-bit value and store in the static code buffer array
            i = i + 2
        Loop                                               'Next pair of hex characters
Übersetzt.
Delphi-Quellcode:
        //Convert the string from hex pairs to bytes and store in the machine code buffer
        i := 1;
         While j < CODE_LEN Do
            inc(j);
            sc_aBuf[j] := byte(MidStr('$' + sSubCode, i, 2)); //Convert a pair of hex characters to an
                                                              //eight-bit value and store in the static code buffer array
            i := i + 2;
Delphi-Quellcode:
function MidStr(Const Str: String; From, Size: Word): String;
begin
  MidStr := Copy(Str, From, Size)
end;
Fehler!
Zitat:

[Pascal Error] Magnetic.pas(850): E2089 Invalid typecast
Wie kann ich den String MidStr('$' + sSubCode, i, 2); nach byte convertieren ?

gruß

Muetze1 11. Okt 2006 16:01

Re: Übersetzung Class MagneticWindow
 
1. wieder Result
2. Mit StrToInt() kannst du Zahlen in hexadezimaler Schreibweise konvertieren, wenn diese mit einer "$" eingeleitet werden. Sonst würde er sie in dezimaler Schreibweise konvertieren..

EWeiss 11. Okt 2006 16:16

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Muetze1
1. wieder Result
2. Mit StrToInt() kannst du Zahlen in hexadezimaler Schreibweise konvertieren, wenn diese mit einer "$" eingeleitet werden. Sonst würde er sie in dezimaler Schreibweise konvertieren..

Delphi-Quellcode:
function MidStr(Const Str: String; From, Size: Word): String;
begin
  Result := Copy(Str, From, Size)
end;
Ist gewohnheit muss mich dran gewöhnen das die rückgabe .. Result ist. :)

Delphi-Quellcode:
sc_aBuf    : array [1..CODE_LEN] of Byte;
sc_aBuf[j] := Byte(StrToInt(MidStr('$' + sSubCode, i, 2)));
Wie oben schneidet er mit einen Wert vom string ab
Sollte '$55' sein gibt aber '$5' aus .AV
sc_aBuf[j] ist ein Array of byte.

So funktioniert das nicht. :(

gruß

EWeiss 11. Okt 2006 16:55

Re: Übersetzung Class MagneticWindow
 
Geht jetzt!
Waren ein paar probleme mit der Schleife.

Delphi-Quellcode:
        //Convert the string from hex pairs to bytes and store in the machine code buffer
        i := 1;
        j := 0;

         While j < CODE_LEN Do
          begin
            inc(j);
            sc_aBuf[j] := Byte(StrToInt('$' + MidStr(sSubCode, i, 2))); //Convert a pair of hex characters to an
                                                   //eight-bit value and store in the static code buffer array
            i := i + 2;
          end;
gruß

EWeiss 11. Okt 2006 17:35

Re: Übersetzung Class MagneticWindow
 
Habe die aktuelle Version noch mal hochgeladen.
Fehlte noch eine 'end else' abfrage in Subclass_Start.

Jetzt wird es mal wieder schwierig.

Delphi-Quellcode:
PATCH_0A = 186; //Address of the owner object
Delphi-Quellcode:
zPatchVal(VarPtr(sc_aBuf(1)), PATCH_0A, ObjPtr(Me))
VarPtr ??? , ObjPtr ???

und

Delphi-Quellcode:
procedure TMagnetic.zPatchVal(nAddr: Integer; nOffset: Integer; nValue: Integer);
//Patch the machine code buffer at the indicated offset with the passed value
begin
    RtlMoveMemory(nAddr + nOffset, nValue, 4);
End;
RtlMoveMemory ???

Edit:
Scheint das gleiche wie CopyMemory zu sein!
Code:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (xDest As Any, xSource As Any, ByVal nbytes As Long)
gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.
Seite 6 von 12   « Erste     456 78     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz