AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi PDF-Dateien untereinander und synchron scrollen
Thema durchsuchen
Ansicht
Themen-Optionen

PDF-Dateien untereinander und synchron scrollen

Ein Thema von s-off · begonnen am 10. Jan 2007 · letzter Beitrag vom 11. Jan 2007
Antwort Antwort
s-off
(Gast)

n/a Beiträge
 
#1

PDF-Dateien untereinander und synchron scrollen

  Alt 10. Jan 2007, 11:02
Hallo zusammen,

stehe derzeit vor einem Problem, bei dem ich einfach nicht weiterkomme.

Ich möchte eigentlich nur ein klitzekleines Tool schreiben, welches die folgenden zwei Eigenschaften bieten soll:

1.
Zwei PDF-Files untereinander anzeigen

2.
Wird eines der beiden PDFs gescrollt, so soll das jeweils andere synchron mitgescrollt werden. Dabei soll es keine Rolle spielen, ob per Scrollbars oder Tastenkombination gescrollt oder das PDF mit diesem Handflächensymbol hin- und hergeschoben wird.

Das war es eigentlich schon.

Das Ganze stellt sich , bezogen auf Punkt 2, in der Umsetzung aber dann doch irgendwie nicht so einfach dar.

Das Anzeigen der PDFs untereinander ist kein Problem. Hier habe ich bisher mehrere Methoden getestet:

1.
Import des Adobe ActiveX Controls und platzieren zweier davon auf meiner Form

2.
Anzeigen der PDFs in zwei separaten WebBrowser-Komponenten

3.
Nutzung des FoxItReaderSDKs

Alle drei Methoden haben die gleiche Auswirkung und stellen kein Problem dar.

Das eigentliche Problem liegt darin, auf das Scrollen zu reagieren. Den Webbrowser zu scrollen bringt nichts, da damit das komplette ActiveX-Control in alle zwei Dimensionen verschoben wird, aber nicht dessen Inhalt

Hier habe ich mir schon diverse Finger abgebrochen:

Habe die WndProc-Prozedur des Controls überschrieben
Habe die WMxScroll-Prozedruren des Controls überschrieben

Nachdem alle WM_xxxxx und CN_xxxxx usw. nichts gebracht haben, dachte ich mir, dass ich mir in der WndProc einfach mal die Messages in einer Statusbar anzeigen lasse, die gerade gefeuert werden. Dabei kommt mir langsam der Verdacht, dass ich mit der WndProc gar nicht bis an das Control herankomme, sondern nur auf Messages der Webbrowser-Komponente reagieren kann - wenn man mal genauer nachdenkt, ist das auch irgendwie logisch

Stehe echt auf dem Schlauch und wäre über Lösungen bzw. Lösungsansätze wirklich sehr dankbar.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: PDF-Dateien untereinander und synchron scrollen

  Alt 10. Jan 2007, 12:19
Überprüfe doch mal mit z.B. dem WinSpector, wo die Messages so hingehen (und welche).

Ja und dann gibt es ja Subclassing oder Hooks.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#3

Re: PDF-Dateien untereinander und synchron scrollen

  Alt 10. Jan 2007, 13:39
Hallo,

vielen Dank erstmal für Deinen Tipp.

Dadurch wurde erstmal meine vermutung bestätigt, dann ich die Messages eines völlig falschen Controls behandel.
Die Struktur der Anwendung, und das Control, dessen Messages ich überprüft habe, habe ich mal als Screenshot angefügt, denn darauf basiert meine nächste Frage:

Wie komme ich nun an dieses Control heran (siehe markiertes Control auf Screenshot), so dass ich dieses auf Messages hin checken, bzw. auch welche dorthin schicken kann?

Es handelt sich übrigens um die Message WM_VSCROLL.

Ich glaube, wenn ich das mal kapiert habe, dann löschen sich viele Probleme, die ich in der Vergangenheit hatte und aktuell noch immer habe, wie von selbst
Miniaturansicht angehängter Grafiken
snap00293_102.png  
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: PDF-Dateien untereinander und synchron scrollen

  Alt 10. Jan 2007, 14:04
Erstmal die gute Nachricht: Das kriegt man zuverlässig hin.

Und jetzt zum Rest:
Definitv kriegt man das mit subclassing hin, indem man die WndProc Funktion des fremden Window-Handles umschreibt.
Oder man baut sich einen globalen Hook, der alle Windows-Messages mitliest.
Dazu kann man sich mal die Beiträge ansehen:
SubClassing
Subclassing2
globaler Hook
Hooks

Allerdings bist du ja in deinem eigenen Prozess, da müsste ein lokaler Hook ausreichen.
Wie auch immer. Wahrscheinlich sollte man mal Olli fragen, was am günstigsten ist, damit wir hier nicht gleich mit Kanonen auf kleine Piepser schießen.

In jedem Fall musst du erstmal das Window-Handle (also die $001510F0) herausbekommen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#5

Re: PDF-Dateien untereinander und synchron scrollen

  Alt 10. Jan 2007, 15:04
Hallo Sirius,

nochmals vielen vielen Dank.

Ich kann nun das PDF manuell bspw. nach unten scrollen, also Messages an das Control schicken, mit unten stehender Prozedur:

Delphi-Quellcode:
Procedure TForm1.ToolButton1Click(Sender: TObject);
var
   FormHandle: HWND;
   PanelHandle: HWND;
   AfxOleHandle: HWND;
   AfxFrameHandle: HWND;
   AfxMDIFrameHandle: HWND;
