Delphi-PRAXiS

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)

EWeiss 20. Jan 2017 08:47

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

Zacherl 20. Jan 2017 09:02

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.

EWeiss 20. Jan 2017 09:15

AW: Codeoptimierung verursacht probleme
 
Zitat:

Schalte am besten mal alle Überlaufprüfungen an
Ok Danke werde ich mal machen.

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

hoika 20. Jan 2017 10:51

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.

EWeiss 20. Jan 2017 11:03

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von hoika (Beitrag 1359372)
Hallo,
MadExcept zeigt dir die Stelle an.
Das muss aber auch mit der IDE gehen,
wenn der RangeError kommt, F7 drücken.

Danke.
Wenn der Dialog erscheint zeigt er mir nichts wenn ich F7 drücke mit D2010

gruss

EWeiss 20. Jan 2017 11:59

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

TiGü 20. Jan 2017 12:45

AW: Codeoptimierung verursacht probleme
 
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.

EWeiss 20. Jan 2017 12:58

AW: Codeoptimierung verursacht probleme
 
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.
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:
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

gruss

TiGü 20. Jan 2017 13:17

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von EWeiss (Beitrag 1359379)
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

Wenn du das ein bisschen entzerren würdest, wäre dir auch klarer woher der Fehler kommt.
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;

EWeiss 20. Jan 2017 13:22

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von TiGü (Beitrag 1359388)
Zitat:

Zitat von EWeiss (Beitrag 1359379)
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

Wenn du das ein bisschen entzerren würdest, wäre dir auch klarer woher der Fehler kommt.
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;

Mag ja sein das ich damit den Fehler behandeln könnte aber es gibt noch genug andere die nicht zu beheben sind.
Der Datentypen mismatch halt.
Siehe die anderen Beispiele weiter oben.

gruss

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;

EWeiss 20. Jan 2017 16:40

AW: Codeoptimierung verursacht probleme
 
Zitat:

Emil, sei doch bitte so gut und denke nicht schon drei Schritte weiter
Werde ich tun und habe ich schon gemacht ;)
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:

Hier jetzt mal als minimalstes Beispiel.
Hat auch einen ErangeError keine Ahnung warum. Oder aber
LongWord <> Integer.. das ist bekannt. Aber wie gesagt ich kann das nicht ändern.
GetWindowLong erwartet einen Integer.

gruss

TiGü 20. Jan 2017 16:52

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von EWeiss (Beitrag 1359426)
Zitat:

Emil, sei doch bitte so gut und denke nicht schon drei Schritte weiter
Werde ich tun und habe ich schon gemacht ;)
Mit kleinen Änderungen.
Die Änderungen die noch gemacht werden müssen habe ich im vorherigen Post schon mitgeteilt.

Zuviel, zu weit gedacht. Ich schrieb: "denke NICHT schon drei Schritte weiter".


Zitat:

Zitat von EWeiss (Beitrag 1359426)
Zitat:

Hier jetzt mal als minimalstes Beispiel.
Hat auch einen ErangeError keine Ahnung warum.

Wenn du das herausfindest und die richtigen Schlüsse daraus ziehst, dann kannst du viele deiner Probleme lösen.

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?

EWeiss 20. Jan 2017 16:53

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zuviel, zu weit gedacht. Ich schrieb: "denke NICHT schon drei Schritte weiter".
Ok ;) Kein Problem.

Zitat:

Wenn du das herausfindest und die richtigen Schlüsse daraus ziehst, dann kannst du viele deiner Probleme lösen.
Kann ich mir denken ;)

Aber nochmal ich benötige den Integer.
Zitat:

Wie groß sind die Wertebereiche von Integer und Cardinal/DWORD/HWND/COLORREF?
4 Byte

Zitat:

Was passiert wenn man ein 250 Gramm Stück Butter durch ein Schlüsselloch drückt?
Ka :) Ist das Neu?

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.

EWeiss 20. Jan 2017 19:37

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:
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;
gruss

Zacherl 20. Jan 2017 22:02

AW: Codeoptimierung verursacht probleme
 
Was passiert, wenn du die Checks und Neuzuweisungen von M, I und J vor das
Delphi-Quellcode:
SetRect
ziehst und statt der Felder des Rects, die Variablen direkt anpasst?

EWeiss 20. Jan 2017 22:12

AW: Codeoptimierung verursacht probleme
 
Zitat:

Zitat von Zacherl (Beitrag 1359446)
Was passiert, wenn du die Checks und Neuzuweisungen von M, I und J vor das
Delphi-Quellcode:
SetRect
ziehst und statt der Felder des Rects, die Variablen direkt anpasst?

Ich weiß jetzt nicht genau wie du das meinst.
Ganzer Quelltext

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 05:54 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