![]() |
AW: Codeoptimierung verursacht probleme
Hallo,
wenn du weisst, dass da ein RangeError kommen kann, warum machst du nicht ein
Delphi-Quellcode:
drumrum?
try
der Code except ; // leer end; |
AW: Codeoptimierung verursacht probleme
Zitat:
Du musst das Programm im Debugger starten?!?! Zitat:
Einfach mal auf die entsprechenden Datentypen per Strg+Linksklick oder Doku stöbern. Und wenn du Handles und ähnliche Daten (THandle, HWND, HDC, COLORREF, DWORD...) per SetProperty hart auf Integer castet, dann brauchst du dich nich wundern das da nur Quatsch bei GetProperty zurückkommt und du Bereichfehler bekommst. |
AW: Codeoptimierung verursacht probleme
Zitat:
Logisch start ich das Program im debugmodus. Zitat:
Zitat:
Was ein DWord und Integer ist ich schon klar darum geht es aber nicht. So oder so muss ich wenn ich Style in welcher Form auch immer mit GetWindowLong in Erfahrung bringen will über Integer gehen da geht kein weg dran vorbei. Hab das THandle mal weggelassen ist auch nur ein HWND. ;) Und ColorRef ein DWORD. Zitat:
Ansonsten würde ja nichts laufen :) Noch ein Bild für ungläubige Thomase Nebenbei: Du solltest dich mal etwas mehr mit dem WndClassEx Flag cbWndExtra beim erstellen eines Window befassen. Danach können wir weiterreden warum ich GetWindowLong und SetWindowLong verwende und meine Daten über Propertys in den Speicher schreibe. ![]() gruss |
AW: Codeoptimierung verursacht probleme
Delphi-Quellcode:
Bitte obigen Code mal ausführen.
const
EXTEND_EXTRA = 10; procedure SetProperty(WinHandle: HWND; Item: integer; V: integer); begin if (Item > 0) and (Item < EXTEND_EXTRA + 1) and (WinHandle <> 0) then SetWindowLong(WinHandle, (Item - 1) * 4, V); end; function GetProperty(WinHandle: HWND; Item: integer): integer; begin Result := 0; if (Item > 0) and (Item < EXTEND_EXTRA + 1) and (WinHandle <> 0) then Result := GetWindowLong(WinHandle, (Item - 1) * 4); end; procedure Test; var Item: integer; V: integer; DesktopDeviceContext: HDC; I: Integer; begin for I := 0 to 100 do begin Item := 1; DesktopDeviceContext := GetDC(0); SetProperty(0, Item, DesktopDeviceContext); V := GetProperty(0, Item); end; end; Was passiert bei eingeschalteter Bereichs- und Überlaufprüfung und warum? |
AW: Codeoptimierung verursacht probleme
Da muss ich nichts ausführen da mir das Problem bekannt ist.
Es sich aber bei mir nicht anders Händeln lässt ohne zusätzliche Listen zu generieren was ich nicht will. Aber: Dir sollte klar sein das du nur ein Maximum von 40Bytes bei alten Systemen und etwa 56 (14 * 4) bei neueren bereitstellen kannst. Oder? Du kannst also nicht machen was du willst. gruss |
AW: Codeoptimierung verursacht probleme
Zitat:
Delphi-Quellcode:
und
SetWindowLongPtr
Delphi-Quellcode:
in deiner Delphi-Version definiert?
GetWindowLongPtr
Welche Datentypen stehen da im Funktionskopf? |
AW: Codeoptimierung verursacht probleme
Zitat:
Delphi-Quellcode:
gruss
{$EXTERNALSYM GetWindowLongPtr}
function GetWindowLongPtr(hWnd: HWND; nIndex: Integer): LONG_PTR; stdcall; {$EXTERNALSYM SetWindowLongPtr} function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR; stdcall; function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; stdcall; function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; stdcall; |
AW: Codeoptimierung verursacht probleme
Auf welchen Datentyp mappt
Delphi-Quellcode:
in deiner Delphi-Version?
LONG_PTR
|
AW: Codeoptimierung verursacht probleme
Zitat:
Delphi-Quellcode:
LONG_PTR = Longint;
Habe mir dein Teil mal angesehen. Du versuchst Propertys zu speichern btw.. zu setzen die du gar nicht zugewiesen hast. Damit dein Beispiel funktioniert muss erst mal EXTEND_EXTRA auf 56Bytes festgelegt werden. Dann must du den Speicher dafür reservieren.. dazu must du den WindowStyle der Form verändern und für "cbWndExtra" die Bytes zuweisen. Davon das die Resourcen nicht freigegeben werden mal ganz abgesehen.
Delphi-Quellcode:
ReleaseDC(Form1.Handle, DesktopDeviceContext);
Bsp.
Delphi-Quellcode:
so wie du das versucht hast wird das nix.
const
FORM_BACKPaintBitmap = 14; // Memory Bitmap' EXTEND_EXTRA = FORM_BACKPaintBitmap; wc: TWndClassEx; wc.cbWndExtra := EXTEND_EXTRA * 4; // = 56Byte Du setzt irgendwelche propertys ins nirvana. Letztendlich tut der Code eh nichts da kein Handle angegeben worden ist. (Rückgabe immer 0) Warum da jetzt ein ERangeError kommt keine Ahnung.. Get/SetWindowLong wird ja nie aufgerufen. gruss |
AW: Codeoptimierung verursacht probleme
Zitat:
Delphi-Quellcode:
; in einen kleinen Konsolenprogramm mit eingeschalteter Bereichprüfung aus.
procedure Test
Hier jetzt mal als minimalstes Beispiel.
Delphi-Quellcode:
procedure SetProperty(V: integer);
begin // bewusst leer! end; procedure Test; var DesktopDeviceContext: HDC; I: Integer; begin for I := 0 to 100 do begin DesktopDeviceContext := GetDC(0); SetProperty(DesktopDeviceContext); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr. |
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