AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Interessantes Problem mit Scroll und Sendmessage
Thema durchsuchen
Ansicht
Themen-Optionen

Interessantes Problem mit Scroll und Sendmessage

Ein Thema von Shark99 · begonnen am 20. Apr 2010 · letzter Beitrag vom 24. Apr 2010
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

Interessantes Problem mit Scroll und Sendmessage

  Alt 20. Apr 2010, 23:19
Es ist eine Form mit 2 Memo Komponenten, beide haben etwa 50 Zeilen Text im Design time.

Hier erstmals der Code.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  protected
    procedure WndProc(var Msg: TMessage); virtual;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  _OldProc: TWndMethod;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  _OldProc := Memo1.WindowProc;
  Memo1.WindowProc := WndProc;
end;

procedure TForm1.WndProc(var msg: TMessage);
begin
  case msg.Msg of
    WM_VSCROLL: SendMessage(Memo2.Handle, WM_VSCROLL,
        TWMVScroll(msg).ScrollCode, TWMVScroll(msg).Pos);
    WM_MOUSEWHEEL:
    begin SendMessage(Memo2.Handle, WM_VSCROLL,
        TWMVScroll(msg).ScrollCode, TWMVScroll(msg).Pos);
         caption := timetostr(now);
    end;
  end;
  _OldProc(msg);
end;

end.
Wenn man mit dem Mausrad im Memo1 Scrollt wird auch Memo2 gescrollt.

Alles funktioniert auf meinem PC, Delphi 5 + Windows 7 x64.

Ich schickte die Exe zu einem Freund (Windows 7 32 bit) und dort funktioniert es nicht und zwar das zweite Memo scrollt immer nach oben, d.h. egal ob ich nach oben oder unten links mit dem Mausrad scrolle, das rechte Memo bewegt sich immer nur nach oben!

Ich machte zwei weitere Tests unter VMWare mit WindowsXP 32bit und Windows7 64bit und in beiden VMs funktioniert es nicht richtig, d.h. das rechte Memo scrollt wieder nur nach oben!

Nach etwas mehr Untersuchung stelle ich fest dass auf meinem PC beim Scrollen mit dem Mausrad im Memo WM_VSCROLL ausgelöst wird, auf dem PC des Freundes und in beiden VMs wird hingegen beim Scrollen mit dem Mausrad WM_MOUSEWHEEL ausgelöst und da geht dann was bei der Übertragung zum zweiten Memo schief.

Hoffe jemand hat eine Vermutung was hier los ist!
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Interessantes Problem mit Scroll und Sendmessage

  Alt 23. Apr 2010, 10:40
Du erhältst in msg einen TWMMouseWheel-Record und castest diesen zu einem TWMVScroll-Record.
Die von dir erzeugte Nachricht WM_VSCROLL erhält dadurch unsinnige Parameter.

Delphi-Quellcode:
TWMMouseWheel = packed record
  Msg: Cardinal;
  Keys: SmallInt;
  WheelDelta: SmallInt;
  case Integer of
    0: (XPos: Smallint;
        YPos: Smallint;);
    1: (Pos: TSmallPoint;
        Result: Longint;);
end;

TWMScroll = packed record
  Msg: Cardinal;
  ScrollCode: Smallint;
  Pos: Smallint;
  ScrollBar: HWND;
  Result: Longint;
end;

TWMVScroll = TWMScroll;
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#3

Re: Interessantes Problem mit Scroll und Sendmessage

  Alt 23. Apr 2010, 23:11
Danke!
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

Re: Interessantes Problem mit Scroll und Sendmessage

  Alt 24. Apr 2010, 05:39
HI,

ich finde, dass das TWMMouseWheel einen logischen Fehler enthält. Wenn man sich die Struktur einer Nachricht anschaut, sieht man, dass diese immer einen Rückgabewert hat. Außerdem ich der 2. Zweig dann 1,5 mal so groß wie der erste. Meiner Meinung nach müsste es so aussehen: (Weil Pos enthällt ja XPos und YPos).

Delphi-Quellcode:
TWMMouseWheel = packed record
  Msg: Cardinal;
  Keys: SmallInt;
  WheelDelta: SmallInt;

  case Integer of
    0: (XPos: Smallint;
        YPos: Smallint;);
    1: (Pos: TSmallPoint;)

  Result: Longint;
end;
Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Interessantes Problem mit Scroll und Sendmessage

  Alt 24. Apr 2010, 10:42
Hallo Bernhard,

die Sprachdefinition lässt es nicht zu, in einem varianten Record weitere Felder nach dem varianten Teil zu definieren. Aus diesem Grund packt man diese Felder üblicherweise in einen Zweig. Voraussetzung ist natürlich, dass die Teile vor den gemeinsamen Feldern in allen Zweigen eine identische Gesamtgröße besitzen, was aber hier der Fall ist:

Code:
SizeOf(Pos) = SizeOf(XPos) + SizeOf(YPos)
Es ist unerheblich, ob die einzelnen Zweige unterschiedliche Gesamtgrößen besitzen. Sie liegen quasi parallel im Speicher:

Code:
Offset 0:     Msg
Offset 4:     Keys
Offset 6:  WheelDelta
Offset 8: XPos | Pos.x
Offset 10: YPos | Pos.y
Offset 12:      | Result
Gruß Hawkeye
  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 08:01 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