| Autor |
Beitrag |
galagher
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 21.09.07 18:47
Hallo zusammen!
Wie kann ich den Klick auf den Hilfebutton bei Dialogen abfangen? Ich habe zB. einen OpenDialog und möchte beim Klicken auf den Hilfebutton eine eigene Hilfedatei öffnen, nicht die Windows-Hilfe. Ein OnHelp-Ereignis gibt's ja nicht, also wie kann man sowas machen? Moderiert von Narses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Fr 21.09.2007 um 23:41
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 21.09.07 20:53
Du musst dazu die WndProc des OpenDialogs abfangen und IIRC die Nachricht WM_SYSCOMMAND selber behandeln.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
galagher 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 21.09.07 21:51
BenBE hat folgendes geschrieben: | | Du musst dazu die WndProc des OpenDialogs abfangen und IIRC die Nachricht WM_SYSCOMMAND selber behandeln. |
Ja, aber wo und wie? Ich habe einfach eine neue Komponente TOpenFileDialog (und dasselbe für Save und OpenPicture usw.) erstellt und auch gleich registriert, die kann das jetzt. Ich habe mir dabei halt eine andere Kompo angesehen, wie so etwas dort aussieht.
War recht einfach, weil das die einzige Änderung war. Hat vor allem den Vorteil, dass die das dann schon kann und ich es nicht immer wieder schreiben muss!
Trotzdem danke!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 22.09.07 19:56
Es ist doch noch eine Frage aufgetaucht:
Für die diversen Dialog-Klassen habe ich im Grund immer den selben Code:
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:
| type TOpenDlg = class(TOpenDialog)
private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; procedure WndProc(var message: Tmessage); override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TSaveDlg = class(TSaveDialog)
private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; procedure WndProc(var message: Tmessage); override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
procedure Register;
implementation
procedure TOpenDlg.WndProc(var message: Tmessage); begin message.Result := 0; if (message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (message.Msg = WM_NOTIFY) then case (POFNotify(message.LParam)^.hdr.code) of CDN_HELP: DoHelp; end;
inherited WndProc(message); end;
procedure TOpenDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
procedure TSaveDlg.WndProc(var message: Tmessage); begin message.Result := 0; if (message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (message.Msg = WM_NOTIFY) then case (POFNotify(message.LParam)^.hdr.code) of CDN_HELP: DoHelp; end;
inherited WndProc(message); end;
procedure TSaveDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
|
Sie benötigen alle den gleichen Code, kann man das nicht auch einfacher machen? Ich meine, eine Prozedur WndProc und eine Prozedur DoHelp für alle. Hab' schon versucht, diese Prozeduren "allgemeiner" zu schreiben, aber alles führte zu Fehlern. Das ist für 8 Dialoge immer der selbe Quellcode! Geht das nicht auch einfacher?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 22.09.07 20:37
Leider nicht, da deine verschiedenen Dialoge immer auch verschiedene Vorfahren haben und daher zueinander inkompatibel sind.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
galagher 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 22.09.07 21:14
Danke, kann man nichts machen! Funktioniert jedenfalls bestens!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 23.09.07 22:56
Hallo!
Der Code funktioniert nur bei Open- und Save-Dialogen, bei Font-, Color- und Print-Dialogen nicht, wenn ich davon Klassen ableite. Es kompiliert zwar fehlerfrei, und es gibt auch ein OnHelp im OI, aber offenbar wird keine entsprechende Nachricht gesendet.
Wie muss der Code denn aussehen, damit es funktioniert?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 28.09.07 11:23
Hallo!
Habe die Lösung gefunden: MessageHook!
Delphi-Quelltext 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:
| type
TFontDlg = class(TFontDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; function MessageHook(var Msg: TMessage): Boolean; override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
function TFontDlg.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) then begin DoHelp; Result := True; end; end;
procedure TFontDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end; |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 18.12.07 19:45
Hallo!
Ich poste hier mal die komplette Unit für abgeleitete Dialoge. Soweit ich das getestet habe, funktionieren alle Dialoge und auch das Ereignis OnHelp. Nur bei FindDlg und ReplaceDlg, da funktioniert zwar das Ereignis OnHelp, aber sonst nichts!
Hat was mit MessageHook zu tun, denn wenn ich MessageHook komplett rausnehme, funktioniert der Dialog plötzlich wieder, nur eben das OnHelp nicht! Wie gesagt, das ist auch bei ReplaceDlg so.
Was also tun? Alle Button-Klicks von FindDlg und ReplaceDlg laufen über MessageHook, wie bekomme ich das hin?
Hier also die Unit, sollte alles einwandfrei laufen, eben bis auf FindDlg und ReplaceDlg!
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: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327:
| unit Dlg;
interface
uses Windows, Forms, Messages, Classes, ExtDlgs, Dialogs, CommDlg;
var HelpMsg: Cardinal;
type TOpenDlg = class(TOpenDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; procedure WndProc(var message: Tmessage); override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TSaveDlg = class(TSaveDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; procedure WndProc(var message: Tmessage); override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TOpenPictureDlg = class(TOpenPictureDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; procedure WndProc(var message: Tmessage); override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TSavePictureDlg = class(TSavePictureDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; procedure WndProc(var message: Tmessage); override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TFontDlg = class(TFontDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; function MessageHook(var Msg: TMessage): Boolean; override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TColorDlg = class(TColorDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; function MessageHook(var Msg: TMessage): Boolean; override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TPrntDlg = class(TPrintDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; function MessageHook(var Msg: TMessage): Boolean; override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TFindDlg = class(TFindDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; function MessageHook(var Msg: TMessage): Boolean; override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
TReplaceDlg = class(TReplaceDialog) private FOnHelp: TNotifyEvent; protected procedure DoHelp; dynamic; function MessageHook(var Msg: TMessage): Boolean; override; published property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end;
procedure Register;
implementation
procedure TOpenDlg.WndProc(var message: Tmessage); begin message.Result := 0; if (message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (message.Msg = WM_NOTIFY) then case (POFNotify(message.LParam)^.hdr.code) of CDN_HELP: DoHelp; end;
inherited WndProc(message); end;
procedure TOpenDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
procedure TSaveDlg.WndProc(var message: Tmessage); begin message.Result := 0; if (message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (message.Msg = WM_NOTIFY) then case (POFNotify(message.LParam)^.hdr.code) of CDN_HELP: DoHelp; end;
inherited WndProc(message); end;
procedure TSaveDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
procedure TOpenPictureDlg.WndProc(var message: Tmessage); begin message.Result := 0; if (message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (message.Msg = WM_NOTIFY) then case (POFNotify(message.LParam)^.hdr.code) of CDN_HELP: DoHelp; end;
inherited WndProc(message); end;
procedure TOpenPictureDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
procedure TSavePictureDlg.WndProc(var message: Tmessage); begin message.Result := 0; if (message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (message.Msg = WM_NOTIFY) then case (POFNotify(message.LParam)^.hdr.code) of CDN_HELP: DoHelp; end;
inherited WndProc(message); end;
procedure TSavePictureDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
function TFontDlg.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) then begin DoHelp; Result := True; end; end;
procedure TFontDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
function TColorDlg.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) then begin DoHelp; Result := True; end; end;
procedure TColorDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
function TPrntDlg.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) then begin DoHelp; Result := True; end; end;
procedure TPrntDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
function TFindDlg.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) then begin DoHelp; Result := True; end; end;
procedure TFindDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
function TReplaceDlg.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) then begin DoHelp; Result := True; end; end;
procedure TReplaceDlg.DoHelp; begin if Assigned(FOnHelp) then FOnHelp(Self); end;
procedure InitGlobals; begin HelpMsg := RegisterWindowMessage(HelpMsgString); end;
procedure Register; begin RegisterComponents('Dlg', [TOpenDlg, TSaveDlg, TOpenPictureDlg, TSavePictureDlg, TFontDlg, TColorDlg, TPrntDlg, TFindDlg, TReplaceDlg]); end;
initialization InitGlobals;
end. |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|