Delphi-PRAXiS
Seite 3 von 3     123   

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 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 07:21 Uhr.
Seite 3 von 3     123   

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