Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Codeoptimierung verursacht probleme (https://www.delphipraxis.net/191477-codeoptimierung-verursacht-probleme.html)

hoika 20. Jan 2017 13:26

AW: Codeoptimierung verursacht probleme
 
Hallo,
wenn du weisst, dass da ein RangeError kommen kann,
warum machst du nicht ein

Delphi-Quellcode:
try
  der Code
except
  ; // leer
end;
drumrum?

TiGü 20. Jan 2017 13:40

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von EWeiss (Beitrag 1359386)
Zitat:

Zitat von TiGü (Beitrag 1359384)
Zitat:

Zitat von EWeiss (Beitrag 1359340)
EDIT:
Er gibt mir einen ErangeError sagt aber nicht wo. :wall:

Weiß ja nicht, ob das früher anderes war, aber wenn man das Programm aus der IDE heraus im Debugger laufen lässt, kommt in der Regel eine Messagebox hoch, wo man auf Break/Anhalten klicken kann.
Außer natürlich, du hast ERangeError irgendwann mal ganz klugerweise auf ignorieren gestellt.

Nö nur wo man OK klicken kann.

Da ist es doch schon zuspät. Das klingt so, als ob du das Programm nur so startest, ohne Debugger.
Du musst das Programm im Debugger starten?!?!

Zitat:

Zitat von EWeiss (Beitrag 1359386)
Ich speicher verschiedene Datentypen in propertys wenn dieses Property den Bereich eines Integer verlässt also minus wird
kracht es das kann ich aber nicht ändern.

Delphi-Quellcode:
procedure TSkinEngine.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;
Delphi-Quellcode:
function TSkinEngine.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;
Sagen wir mal das Property das gelesen wird ist ein HDC und dieses hat einen negativen wert -123134345
Dann tritt ein ERangeError auf.

Ich kann aber bei GetWindowLong kein DWORD zurückgeben und es erwartet einen Integer für Index.
Ich wüsste jetzt nicht wie ich das behandeln sollte.

Erweitertes Beispiel:
Delphi-Quellcode:
SkinEngine.SetProperty(Handle, PROP_TEXT_COLOR, TextCol);

TextCol wird jetzt in das Property gespeichert.
TextColor ist COLORREF also DWord kann minus werte enthalten und das verletzt die Untergrenze (Integer). outofbounds

Irgendwie verwechselst du die grundlegenden Datentypen. Integer ist vorzeichenbehaftet, DWORD ist ohne Vorzeichen.
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.

EWeiss 20. Jan 2017 13:53

AW: Codeoptimierung verursacht probleme
 
Zitat:

Da ist es doch schon zuspät. Das klingt so, als ob du das Programm nur so startest, ohne Debugger.
Du musst das Programm im Debugger starten?!?!
Muss ich dazu noch was sagen?
Logisch start ich das Program im debugmodus.

Zitat:

Und wenn du Handles und ähnliche Daten (HWND, HDC, DWORD...)
Sorry das ist quatsch.

Zitat:

Irgendwie verwechselst du die grundlegenden Datentypen. Integer ist vorzeichenbehaftet, DWORD ist ohne Vorzeichen.
Ich verwechsele gar nichts.
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:

das da nur Quatsch bei GetProperty zurückkommt
Ach nein... ohne Bereichsprüfung kommt genau das an was ankommen soll.
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.
Ein kleiner Link


gruss

TiGü 20. Jan 2017 14:55

AW: Codeoptimierung verursacht probleme
 
Delphi-Quellcode:
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;
Bitte obigen Code mal ausführen.
Was passiert bei eingeschalteter Bereichs- und Überlaufprüfung und warum?

EWeiss 20. Jan 2017 15:03

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

TiGü 20. Jan 2017 15:12

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von EWeiss (Beitrag 1359409)
Da muss ich nichts ausführen da mir das Problem bekannt ist.
Es sich aber bei mir nicht anders händlen lässt ohne zusätzliche Listen zu generieren was ich nicht will.

Wie sind die Funktionen
Delphi-Quellcode:
SetWindowLongPtr
und
Delphi-Quellcode:
GetWindowLongPtr
in deiner Delphi-Version definiert?
Welche Datentypen stehen da im Funktionskopf?

EWeiss 20. Jan 2017 15:21

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von TiGü (Beitrag 1359411)
Zitat:

Zitat von EWeiss (Beitrag 1359409)
Da muss ich nichts ausführen da mir das Problem bekannt ist.
Es sich aber bei mir nicht anders händlen lässt ohne zusätzliche Listen zu generieren was ich nicht will.

Wie sind die Funktionen
Delphi-Quellcode:
SetWindowLongPtr
und
Delphi-Quellcode:
GetWindowLongPtr
in deiner Delphi-Version definiert?
Welche Datentypen stehen da im Funktionskopf?

Delphi-Quellcode:
{$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;
gruss

TiGü 20. Jan 2017 16:13

AW: Codeoptimierung verursacht probleme
 
Auf welchen Datentyp mappt
Delphi-Quellcode:
LONG_PTR
in deiner Delphi-Version?

EWeiss 20. Jan 2017 16:31

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von TiGü (Beitrag 1359417)
Auf welchen Datentyp mappt
Delphi-Quellcode:
LONG_PTR
in deiner Delphi-Version?

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:
const
  FORM_BACKPaintBitmap = 14; // Memory Bitmap'
  EXTEND_EXTRA = FORM_BACKPaintBitmap;

wc: TWndClassEx;
wc.cbWndExtra := EXTEND_EXTRA * 4; // = 56Byte
so wie du das versucht hast wird das nix.
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

TiGü 20. Jan 2017 16:38

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von EWeiss (Beitrag 1359420)
Habe mir dein Teil mal angesehen.
Du versuchst Propertys zu speichern btw.. zu setzen die du gar nicht zugewiesen hast.

Emil, sei doch bitte so gut und denke nicht schon drei Schritte weiter, sondern fange ganz vorne an und probiere die
Delphi-Quellcode:
procedure Test
; in einen kleinen Konsolenprogramm mit eingeschalteter Bereichprüfung aus.

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:33 Uhr.
Seite 2 von 3     12 3      

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