Autor |
Beitrag |
Pferdenarr
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 25.01.12 15:29
Hi,
ich möchte allen Komponenten (TButton, TLabel, TTabSheet, ...) bei denen die Tag Eigenschaft <> 0 ist ein Maus Rechtsklick Event zuweisen.
Mein Ansatz wäre bis jetzt der folgende:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.FormCreate(Sender: TObject); var i,j : Integer; begin with Application do for i := 0 to ComponentCount -1 do begin for j := 0 to Components[i].ComponentCount -1 do begin if Components[i].Components[j].tag <> 0 then end; end; end;
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end; |
Wie kann ich das bewerkstelligen ?
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 25.01.12 15:35
na, in dem du das onMouseDownEvent anhängst ?
Delphi-Quelltext 1: 2:
| if Components[i].Components[j].tag <> 0 then Components[i].Components[j].onMouseDown := DeinEvent; |
zuma
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Pferdenarr 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 25.01.12 15:40
'TComponent' enthält kein Element namens 'onMouseDown'
[DCC Fehler] Unit1.pas(56): E2003 Undeklarierter Bezeichner: 'onMouseDown'
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 25.01.12 16:02
Wenn du einmal nachgeschaut hättest wo OnMouseDown denn deklariert ist, hättest du gesehen, dass es AFAIK in TControl deklariert ist. Du musst also schauen, ob du ein TControl vor dir hast (xy is TControl) und es im Erfolgsfall auf TControl casten (TControl(xy).OnMouseDown := ...).
Nebenbei kannst du auch ControlCount und Controls benutzen, dann kannst du dir das alles sparen inkl. der verschachtelten Schleife.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 25.01.12 16:13
Eventuell sind noch nicht alle Komponenten erzeugt worden wenn das FormCreate-Ereignis aufgerufen wird. Ich würde den Code in Loaded ausführen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TForm1 = class(TForm) ... public procedure Loaded; override; end;
...
procedure TForm1.Loaded; begin inherited Loaded;
end; |
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 25.01.12 16:40
Loaded wird vor OnCreate ausgeführt.
Das würde auch anders keinen Sinn machen, da Loaded ausgeführt wird, wenn alle Komponenten geladen sind und OnCreate, wenn das Formular fertig erzeugt und initialisiert ist.
|
|
Pferdenarr 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 25.01.12 16:45
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.FormCreate(Sender: TObject); var i : Integer; begin for i := 0 to ComponentCount - 1 do if (Components[i] is TControl) then TControl(Components[i]).OnMouseDown := |
Fehlermeldung: "[DCC Fehler] Unit1.pas(46): E2362 Auf protected-Symbol TControl.OnMouseDown kann nicht zugegriffen werden"
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 25.01.12 17:33
Ok, dann ist es da noch nicht veröffentlicht. Da musst du halt mal schauen ab wann es da ist. Das kann auch bei unterschiedlichen Komponenten unterschiedlich sein.
|
|
Pferdenarr 
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 26.01.12 09:47
Ich habe eine Lösung gefunden: www.swissdelphicente...showcode.php?id=1148
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:
|
private procedure AssignOnContextPopupEvent; procedure OnContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); public end;
var Form1: TForm1;
implementation
{$R *.dfm}
uses TypInfo;
procedure TForm1.OnContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin with Sender as TComponent do ShowMessage(Name + ' right-clicked!'); end;
procedure TForm1.AssignOnContextPopupEvent; var i: Integer; PropInfo: PPropInfo; Method: TMethod; PEvent: ^TContextPopupEvent; begin for i := 0 to ComponentCount - 1 do begin PropInfo := GetPropInfo(Components[i].ClassInfo, 'OnContextPopup'); if (PropInfo <> nil) and (PropInfo^.PropType^^.Kind = tkMethod) then begin Method := GetMethodProp(Components[i], PropInfo); if not Assigned(Method.Code) then begin PEvent := @Method.Code; PEvent^ := OnContextPopup; Method.Data := Self; SetMethodProp(Components[i], PropInfo, Method); end; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin AssignOnContextPopupEvent; end; |
|
|