Begin
   FormHandle := FindWindow('TForm1', 'Form1');
   if FormHandle > 0 then
      PanelHandle := FindWindowEx(FormHandle, 0, 'TPanel', 'Panel1');
      if PanelHandle > 0 then
         AfxOleHandle := FindWindowEx(PanelHandle, 0, 'AfxOleControl42s', 0);
         if AfxOleHandle > 0 then
            AfxFrameHandle := FindWindowEx(AfxOleHandle, 0, 'AfxFrameOrView42s', 0);
            if AfxFrameHandle > 0 then
               AfxMDIFrameHandle := FindWindowEx(AfxFrameHandle, 0, 'AfxMDIFrame42s', 0);
               if AfxMDIFrameHandle > 0 then
                  AfxHandle := FindWindowEx(AfxMDIFrameHandle, 0, 'Afx:f30000:b:0:6:0', 0);
End;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
   if AfxHandle > 0 then
      SendMessage(AfxHandle, WM_VSCROLL, SB_LINEDOWN, 0)
   else showmessage('kein handle');
end;
Das funktioniert wirklich hervorragend

Was mir nur jetzt noch unklar ist, wie ich die WndProc-Prozedur genau dieses Controls überschreiben kann.
Bei einem normalen Control, welches ich auf meine Form packe, ist mir das klar; das mache ich so:

Delphi-Quellcode:
Type
   TMyPDF = Class(SDK_AXLib_TLB.TFoxitReaderSDK)
      Procedure WndProc(Var Msg1: TMessage); override;
   public
      sName: String;
   End;

[.......]

Procedure TMyPDF.WndProc(Var Msg1: TMessage);
Begin
   //do something
   Inherited WndProc(Msg1);
End;
Das funktioniert ebenfalls ;o)

Aber wie komme ich an das Control, das ja so tief unten in der Hierarchie liegt?
Also wie kann ich Messages von dem Control abfangen/-fragen?
Muss ich da auch erst nen Type für erstellen und falls 'ja' - wie?

Das ist die letzte Hürde - wirst Du, oder jemand anderes helfen, sie zu überwinden?

Bisher aber schonmal =>
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: PDF-Dateien untereinander und synchron scrollen

  Alt 10. Jan 2007, 15:17
Probier mal folgendes (keine Ahnung, ob es geht; ist aber erstmal die einfachste Variante)

du brauchst:
"SetWindowLong"
"GetWindowLong"
Schau dazu unter Hilfe-->Windows SDK

Oder schau mal hier unter der Überschrift Subclassing a window
MSDN
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#7

Re: PDF-Dateien untereinander und synchron scrollen

  Alt 11. Jan 2007, 10:43
Jippidoooooo,

es hat funktioniert

Dank Deiner Tipps bzgl. des MSDN und noch einigen nützlichen Codebeispielen von Flocke hier im Forum habe ich es nun endlich hinbekommen, das Control zu subclassen (sagt man das so?! ) und auf bestimmte Messages zu reagieren.

Für all diejenigen, die es interessiert, hier der Code, so wie er bei mir funktioniert:

Delphi-Quellcode:
interface

[...]

Type
   TForm1 = Class(TForm)
   private
      FAfxHandle: HWND;
      Procedure SetAfxHandle;
   public
      Property AfxHandle: HWND read FAfxHandle write FAfxHandle;
   End;

Function PDFWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

Var
   Form1: TForm1;
   pOrigPDFWndProc: FarProc;

Implementation

[...]

Procedure TForm1.FormShow(Sender: TObject);
Begin
   SetAfxHandle;
End;

//zum eigentlichen Control durchhangeln und das Handle setzen
Procedure TForm1.SetAfxHandle;
Var
   FormHandle: HWND;
   PanelHandle: HWND;
   AfxOleHandle: HWND;
   AfxFrameHandle: HWND;
   AfxMDIFrameHandle: HWND;
Begin
   FAfxHandle := 0;
   FormHandle := FindWindow('TForm1', 'Form1');
   If FormHandle > 0 Then
      PanelHandle := FindWindowEx(FormHandle, 0, 'TPanel', 'Panel1')
   Else Exit;
   If PanelHandle > 0 Then
      AfxOleHandle := FindWindowEx(PanelHandle, 0, 'AfxOleControl42s', Nil)
   Else Exit;
   If AfxOleHandle > 0 Then
      AfxFrameHandle := FindWindowEx(AfxOleHandle, 0, 'AfxFrameOrView42s', Nil)
   Else Exit;
   If AfxFrameHandle > 0 Then
      AfxMDIFrameHandle := FindWindowEx(AfxFrameHandle, 0, 'AfxMDIFrame42s', Nil)
   Else Exit;
   If AfxMDIFrameHandle > 0 Then
      FAfxHandle := FindWindowEx(AfxMDIFrameHandle, 0, 'Afx:f30000:b:0:6:0', Nil);

   If FAfxHandle > 0 Then Begin
      //Original WndProc des Controls holen
      pOrigPDFWndProc := Pointer(GetWindowLong(FAfxHandle, GWL_WNDPROC));

      //WndProc dieses Controls überschreiben
      setWindowLong(FAfxHandle, GWL_WNDPROC, LongInt(@PDFWndProc));
   End;
End;

Function PDFWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
Begin
   //Messages abfangen und ggf. ersetzen
   Case uMsg Of
      WM_VSCROLL: Begin
            ShowMessage('Scroll');
            Result := CallWindowProc(pOrigPDFWndProc, hWnd, uMsg, wParam, lParam);
         End Else
      //Original WndProc aufrufen
      Result := CallWindowProc(pOrigPDFWndProc, hWnd, uMsg, wParam, lParam);
   End;
End;

[...]
Nochmals vielen Dank für die Unterstützung
  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 01:14 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