Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zu viele Parameter bei SizeOf (https://www.delphipraxis.net/209059-zu-viele-parameter-bei-sizeof.html)

venice2 19. Okt 2021 19:24


Zu viele Parameter bei SizeOf
 
Ich will meine GDIPClock auf 64 Bit umlegen.
Soweit geht alles bis auf diese Probleme.

Das erste!
Delphi-Quellcode:
procedure SetTrayIcon(hWnd: hWnd; IconID: Integer; TipMsg: PChar;
  Update: Boolean);
begin
  with NIconD do
  begin
    cbSize := SizeOf(TNotifyIconData); // funktioniert unter 32 Bit
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallbackMessage := WM_TRAYEVENT;
    uID := $0815;
    hIcon := LoadIcon(hInstance, MAKEINTRESOURCE(IconID));
    lStrCpy(szTip, TipMsg);
    Wnd := hWnd;
  end;

  if not Update then
    Shell_NotifyIcon(NIM_ADD, @NIconD)
  else
    Shell_NotifyIcon(NIM_MODIFY, @NIconD);

end;
cbSize := SizeOf(TNotifyIconData); // funktioniert nicht mehr unter 64 Bit
erzählt mir immer etwas von
Zitat:

[dcc64 Fehler] ClockUnit.pas(249): E2034 Zu viele Parameter
Bei SizeOf..
Unter 64 Bit springt er hier rein. (ShellAPI) bei der Suche der Declaration.
Delphi-Quellcode:
  _NOTIFYICONDATAW = record
  private
    class constructor Create;
  public
    class function SizeOf: Integer; static;
  public
    cbSize: DWORD;
anstelle SizeOf von System zu verwenden.. Was soll der Blödsinn?
Gebe ich System.SizeOf(TNotifyIconData); an gibt es keinen Fehler aber ein Icon wird auch nicht erstellt.

Das Zweite
Delphi-Quellcode:
  if Msg.Msg = WM_SizeAdj then
  begin
    ScaleFactor := Msg.WParam / 100;
    Timer1Timer(Self);
  end;
ScaleFactor ist innerhalb des implementation Teil als
Delphi-Quellcode:
  ScaleFactor: double = 0.7;
und in der class TAdjustForm
Delphi-Quellcode:
    public
    { Public declarations }
     MainHandle : HWND;
     Transparency : integer;
     ScaleFactor: Double; // hier
     procedure ApplyLocalLanguage;
  end;
definiert.
jetzt mault er mir beim Kompilieren rum
Zitat:

[dcc64 Fehler] ClockUnit.pas(646): E2129 Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden
Ich denke der Compiler verwendet dann die Funktion ScaleFactor aus VCL.Controls

Keine Ahnung was das alles wieder soll.
Kann man nicht mal einfache Variablen übergeben ohne das die VCL dazwischen Funkt? Oder diese für sich reserviert?
Einer der Dinge warum ich damit nicht gerne arbeite.
Die Uses!
Delphi-Quellcode:
uses
  Winapi.Windows,
  Winapi.Messages,
  Winapi.ShellAPI,
  System.Win.Registry,
  System.UITypes,
  System.SysUtils,
  System.Classes,
  System.Math,
  VCL.Graphics,
  VCL.Forms,
  VCL.Controls,
  VCL.Dialogs,
  VCL.ExtCtrls,
  VCL.Menus,
  VCL.AppEvnts,
  uGDIUnit, uAARotateFast, uGlobal;
EDIT:
OK geht jetzt.
Habe den ScaleFactor von Global in die Classe TClockForm verschoben und die Default Value in FormCreate zugewiesen.
System.SizeOf(TNotifyIconData) geht jetzt auch habe meine Ressourcen Datei dafür angepaßt. Icon wird jetzt angezeigt.

Trotzdem Müll das sich die VCL überall reinhängt.
Wenn man Variablen nicht verwenden darf warum kennzeichnet man diese nicht einfach? :stupid:
Die haben mir meine "ScaleFactor" Variable geklaut und unter Controls eingefügt. Frechheit ist das!

Uwe Raabe 19. Okt 2021 21:08

AW: Zu viele Parameter bei SizeOf
 
Zitat:

Zitat von venice2 (Beitrag 1496295)
Trotzdem Müll das sich die VCL überall reinhängt.

Na ja, streng genommen ist es nicht die VCL, die sich in deinen Code mogelt, sondern dein Code, der mit der VCL kollidiert. Das geht uns aber allen so. Man muss sich halt an die Gegebenheiten anpassen.

venice2 19. Okt 2021 21:11

AW: Zu viele Parameter bei SizeOf
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1496301)
Zitat:

