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
TiGü

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

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 15: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
 
#2

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 15: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.079 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Codeoptimierung verursacht probleme

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

n/a Beiträge
 
#4

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 16: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 16:38 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 16: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
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Codeoptimierung verursacht probleme

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

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

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

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 16:52
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:
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?
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:17 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