Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Übergabe eines Objekts an Prozedur/Funktion (https://www.delphipraxis.net/151499-uebergabe-eines-objekts-prozedur-funktion.html)

relocate 20. Mai 2010 11:22


Übergabe eines Objekts an Prozedur/Funktion
 
Servus,

ich möchte ein Objekt an eine Prozedur/Funktion übergeben und damit dort weiter arbeiten.
Um auf ein Objekt zugreifen zu können muss mit is und as umgewandelt (gecastet) werden,
es könnte aber alles mögliche an Objekten kommen (Label, Buttons, Forms, etc.) , die nur
via Handle weiterbearbeitet werden sollen. Ein Zugriff scheint ohne Umwandlung aber nicht
möglich. Wie kann man nun auf ein beliebiges Objekt zugreifen ohne alle Möglichkeiten überprüfen
zu müssen, wie gesagt, es wird lediglich der Handle benötigt, den ja jedes Objekt hat.
Delphi Version 6.

Gruß relocate

Tryer 20. Mai 2010 11:26

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Die Objekte mit Handle sollten wohl alle von TWinControl abstammen, das wäre also ein gemeinsamer Vorfahre mit dem du ohne casten auskommst.

Grüsse, Dirk

himitsu 20. Mai 2010 11:31

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Prüfte und caste alles auf TComponentsTWinControl, oder irgendeinen anderen gemeinsamen Vorfahren, welcher das Handle zugänglich macht.

[edit] wo kommt denn Tryers Beitrag plötlich her :shock:
aber mit TWinControl könnte er Recht haben TWinControl

Bernhard Geyer 20. Mai 2010 11:44

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Stichwort RTTI. Mit den Funktionen aus der TypeInfo.pas-Unit kannst du aus Properties von Objekten zugreifen ohne auf ihren Typ zu casten. Machte die Delphi-IDE bzw. VCL auch im großen Maße.

Tryer 20. Mai 2010 11:51

Re: Übergabe eines Objekts an Prozedur/Funktion
 
RTTI ist ntürlich sehr mächtig, wäre hier aber imo die Lösung mit dem Vorschlaghammer.
TWinControl ist als die Basisklasse definiert in der Windows - Fensterobjekte (Handle) eingeführt werden. Per RTTI könnte ich herausfinden das es vielleicht auch noch irgendwo ein TPersistent gibt das auch eine Eigenschaft Handle hat, aber ob das dann wirklich ein gültiges Fensterhandle ist kann ich nur durch Try&Error herausfinden (TBitmap.Handle, THandleStream..).

Grüsse, Dirk

relocate 20. Mai 2010 12:03

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Danke für die Tipps, werde das mit den TwinControls mal probieren und
wenn das nicht ausreicht mit dem Vorschlaghammer arbeiten. :-D

Gruß relocate

Medium 20. Mai 2010 13:09

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Dann aber Vorsicht mit "Handle"-Properties von Objekten, die nicht von TWinControl abstammen - wie Tryer schon sagte. TBitmap.Handle ist z.B. ein HDC, kein HWnd, und kann demnach auch nicht wie ein solches mit den Fenster-APIs be-/verarbeitet werden. Was "Handle" heisst, muss nicht zwangsweise ein Fensterhandle sein, da gibt's mehrere. Mit TWinControl bist du da auf der sicheren Seite. Oder du musst dann via RTTI den Typ noch prüfen, und ggf. noch bei Windows nachfragen, da ich problemlos ein HWnd Property machen könnte, in dem einfach mal Murks liegt, von dem Windows gornüscht weiss.

implementation 20. Mai 2010 13:46

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Zitat:

Zitat von Medium
Was "Handle" heisst, muss nicht zwangsweise ein Fensterhandle sein, da gibt's mehrere. ... Oder du musst dann via RTTI den Typ noch prüfen, und ggf. noch bei Windows nachfragen, ...

MSDN-Library durchsuchenIsWindow könnte dann evtl. helfen.

Tryer 20. Mai 2010 17:28

Re: Übergabe eines Objekts an Prozedur/Funktion
 
Zitat:

Zitat von implementation
MSDN-Library durchsuchenIsWindow könnte dann evtl. helfen.

Mit Betonung auf "könnte", muß nämlich nicht. Der Wert des Handles ist genauso eindeutig wie der Index eines Strings in einer TStringlist - im falschen Kontext (einer anderen Liste) kann etwas ganz anderes (ebenfalls existierendes) dahinter stecken.
Dann wäre die Aussage nur: ja, es gibt auch ein Fenster mit diesem Handle - nur ob du dich für dieses Fenster wirklich interessierst kann dir niemand sagen.
Das Handle ist dann auch nur der Griff zum wegschmeissen.

Grüsse, Dirk


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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