Function - Designfehler?

Liebe ExpertInnen,

während der Entwicklung einer Access-Applikation habe ich eine Function geschrieben, die (so ungefähr) die Methode Hittest ersetzt: Sie wird mit Koordinaten versorgt und liefert ein Steuerelement zurück, wenn dort eines sitzt. Klappt auch; nur, wenn keines dort ist, laufe ich beim Versuch, das Steuerelement anzusprechen, auf einen Fehler „424 - Objekt erforderlich“.

Keine Überraschung - aber wie fange ich das ab? Erste Idee war, per OnError eben diesen 424 abzufangen. Ist das Murks? Gibt es bessere Möglichkeiten? Wer weiß was?

Gruß Ralf

Hallo,

während der Entwicklung einer Access-Applikation habe ich eine
Function geschrieben, die (so ungefähr) die Methode
Hittest ersetzt: Sie wird mit Koordinaten
versorgt und liefert ein Steuerelement zurück, wenn dort eines
sitzt. Klappt auch; nur, wenn keines dort ist, laufe ich beim
Versuch, das Steuerelement anzusprechen, auf einen Fehler "424

  • Objekt erforderlich".

und prüfen, ob es das Steuerelement gibt? Etwas Code wäre hilfreich gewesen, deshalb mal nur ein grobes Beispiel:

 Dim ctrl As Control
 For Each ctrl In Controls
 If ctrl.Name = "gesuchter\_Name" Then
 'Funktion aufrufen
 End If
 Next

Gruß, Rainer

Moin, Rainer,

und prüfen, ob es das Steuerelement gibt?

kleines Missverständnis, die Function soll mir den Namen liefern.

Hintergrund: drag&drop von einer Listbox zu einer (von vielen) anderen soll simuliert werden. Dabei kann der Anwender natürlich auch ins Nirwana droppen.

Gruß ralf

Liebe ExpertInnen,

Hallo Ralf,

während der Entwicklung einer Access-Applikation habe ich eine
Function geschrieben, die (so ungefähr) die Methode
Hittest ersetzt:

Hittest ? Darunter stelle ich mir vor, das wenn ich ueber einen text fahre , dieser dann hervorgehoben wird. Sehe ich das richtig ?

Sie wird mit Koordinaten
versorgt und liefert ein Steuerelement zurück, wenn dort eines
sitzt.

Ok, nur ohne den Source zu sehen, kann man schlecht was sagen!
Die Function „isObject“ holft Dir nicht weiter?

Klappt auch; nur, wenn keines dort ist, laufe ich beim
Versuch, das Steuerelement anzusprechen, auf einen Fehler "424

  • Objekt erforderlich".

Ist klar :smile:

Keine Überraschung - aber wie fange ich das ab? Erste Idee
war, per OnError eben diesen 424 abzufangen. Ist das Murks?
Gibt es bessere Möglichkeiten? Wer weiß was?

Nein, Murks ist es nicht! Denn genau dafür ist sie da!
Murks waere es, wenn du überall „On Error Resume Next“ verwenden würdest.

Aber ein
On Error goto XYZ
'Dein Befehl
On Error Goto 0
Exit …
XYZ:
'Deine Massnahme
Resume 'next

Ist schon ok :smile:

Gruß Ralf

MfG Alex

Hi Ralf,

kleines Missverständnis, die Function soll mir den Namen
liefern.

ja, das hatte ich falsch verstanden.

Hintergrund: drag&drop von einer Listbox zu einer (von vielen)
anderen soll simuliert werden. Dabei kann der Anwender
natürlich auch ins Nirwana droppen.

hmmm. Da werde ich nicht helfen können, in VB ist das einfach. Das Ereignis wird beim Drop ausgelöst. Beispiel:

Option Explicit

Private Sub Text2\_DragDrop(Source As Control, X As Single, Y As Single)
 Text2.Text = Source.Text
End Sub

Text1 greifen, in Text2 fallen lassen, Text2 enthält den Text von Text1.

Gruß, Rainer

Hallo Ralf,

mir ist gerade so eine Idee gekommen :wink:
Normalerweise geht es auch, ohne das ein Fehler ausgelöst wird :smile:

So Adhock und ohne zu testen und unter VB ( was aber in dem Falle keine Rolle spielt) würde ich das so lösen.

Public Function GetMyObject(x as Integer, y as Integer) as Object
Dim c as Control
GetMyObject=Nothing
For each c in Me
if x\>=c.Left and x=c.top and y

Aufrufen musst du nur die Funktion und ihr die Koordinaten übergeben! Bekommst du ein Nothing zurueck, so gibt es kein Object an der Stelle. Ansonsten, wenn ein Object dort ist, so bekommst du das Object zurueck!

Ich hoffe ich habe an meiner Denkweise keinen Fehler :wink:

MfG Alex

Moin, ALex,

Moin Ralf,

erstmal zur Methode Hittest:
http://msdn2.microsoft.com/en-us/library/aa443456.aspx

Ok, schaue ich dann gleich einmal. Ist aber eigentlich auch für dein Anliegen unrelevat, da du ja nur das Object brauchst :smile:

Weiß ich nicht. Wenn Nothing zurückgegeben wird, scheppert es
bei

Ach quark. Da ich gerade zeit habe, mal schnell einen kleinen Kurs in Sachen Speicher :smile:

Es gibt 2 Arten von Speicher! Den Managed Heap (Heap) und dem Stack!
Dann gibt es 2 Arten von Variablen die du speichern kannst.
Wertevariablen und Referenzvariablen!

WerteVariablen sind zum Bsp.

Integer, Byte etc

ReferenzVariablen sind zum Bsp.

Objecte, Array’s etc.

Wertevariablen werden im Stack abgelegt. Das bedeutet ist der Wert dort, ist er halt da und wenn nicht, dann nicht :wink:

Anders ist es bei ReferenzVariablen!
Diese liegen im Heap!
Aber zusaetzlich befindet sich im Stack noch eine Korrespondierende, die auf dem Heap zeigt! Im Stack steht ergo nur die Adresse vom Heap wo sich das Object befindet!
Nun kann eine ReferenzVariable den Wert Nothing annehmen. Das bedeutet das im HEAP keine Daten mehr vorhanden sind. Die Korrespondierende im Stack aber noch vorhanden ist :wink:

So im grossem und ganzen war es das eigentlich schon :smile:

Set Zielbox = ListboxSuchen (Me, x, y)

Nehmen wir einmal, es wird kein Object gefunden und du bekommst „Nothing“ zurueck, so bedeutet die Zuweisung.

Set Zielbox = ListboxSuchen (Me, x, y)

Das im Stack eine Variable Zielbox angelegt wird, die aber auf „NICHTS“ im Heap zeigt.

Ein Zugriff über Zielbox.DeineMethodeODerEigenschaft würde fehlschlagen!

Aber das kannst du nun wiederrum ganz elegant abfragen :smile:

Set Zielbox=Listboxsuchen(me,x,y)
If Zielbox isnothing then
 'Object ist nicht vorhanden!
Else
 'Deine Aktion ausführen :smile:
End If

genauso. Ach ja: ListboxSuchen klappt, wenn der Cursor über
einer Listbox losgelassen wird.

Wie ich aber sehe, übergibst du die Form noch! So klappt aber die Function nicht :confused: Handelt es sich ausschliesslich um Listboxen, so kannst du das wiefolgt modifizieren

Public Function ListBoxSuchen(F as Form, X as Integer, Y as Integer) as Listbox
Dim c as Control
ListBoxSuchen=Nothing
For each c in f
If typeof c is ListBox then if x\>= c.left and x=c.height+c.top then
'entweder
ListBoxenSuchen=c
'oder, weiss das net mehr so genau :s
Set ListBoxSuchen=c
Exit Function
End if
next

MfG Alex

Gruß Ralf

Ups … das ist mir nen Fehler unterlaufen :s

'Ersetze mal 
 y=c.height+c.top then
durch 
 y **\>** =c.top and y **=c.height+c.top then**  

MfG Alex

Hi Rainer,

Das Ereignis wird beim Drop ausgelöst.

Drop gibbet nich in VBA (Office 2000), deshalb mache ich mir ja die Mühe :frowning:(( Dennoch vielen Dank.

Gruß Ralf

Hi Alex,

Test ist nicht alles, ober ohne Test ist alles nichts: Set Zielbox scheppert bereits. Ist aber nicht das größte Problem, über die OnError-Lösung haben wir ja schon gesprochen. Danke Dir!

Gruß Ralf

Ups … das ist mir nen Fehler unterlaufen :s

Mach Dir da mal keine Sorgen, der Part läuft schon lang.

Gruß Ralf

Hallo Ralf,

Test ist nicht alles, ober ohne Test ist alles nichts: Set
Zielbox scheppert bereits. Ist aber nicht das größte Problem,
über die OnError-Lösung haben wir ja schon gesprochen. Danke
Dir!

Ein kleine Anmerkung noch :smile:
Wenn du eine Variable declarierst als Object ist es immer eine Refernez :smile: Als Eselsbruecke kannst du Dir merken, alles was du auf Nothing setzen kannst und du unter VB oder VBA mit SET setzt sind Referenzen :wink:
Bei Refernzen musst du beim programmieren ein wenig aufpassen. Denn Referenzen setzen ByVal und ByRef ausser kraft :wink:

Gruß Alex

nichts zu danken. Wie es in so vielen Faellen ist, führen viele Wege nach Rom :smile: Die Hauptsache ist, das es funktioniert, es ausbaufaehig ist und du es auch verstehst :wink:

MfG Alex