Zitat von venice2 (Beitrag 1496295)
Trotzdem Müll das sich die VCL überall reinhängt.

Na ja, streng genommen ist es nicht die VCL, die sich in deinen Code mogelt, sondern dein Code, der mit der VCL kollidiert. Das geht uns aber allen so. Man muss sich halt an die Gegebenheiten anpassen.

Variable ScaleFactor gab es schon unter D2010 in der Unit Controls?
Diesbezüglich wurden mir nie Probleme gemeldet.

HolgerX 20. Okt 2021 07:40

AW: Zu viele Parameter bei SizeOf
 
Hmm..

Zitat:

Zitat von venice2 (Beitrag 1496295)
Das erste!
Delphi-Quellcode:
procedure SetTrayIcon(hWnd: hWnd; IconID: Integer; TipMsg: PChar;
  Update: Boolean);
begin
  with NIconD do
  begin
    cbSize := SizeOf(TNotifyIconData); // funktioniert unter 32 Bit
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallbackMessage := WM_TRAYEVENT;
    uID := $0815;
    hIcon := LoadIcon(hInstance, MAKEINTRESOURCE(IconID));
    lStrCpy(szTip, TipMsg);
    Wnd := hWnd;
  end;

  if not Update then
    Shell_NotifyIcon(NIM_ADD, @NIconD)
  else
    Shell_NotifyIcon(NIM_MODIFY, @NIconD);

end;
cbSize := SizeOf(TNotifyIconData); // funktioniert nicht mehr unter 64 Bit
erzählt mir immer etwas von
Zitat:

[dcc64 Fehler] ClockUnit.pas(249): E2034 Zu viele Parameter
Bei SizeOf..
Unter 64 Bit springt er hier rein. (ShellAPI) bei der Suche der Declaration.
Delphi-Quellcode:
  _NOTIFYICONDATAW = record
  private
    class constructor Create;
  public
    class function SizeOf: Integer; static;
  public
    cbSize: DWORD;
anstelle SizeOf von System zu verwenden.. Was soll der Blödsinn?
Gebe ich System.SizeOf(TNotifyIconData); an gibt es keinen Fehler aber ein Icon wird auch nicht erstellt.


Dir ist bewust, dass Du dieses Problem selber verursachst hast?

Delphi-Quellcode:
  with NIconD do
  begin
    cbSize := SizeOf(TNotifyIconData); // funktioniert unter 32 Bit
Durch das WITH wird nunmal das 'SizeOf' von 'NIconD' verwendet und nicht das von System...
Wenn diese Abweichen, dann wird gemeckert.....

Deshalb:
Ein grundsätliche Regel (welche von vielen empfohlen wird):
KEIN 'WITH' verwenden! ;)

venice2 20. Okt 2021 08:34

AW: Zu viele Parameter bei SizeOf
 
Zitat:

Durch das WITH wird nunmal das 'SizeOf' von 'NIconD' verwendet und nicht das von System...
Wenn diese Abweichen, dann wird gemeckert.....
Du hast schon recht..

Mein Einwand aber dazu warum wird unter 32Bit, selber Code, dann nicht gemeckert?
Das widerspricht sich doch alles.

