Avatar billede angelod Novice
26. august 2003 - 20:06 Der er 3 kommentarer og
2 løsninger

Hvordan foretager man subclassing i Delphi?

Hvis jeg har hWND på dialoger/vinduer, samt de komponenter der er i vinduerne, hvordan kan jeg så "overtage" denne komponent? Altså bestemme hvordan den ser ud, og hvordan den reagerer på Windows beskeder.

Jeg ved det skal gøres via subclassing, men jeg kan ikke finde noget rent praktisk omkring dette emne, i hvert fald ikke når det kommer til at subclasse komponenter i et andet vindue.

Jeg ved det kræver aktiv brug af Windows API, og at det involverer SetWindowLong, men hvordan gør jeg? Der er 200 point for et svar der leder mig til mit egentlige mål.
Avatar billede tolderlund Nybegynder
29. august 2003 - 12:29 #1
Alt det med subclassing, SetWindowLong m.m. virker som lidt upræcist snik snak. Prøv at fortælle helt konkret hvad dit egentlige mål er, så kan det være vi har nemmere ved at hjælpe dig.
Avatar billede angelod Novice
29. august 2003 - 14:25 #2
Helt præcist, og ned i detaljer, så ønsker jeg at skrive en DLL til brug i mIRC, hvor jeg kan angive en dialog samt et ID til en kontrol i denne dialog, og så ændre den fra en af de standard klasser, til en ny.

Et eksempel på en som har gjort dette, kan findes her: http://www.dim-bulb.net/~dragonzap/dlls/

Systemet han har lavet hedder MDX, og det ligger nær bunden af den side. Kig evt på hans screenshots, for at se hvad jeg mener.
Avatar billede dkn Nybegynder
05. september 2003 - 12:41 #3
Linket virker ikke...


Dette kode er til subclassing af messages. Dvs du modtager beskeder før "owner" programmet.
Vær opmærksom på at det kun virker hvis program som styrer og programmet som bliver styret ligger inde for samme processtræ!

Men da du skriver at det er en dll til mirc går jeg ud fra at det kommer til at virke.



    OldWinProc, NewWinProc: Pointer;
    procedure NewWinProcedure(var Msg: TMessage);
  end;

var
  MainForm          : TMainForm;

implementation

{$R *.dfm}


{ TForm1 }

procedure TMainForm.NewWinProcedure(var Msg: TMessage);
begin
  // default processing first
  Msg.Result := CallWindowProc(OldWinProc, ClientHandle, Msg.Msg, Msg.wParam,
    Msg.lParam);

  if Msg.Msg = WM_LBUTTONDOWN then
  begin
    showmessage('Test');
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
  ClientHandle      : thandle;
begin
//  ClientHandle := findwindow(nil, 'Mirc ....');

  ClientHandle := handle;

  if ClientHandle = 0 then
  begin
    showmessage('Fandt ikke handle');
    exit;
  end;

  NewWinProc := MakeObjectInstance(NewWinProcedure);
  OldWinProc := Pointer(SetWindowLong(ClientHandle, gwl_WndProc, Cardinal
    (NewWinProc)));
end;




Der er stadig utrlog meget arbejde i det, men det er altså subclassing, se win32 hjælp under SetWindowLong for lidt mere info.
Ved heller ikke om det er beskederne du vil styre.
Avatar billede angelod Novice
05. september 2003 - 14:44 #4
Jeg fandt selv ud af noget af det, men glemte at lukke spørgsmålet, så du får lige halvdelen af pointene, hvis det er iorden? Ellers må du sige til, og så får du da resten. Gider ikke sure miner over simple point. ;)
Avatar billede dkn Nybegynder
05. september 2003 - 18:44 #5
Nej det er fint nok :)

Kan du ikke skrive lidt af det du fandt frem til, det er da lidt Interessant...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester