AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

virtuelle funktion

Ein Thema von JnZn558 · begonnen am 1. Apr 2010 · letzter Beitrag vom 3. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#1

virtuelle funktion

  Alt 1. Apr 2010, 14:21
Delphi-Quellcode:
function WndProc(hWindow: HWND; dwMsg: ZDWORD; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  var
    wnd: PWindowBase;
    msg : TMSG;
  begin
    if dwMsg = WM_NCCREATE then
    begin
      wnd := PWindowBase(PCreateStruct(nlParam)^.lpCreateParams);
      SetWindowLongPtr(hWindow, GWL_USERDATA, Integer(wnd));
    end;
    wnd:= PWindowBase(GetWindowLongPtr(hWindow, GWL_USERDATA));

    if Assigned(wnd) then
    begin
      ZeroMemory(@msg, SizeOf(msg));
      msg.hwnd := hWindow;
      msg.message := dwMsg;
      msg.wParam := wParam;
      msg.lParam := lParam;
      wnd^.EventHandler(msg); // in WindowBase is diese funktion virtuell (hier crash es
      Exit;
    end;
    Result := DefWindowProc(hWindow, dwMsg, nwParam, nlParam);
  end;

  WindowBase = class
     ..
  public
     function EventHandler(msg: TMsg): Boolean; virtual;
  end;
dabei crash es bei aufruf von Eventhandler wegen virtual, aber eventhandler is fuer override in abgeleitete klassen vorgesehen. daher virtuel wie kann ich dies denn eure meinung nach am besten loesen?
vielen dank fuer hilfen
Peace on the world
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: virtuelle funktion

  Alt 1. Apr 2010, 14:45
Warum speicherst du einen Pointer auf das Objekt (PWindowBase)? Das Objekt ist bereits ein Pointer. Außerdem solltest du dich an die Konvention halten, Klassennamen mit einem T zu beginnen.
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#3

Re: virtuelle funktion

  Alt 1. Apr 2010, 17:59
Zitat von NamenLozer:
Warum speicherst du einen Pointer auf das Objekt (PWindowBase)? Das Objekt ist bereits ein Pointer. Außerdem solltest du dich an die Konvention halten, Klassennamen mit einem T zu beginnen.
Wie Bitte. Versteh dich nicht, PWindowBase ist ein Pointer von WindowBase

PWindowBase = ^WindowBase

ich weiss das mit T. nun eine Loesung fuer den Crash?
Peace on the world
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#4

Re: virtuelle funktion

  Alt 1. Apr 2010, 18:15
Du rufst die Methode von WindowBase auf, welche eben noch nicht implementiert wurde. Die Instanz, mit der du arbeitest, muss explizit über WindowBaseChild.Create erzeugt werden.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: virtuelle funktion

  Alt 1. Apr 2010, 19:49
Selbst dann wird es noch crashen, aufgrund des Doppelpointers. Dein Pointer, den du speicherst, zeigt nämlich auf die Adresse der lokalen Variable wnd, nicht auf das dahinterliegende Objekt. Da die Variable wnd im nächsten Durchlauf undefiniert ist, wird auf die falsche Adresse zugegriffen, die zufällig an dieser Stelle gespeichert ist.

Das Objekt selbst ist, wie ich schon sagte, bereits ein Pointer - Also caste das Objekt einfach nach Integer und alles wird gut.
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#6

Re: virtuelle funktion

  Alt 1. Apr 2010, 23:54
erstmal danke fuers antworten, aber so sei eure Antworten sehr trocken, ein bisschen korrektur code waere viel besser verstaendlicher.
Peace on the world
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: virtuelle funktion

  Alt 2. Apr 2010, 00:01
Gut, eine Zeile Code sagt manchmal mehr als tausend Worte:
Delphi-Quellcode:
function WndProc(hWindow: HWND; dwMsg: ZDWORD; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  var
    wnd: TWindowBase; // Geändert
    msg : TMSG;
  begin
    if dwMsg = WM_NCCREATE then
    begin
      wnd := TWindowBase.Create(PCreateStruct(nlParam)^.lpCreateParams); // Geändert
      // (ich habe jetzt einfach mal geraten, dass hier der Konstruktor hin sollte)
      SetWindowLongPtr(hWindow, GWL_USERDATA, Integer(wnd));
    end;
    wnd := TWindowBase(GetWindowLongPtr(hWindow, GWL_USERDATA)); // Geändert

    if Assigned(wnd) then
    begin
      ZeroMemory(@msg, SizeOf(msg));
      msg.hwnd := hWindow;
      msg.message := dwMsg;
      msg.wParam := wParam;
      msg.lParam := lParam;
      wnd.EventHandler(msg); // Geändert
      Exit;
    end;
    Result := DefWindowProc(hWindow, dwMsg, nwParam, nlParam);
  end;

  TWindowBase = class // Umbenannt
     ..
  public
     function EventHandler(msg: TMsg): Boolean; virtual;
  end;
Hoffe, ich hab nichts übersehen.
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#8

Re: virtuelle funktion

  Alt 2. Apr 2010, 18:41
Zitat von NamenLozer:
Gut, eine Zeile Code sagt manchmal mehr als tausend Worte:
Delphi-Quellcode:
function WndProc(hWindow: HWND; dwMsg: ZDWORD; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  var
    wnd: TWindowBase; // Geändert
    msg : TMSG;
  begin
    if dwMsg = WM_NCCREATE then
    begin
      wnd := TWindowBase.Create(PCreateStruct(nlParam)^.lpCreateParams); // Geändert
      // (ich habe jetzt einfach mal geraten, dass hier der Konstruktor hin sollte)
      SetWindowLongPtr(hWindow, GWL_USERDATA, Integer(wnd));
    end;
    wnd := TWindowBase(GetWindowLongPtr(hWindow, GWL_USERDATA)); // Geändert

    if Assigned(wnd) then
    begin
      ZeroMemory(@msg, SizeOf(msg));
      msg.hwnd := hWindow;
      msg.message := dwMsg;
      msg.wParam := wParam;
      msg.lParam := lParam;
      wnd.EventHandler(msg); // Geändert
      Exit;
    end;
    Result := DefWindowProc(hWindow, dwMsg, nwParam, nlParam);
  end;

  TWindowBase = class // Umbenannt
     ..
  public
     function EventHandler(msg: TMsg): Boolean; virtual;
  end;
Hoffe, ich hab nichts übersehen.

danke sehr, dies sieht sehr uebersichtlich aus, very n1. werde es sofort testen
Peace on the world
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#9

Re: virtuelle funktion

  Alt 2. Apr 2010, 23:44
Delphi-Quellcode:
function ZWndProc(hWnd: HWND; dwMsg: ZDWORD; wParam: WPARAM; lParam: LPARAM): LRESULT;
  var
    pWnd : PZWindowBase;
    pCS : PCreateStruct;
    nUserData : ZINT;
  begin
    if dwMsg = WM_NCCREATE then
    begin
      pCS := PCreateStruct(lParam);
      nUserData := ZINT(pCS.lpCreateParams);
      SetWindowLongPtr(hWnd, GWL_USERDATA, nUserData );
    end;

    nUserData := GetWindowLongPtr(hWnd, GWL_USERDATA);
    //pWnd := PZWindowBase(nUserData); // wieso funktionier das hier nicht richtig? fenster geschlossen, app nicht beendet
    pWnd := PZWindowBase(@nNewData); // wieso funktioniert das? fenster geschlossen und app beendet

    if Assigned(pWnd) then
      Result := pWnd^.WndProc(hWnd, dwMsg, wParam, lParam)
    else
      Result := DefWindowProc(hWnd, dwMsg, wParam, lParam);
end;
bin ein bisschen verwirrt, kann mir das jemand erklaeren? versteh momentan die logik nicht
Peace on the world
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

Re: virtuelle funktion

  Alt 3. Apr 2010, 00:39
Wieso machst du schon wieder mit Zeigern rum? Noch mal: ein Objekt ist bereits ein Zeiger. Ich habe dir doch schon gezeigt, wie du es machen musst.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:30 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