Aber danke habe es geändert waren nur 2 im ganzen Code
Zitat:

KEIN 'WITH' verwenden!
Jo, :) man ist halt ein Gewohnheitstier.

TiGü 20. Okt 2021 08:46

AW: Zu viele Parameter bei SizeOf
 
Zitat:

Zitat von venice2 (Beitrag 1496309)
Mein Einwand aber dazu warum wird unter 32Bit, selber Code, dann nicht gemeckert?
Das widerspricht sich doch alles.

Hast du TNotifyIconData unter Win32 irgendwo anders definiert?
Wohin springt er denn bei der Suche nach der Declaration für Win32?

Folgendes kompiliert in Delphi 10.4 unter Debug-Wind32 NICHT:

Delphi-Quellcode:
program Project6;

{$APPTYPE CONSOLE}

{$R *.res}


uses
    System.SysUtils,
    Winapi.ShellAPI;

var
    NIconD: TNotifyIconData;

begin
    try
        with NIconD do
        begin
            cbSize := SizeOf(TNotifyIconData); // [dcc32 Error] Project6.dpr(19): E2034 Too many actual parameters
        end;
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;
en

venice2 20. Okt 2021 08:57

AW: Zu viele Parameter bei SizeOf
 
Zitat:

Hast du TNotifyIconData unter Win32 irgendwo anders definiert?
Wohin springt er denn bei der Suche nach der Declaration für Win32?
Nein aber eine andere Delphi Version D2010.

Dort verwendet er mit With die System Unit und nicht die ShellAPI.
Habe eine neue Version von GdipClock64 hochgeladen mit den Änderungen und gleichzeitig die Anzeige des Datum verbessert.

Delphi-Quellcode:
program Project6;

{$APPTYPE CONSOLE}

uses
    SysUtils,
    ShellAPI;

var
    NIconD: TNotifyIconData;

begin
  try
    try
        with NIconD do
        begin
            cbSize := SizeOf(TNotifyIconData); //Kompiliert
        end;
    except
        on E: Exception do
            Writeln(E.ClassName, ' ', E.Message);
    end;
  finally
    Writeln('D2010 - ', 'No error');
  end;
end.
D2010 nicht gleich Delphi 10.4

HolgerX 20. Okt 2021 17:12

AW: Zu viele Parameter bei SizeOf
 
Hmm..

Zitat:

Zitat von venice2 (Beitrag 1496313)
Zitat:

Hast du TNotifyIconData unter Win32 irgendwo anders definiert?
Wohin springt er denn bei der Suche nach der Declaration für Win32?
Nein aber eine andere Delphi Version D2010.

Und da haben wir wohl den Grund (Delphi 2010)..
Denn dort gab es glaube ich noch keine Records mit Funktionen und deshalb auch kein SizeOf im Record...
Somit wurde SizeOf von System seitens des Compilers genommen.

venice2 20. Okt 2021 17:27

AW: Zu viele Parameter bei SizeOf
 
Zitat:

Zitat von HolgerX (Beitrag 1496353)
Hmm..

Zitat:

Zitat von venice2 (Beitrag 1496313)
Zitat:

Hast du TNotifyIconData unter Win32 irgendwo anders definiert?
Wohin springt er denn bei der Suche nach der Declaration für Win32?
Nein aber eine andere Delphi Version D2010.

Und da haben wir wohl den Grund (Delphi 2010)..
Denn dort gab es glaube ich noch keine Records mit Funktionen und deshalb auch kein SizeOf im Record...
Somit wurde SizeOf von System seitens des Compilers genommen.

Nun ja warum soll ich für 32 Bit "D11" nutzen wenn dadurch die EXE sich um 2MB vergrößert sehe da keinen Sinn drin.
Ja ich weiß wir haben Terrabyte zur Verfügung spielt aber keine rolle für mich.

Dann ist das wohl geklärt liegt an der jeweiligen Delphi Version.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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