![]() |
Codeoptimierung verursacht probleme
Warum verursacht die Code Optimierung wenn eingeschaltet unterschiedliche
Ansichten der Grafischen Oberfläche? Wenn ausgeschaltet sieht alles normal aus wenn ein wird es Unansehnlich nicht so wie es soll. Wenn nötig hänge ich zwei Bilder an. gruss |
AW: Codeoptimierung verursacht probleme
Wenn die Code-Optimierung Probleme verursacht, dann liegt meiner Erfahrung nach zu 99% irgendwo ein Programmierfehler vor (Ausnahmen bestätigen natürlich die Regel). Insbesondere Buffer-Overflows werden manchmal erst durch die Optimierung enttarnt. Schalte am besten mal alle Überlaufprüfungen an - vielleicht hast du ja Glück und stößt direkt auf die verantwortliche Stelle.
|
AW: Codeoptimierung verursacht probleme
Zitat:
Nebenbei die DLL ist dann auch kleiner wenn die Optimierung eingeschaltet ist. Bringt mir nur nichts wenn sich dadurch die Ansichten verändern. Hänge mal die Bilder an. Ausgeschalteter zustand ist korrekt. EDIT: Er gibt mir einen ErangeError sagt aber nicht wo. :wall: gruss |
AW: Codeoptimierung verursacht probleme
Hallo,
MadExcept zeigt dir die Stelle an. Das muss aber auch mit der IDE gehen, wenn der RangeError kommt, F7 drücken. |
AW: Codeoptimierung verursacht probleme
Zitat:
Wenn der Dialog erscheint zeigt er mir nichts wenn ich F7 drücke mit D2010 gruss |
AW: Codeoptimierung verursacht probleme
Beispiel..
Delphi-Quellcode:
SetRect(pr^[pData^.rdh.nCount], M, J, I, J + 1);
nCount ist DWORD die Übergabe muss aber Integer sein. Es kracht wenn die Werte minus enthalten Das
Delphi-Quellcode:
SetRect(pr^[Integer(pData^.rdh.nCount)]
bringt nichts. Das ist der Grund warum ich keine Bereichs Prüfung einschalte. gruss |
AW: Codeoptimierung verursacht probleme
Zitat:
Außer natürlich, du hast ERangeError irgendwann mal ganz klugerweise auf ignorieren gestellt. |
AW: Codeoptimierung verursacht probleme
Zitat:
Und nein bei mir werden alle Native BS Exceptions behandelt. Mit MadExcept geht's aber ich kann die ERangeError's nicht behandeln. 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:
Sagen wir mal das Property das gelesen wird ist ein HDC und dieses hat einen negativen wert -123134345
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; 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 gruss |
AW: Codeoptimierung verursacht probleme
Zitat:
Delphi-Quellcode:
var
KlugbenanntesRect: TRect; RectCount: DWORD; ... begin SetRect(KlugbenanntesRect, M, J, I, J + 1); RectCount := pData^.rdh.nCount; if (RectCount > 0) and (RectCount < Length(pr^)) then begin pr^[RectCount] := KlugbenanntesRect; end; end; |
AW: Codeoptimierung verursacht probleme
Zitat:
Der Datentypen mismatch halt. Siehe die anderen Beispiele weiter oben. gruss |
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; |
AW: Codeoptimierung verursacht probleme
Zitat:
Mit kleinen Änderungen. Die Änderungen die noch gemacht werden müssen habe ich im vorherigen Post schon mitgeteilt.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} const EXTEND_EXTRA = 56; 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 := GetWindowLongPtr(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(Form1.Handle, Item, DesktopDeviceContext); V := GetProperty(Form1.Handle, Item); ReleaseDC(Form1.Handle, DesktopDeviceContext) end; end; procedure TForm1.Button1Click(Sender: TObject); begin Test; end; end. Zitat:
LongWord <> Integer.. das ist bekannt. Aber wie gesagt ich kann das nicht ändern. GetWindowLong erwartet einen Integer. gruss |
AW: Codeoptimierung verursacht probleme
Zitat:
Zitat:
Tipp: Was passiert wenn man ein 250 Gramm Stück Butter durch ein Schlüsselloch drückt? Wie groß sind die Wertebereiche von Integer und Cardinal/DWORD/HWND/COLORREF? |
AW: Codeoptimierung verursacht probleme
Zitat:
Zitat:
Aber nochmal ich benötige den Integer. Zitat:
Zitat:
Wenn du meinst ich soll die Variablen konvertieren. Das hab ich schon
Delphi-Quellcode:
SetProperty(Form1.Handle, Item, Integer(DesktopDeviceContext));
Funktioniert in deinen Beispiel aber nicht bei mir ok muss den richtigen DatenTyp verwenden dann geht's. |
AW: Codeoptimierung verursacht probleme
Der SetRect macht immer noch Probleme.
Deine Bereinigung hat leider nicht funktioniert. Trotzdem Danke für deine Hilfe einiges habe ich nun beheben können. Demnächst lass ich die Bereichsprüfung immer an nachträglich beheben ist schlecht.
Delphi-Quellcode:
var
KlugbenanntesRect: TRect; RectCount: DWORD; ... begin SetRect(KlugbenanntesRect, M, J, I, J + 1); RectCount := pData^.rdh.nCount; if (RectCount > 0) and (RectCount < Length(pr^)) then begin pr^[RectCount] := KlugbenanntesRect; end; end;
Delphi-Quellcode:
gruss
type
TRectArray = array[0..0] of TRect; var pr: ^TRectArray; //--------- if I > M then begin if integer(pData^.rdh.nCount) >= MaxRegions then begin hRgn2 := ExtCreateRegion(nil, sizeof(RGNDATAHEADER) + (sizeof(TRECT) * pData^.rdh.nCount), PRGNDATA(pData)^); if hRgn1 = 0 then begin hRgn1 := hRgn2; end else begin CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); skDeleteObject(hRgn2); end; pData^.rdh.nCount := 0; end; pr := @pData^.Buffer; SetRect(pr^[pData^.rdh.nCount], M, J, I, J + 1); //<< macht ärger if M < lpRect.Left then lpRect.Left := M; if I > lpRect.Right then lpRect.Right := I; if J < lpRect.Top then lpRect.Top := J; if J > lpRect.Bottom then lpRect.Bottom := J + 1; Inc(pData^.rdh.nCount); Inc(lpRect); end; |
AW: Codeoptimierung verursacht probleme
Was passiert, wenn du die Checks und Neuzuweisungen von M, I und J vor das
Delphi-Quellcode:
ziehst und statt der Felder des Rects, die Variablen direkt anpasst?
SetRect
|
AW: Codeoptimierung verursacht probleme
Zitat:
![]() Das Problem liegt bei pr^[pData^.rdh.nCount] die anderen Variablem sind korrekt alles Integer. Das ist schon alt hab das nie bemerkt da die BereichsPrüfung aus war. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 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