AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Zu viele Parameter bei SizeOf
Thema durchsuchen
Ansicht
Themen-Optionen

Zu viele Parameter bei SizeOf

Ein Thema von venice2 · begonnen am 19. Okt 2021 · letzter Beitrag vom 20. Okt 2021
Antwort Antwort
venice2
(Gast)

n/a Beiträge
 
#1

Zu viele Parameter bei SizeOf

  Alt 19. Okt 2021, 19:24
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
  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?
Die haben mir meine "ScaleFactor" Variable geklaut und unter Controls eingefügt. Frechheit ist das!

Geändert von venice2 (19. Okt 2021 um 20:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zu viele Parameter bei SizeOf

  Alt 19. Okt 2021, 21:08
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: Zu viele Parameter bei SizeOf

  Alt 19. Okt 2021, 21:11
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.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#4

AW: Zu viele Parameter bei SizeOf

  Alt 20. Okt 2021, 07:40
Hmm..

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!
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Zu viele Parameter bei SizeOf

  Alt 20. Okt 2021, 08:34
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.

Geändert von venice2 (20. Okt 2021 um 08:41 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Zu viele Parameter bei SizeOf

  Alt 20. Okt 2021, 08:46
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
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Zu viele Parameter bei SizeOf

  Alt 20. Okt 2021, 08:57
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

Geändert von venice2 (30. Okt 2021 um 18:03 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#8

AW: Zu viele Parameter bei SizeOf

  Alt 20. Okt 2021, 17:12
Hmm..

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.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Zu viele Parameter bei SizeOf

  Alt 20. Okt 2021, 17:27
Hmm..

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.
  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 06:51 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