AGB  ·  Datenschutz  ·  Impressum  







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

Codeoptimierung verursacht probleme

Ein Thema von EWeiss · begonnen am 20. Jan 2017 · letzter Beitrag vom 20. Jan 2017
Antwort Antwort
Seite 2 von 3     12 3      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 14:26
Hallo,
wenn du weisst, dass da ein RangeError kommen kann,
warum machst du nicht ein

Delphi-Quellcode:
try
  der Code
except
  ; // leer
end;
drumrum?
Heiko
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 14:40
EDIT:
Er gibt mir einen ErangeError sagt aber nicht wo.
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?!?!

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:
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 14:53
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

Geändert von EWeiss (11. Jul 2019 um 16:45 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 15:55
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 16:03
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

Geändert von EWeiss (20. Jan 2017 um 16:32 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 16:12
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 SetWindowLongPtr und GetWindowLongPtr in deiner Delphi-Version definiert?
Welche Datentypen stehen da im Funktionskopf?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 16:21
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 SetWindowLongPtr und 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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 17:13
Auf welchen Datentyp mappt LONG_PTR in deiner Delphi-Version?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#19

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 17:31
Auf welchen Datentyp mappt LONG_PTR in deiner Delphi-Version?
  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.
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

Geändert von EWeiss (20. Jan 2017 um 17:38 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 17:38
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 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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22: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