Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Beitrag von br_klaus »

Hallo,

beim Kompilieren von Graphics32-1-8-3

stoße ich auch ein scheinbar unüberwindliches Problem:

Es sind da folgende Definitionen:

Code: Alles auswählen

type
  TWndMethod = procedure(var msg : TMessage) of object;
 
function AllocateHWnd(Method: TWndMethod): HWND;
 
 
type
  TThemeNexus = class
  private
    FWindowHandle: HWND;
  protected
    procedure WndProc(var Message: TMessage);
    procedure OpenVisualStyles;
    procedure CloseVisualStyles;
  public
    constructor Create;
    destructor Destroy; override;
  end;
 
constructor TThemeNexus.Create;
// var wdm: TWndMethod;
begin
//  wdm := @WndProc;
  FWindowHandle := {$IFDEF COMPILER6}Classes.{$ENDIF}AllocateHWnd(@WndProc);
  OpenVisualStyles;
end;
Sowohl bei AllocateHnd(@WndProc) - im (Delphi-)Original hieß es nur AllocateWWnd(WndProc), aber FPC braucht die Adressangabe - als auch schon bei meinem Versuch mit der Variablen wdm := @WndProc
kommt die Compilermeldung: Error: Variable identifier expected;

Wenn ich einen Zeiger auf die @WndProc benützen will, um dann mit MemCopy zu Kopieren, dann geht das nicht, weil ich dann @@ bräuchte, und da gibt es auch Probleme.

Ich habe es mit allen möglichen Casting-Versuchen probiert, komme aber auf keinen grünen ZWeig.
Was jemand da eine Hilfe?

(Ich benütze die stabile Version Laz 9.30 - FPC 6.0)

Herzlichen Dank!
P. Nikolaus

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Beitrag von theo »

br_klaus hat geschrieben: Ich benütze die stabile Version Laz 9.30 - FPC 6.0
Ich habe immer geahnt, dass Gottes Personal gewisse Vorteile genießt. Könntest du uns bitte aus der Zukunft die Feature-Matrix von FPC 6.0 schicken?
Wir sterblichen Sünder sind immer noch bei 2.x. :wink:

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Beitrag von br_klaus »

theo hat geschrieben:
br_klaus hat geschrieben: Ich benütze die stabile Version Laz 9.30 - FPC 6.0
Ich habe immer geahnt, dass Gottes Personal gewisse Vorteile genießt. Könntest du uns bitte aus der Zukunft die Feature-Matrix von FPC 6.0 schicken?
Wir sterblichen Sünder sind immer noch bei 2.x. :wink:
Bin ich leider auch noch. Es muß natürlich heißen 2.6.0.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Beitrag von Socke »

Unabhängig deines Fehlers wird dein Quelltext nicht funktionieren:

Code: Alles auswählen

// Unit Classes; Datei source/rtl/win32/classes.pp
function AllocateHWnd(Method: TWndMethod): HWND;
  begin
    { dummy }
    runerror(217);
    Result:=0;
  end;
 
 
procedure DeallocateHWnd(Wnd: HWND);
  begin
    { dummy }
    runerror(217);
  end;
vgl. auch http://mailer.lazarus.freepascal.org/in ... opic=184.0

P.S.:
Ich kann diesen Code problemlos kompilieren; der Runtime-Error 217 bleibt trotzdem:

Code: Alles auswählen

procedure TForm1.WndProc(var TheMessage: TLMessage);
begin
  inherited WndProc(TheMessage);
end;
 
constructor TForm1.Create(TheOwner: TComponent);
begin
  AllocateHWnd(@self.WndProc);
  inherited Create(TheOwner);
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Beitrag von br_klaus »

Danke für die Antwort.

Aber ich weiß icht, was das mit meinem Problem zu tun hat.
Ich habe keinerlei TForm1 (sondern TThemeNexus, wo beim Compilieren von .create und .destroy derselbe CompilierFehler auftaucht: Variable expected.
Daß dann im Endeffekt Runerror 217 kommt, ist mir auch klar (und ich verstehe auch nicht, wozu diese Prozeduren gut sein sollen...). Aber sie stehen nun einmal so im Code einer der Komponenten von Graphics32. Vielleicht wird der Runerror irgendwie aufgefangen und umgeleitet?

Aber mir geht es ja nicht um die WndProc, sondern darum, warum diese Zuweisungen nicht funktionieren.
Kann es sein, daß das an bestimmten Compiler-Direktiven liegt?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Prbleme beim Zuweisen/Casting einer Prozedurvariablen

Beitrag von Socke »

br_klaus hat geschrieben:Daß dann im Endeffekt Runerror 217 kommt, ist mir auch klar (und ich verstehe auch nicht, wozu diese Prozeduren gut sein sollen...). Aber sie stehen nun einmal so im Code einer der Komponenten von Graphics32. Vielleicht wird der Runerror irgendwie aufgefangen und umgeleitet?
Bist du schon einmal auf die Idee gekommen, dass diese Funktionen in Delphi ganz anders implementiert sind und keinen RunError 217 auslösen?
br_klaus hat geschrieben:Aber ich weiß icht, was das mit meinem Problem zu tun hat.
Ich habe deine Funktionsaufrufe nachgestellt; wo AllocateHWnd() aufgerufen wird, ist doch egal. Nichtsdestotrotz habe ich aus deinem Code ein vollständiges Minimalbeispiel erstellt. Bei mir (FPC 2.6.0) lässt sich das übrigens problemlos übersetzen

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses Classes, windows;
 
type
 
  { TThemeNexus }
 
  TThemeNexus = class
  private
    FWindowHandle: HWND;
  protected
    procedure WndProc(var Message: TMessage);
  public
    constructor Create;
    destructor Destroy; override;
  end;
 
implementation
 
procedure TThemeNexus.WndProc(var Message: TMessage);
begin
  // nicht implementiert
end;
 
constructor TThemeNexus.Create;
begin
  FWindowHandle := AllocateHWnd(@WndProc);
end;
 
destructor TThemeNexus.Destroy;
begin
  DeallocateHWnd(FWindowHandle);
  inherited Destroy;
end;
 
var
  o: TThemeNexus = nil;
initialization
  o := TThemeNexus.Create;
finalization
  o.Free;
end.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten