IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Conversion de cette unité de callback depuis FreePascal/Lazarus vers Delphi


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 080
    Par défaut Conversion de cette unité de callback depuis FreePascal/Lazarus vers Delphi
    Bonjour,

    Je cherche a convertir cette unité FreePascal vers Delphi, pensez-vous que cela soit faisable ou bien c'est peine perdue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    unit uWindowSubclass;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Windows, LCLIntf;
     
    function SubclassWindow(const Window: THandle; const NewProc: TWndMethod): WNDPROC;
    function UnsubclassWindow(const Window: THandle; const Oldproc: WNDPROC): TWndMethod;
     
    implementation
     
    type
      PCallbackInfo = ^TCallbackInfo;
     
      TCallbackInfo = record
        Proc: TWndMethod;
        Previous: WNDPROC;
      end;
     
     
    var
      CallbackInfo: ATOM;
     
    procedure CallbackSubclass(Ahwnd: HWND; uMsg: UINT; wParam: WParam;
      lParam: LParam); stdcall;
    var
      Msg: TMessage;
      Method: PCallbackInfo;
    begin
      FillChar(Msg{%H-}, SizeOf(Msg), #0);
     
      Msg.msg := uMsg;
      Msg.wParam := wParam;
      Msg.lParam := lParam;
     
      Method := LCLIntf.GetProp(Ahwnd, PChar(CallbackInfo));
     
      if Assigned(Method) then
        Method^.Proc(Msg);
     
      if Msg.Result = 0 then
        Msg.Result := LCLIntf.CallWindowProc(Method^.Previous, Ahwnd, uMsg, wparam, lparam);
    end;
     
    function SubclassWindow(const Window: THandle; const NewProc: TWndMethod): WNDPROC;
    var
      method: PCallbackInfo;
    begin
      new(method);
      method^.Proc := NewProc;
      LCLIntf.SetProp(Window, PChar(CallbackInfo), method);
      method^.Previous := WNDPROC(LCLIntf.SetWindowLong(Window, GWL_WNDPROC,
        LONG_PTR(@CallbackSubclass)));
      Result := method^.Previous;
    end;
     
    function UnsubclassWindow(const Window: THandle; const Oldproc: WNDPROC): TWndMethod;
    var
      method: PCallbackInfo;
    begin
      method := LCLIntf.GetProp(Window, PChar(CallbackInfo));
      if Assigned(method) then
      begin
        LCLIntf.RemoveProp(Window, PChar(CallbackInfo));
        LCLIntf.SetWindowLong(Window, GWL_WNDPROC, LONG_PTR(method^.Previous));
        Result := method^.Proc;
        Dispose(method);
      end;
    end;
     
    initialization
      CallbackInfo := Windows.GlobalAddAtom('CallbackMethodInfo');
     
    finalization
      Windows.GlobalDeleteAtom(CallbackInfo);
     
    end.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    LCLIntf semble la clé à remplacer par la VCL, as-tu tout simplement retiré ce uses ?

    GetProp et CallWindowProc c'est du WinAPI donc Windows.pas
    RemoveProp, SetWindowLong ...

    LCLIntf semble masquer celle de Windows.pas, son but c'est justement l'inverse, prendre un code Delphi et le porter en LCL ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. De l'aide pour améliorer cette unité très courte
    Par Bruno13 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 30/06/2008, 21h22
  2. Appel d'une callback depuis un autre module
    Par Bayard dans le forum Général Python
    Réponses: 6
    Dernier message: 08/06/2008, 17h47
  3. Problème récupération de données d'un callback depuis un event_box
    Par swissguitararmy dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 09/12/2007, 20h10
  4. callback depuis C
    Par ittoda dans le forum Caml
    Réponses: 1
    Dernier message: 09/09/2007, 13h00
  5. [FreePascal] Lancer explorer depuis FreePascal
    Par franck.thibault dans le forum Free Pascal
    Réponses: 3
    Dernier message: 14/01/2007, 09h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo