Seite 1 von 1

Name einer Instanz ermitteln [ERLEDIGT]

Verfasst: Do, 01. Mär 2012 14:50
von Manfred
Hi,

im Moment komme ich nicht weiter. Wie komme ich an den Namen einer Instanz ran? Der Name der Klasse, von der instanziiert wird ist klar.

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 15:18
von georg
Hallo, Manfred -


Du meinst

Code: Alles auswählen

oXbp := XbpDialog():new(...)
Da Du bestimmt nicht oXbp:className() meinst, bleibt die Frage übrig, ob Du wissen willst, wie "oXbp" heisst?


Verwundert grüssend,

Georg

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 15:23
von Manfred
Hi Georg,

fast richtig. Ich möchte die Info bekommen, das Teil heißt oXbp. Das ist ja der Instanzname. Im Moment erhalte ich nur das es XbpDialog heißt.

nur:

Code: Alles auswählen

ox1 := XbpDialog():new()
ox2 := XbpDialog():new()
ox3 := XbpDialog():new()
ox4 := XbpDialog():new()
ox5 := XbpDialog():new()
ergibt immer nur XbpDialog und das hilft mir nicht weiter, für das wozu ich es benötigen will.

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 15:52
von brandelh
Manfred,

oXbp ist NICHT der Instanzname, falls es den überhaupt gibt.
Das ist der Name der lokalen Variable in deinem Quellcode ... was passiert beim compilieren ?
Richtig, locale Variablen weren in Speicherbereiche umgerechnet und somit ist zur Laufzeit nur noch ein Zeiger im Code.
Keine Info über den Namen der Variable.

Du kannst aber CARGO ... soweit nicht anders verwendet dafür benutzen.

Code: Alles auswählen

oXbp := XbpSle()....
oXbp:cargo := "oXbp"
...
ob das Sinn macht ???

Falls du aber z.B. in einer Methode deiner Fensterklasse wissen willst, welcher PushButton gerade ausgelöst hat, das geht ... da dieser ja auch aufgelöst wird:

Code: Alles auswählen

::pbEnde:activate := {|n1,n2,oXbp| ::ZeigButton( oXbp ) }
::pbOK:activate := {|n1,n2,oXbp| ::ZeigButton( oXbp ) }
::pbEgal99:activate := {|n1,n2,oXbp| ::ZeigButton( oXbp ) }
...
method :ZeigButton( oXbp ) 
local cTxt
do case
    case oXbp = ::pbEnde
          cTxt := "pbEnde"
    case oXbp = ::pbEnde
          cTxt := "pbOK"
    case oXbp = ::pbEgal99
          cTxt := "pbEgal99"
end case
msgbox( "Gedrückt wurde "+cTxt , "Info")

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 16:07
von Manfred
Ich wußte, es läuft wieder aus der Bahn.

OK, es sieht folgendermassen aus:

Ich habe eine Fehlerroutine, die entsprechende Meldungen rauswirft, welche DBF nicht das macht, was der Anwender erwartet.

Code: Alles auswählen

oXbp:cDbank
Da meine Datenbankklasse alles automatisch verwaltet, wird bei einer Mehrfachöffnung nur der Alias anders sein. D.h. Ich bilde x Instanzen von einem Datenbankobjekt und öffne damit x-mal eine DBF. Der Name oXbp(X):cDbank ist immer der gleiche, aber der Alias ist ein anderer. Jetzt hatte ich jüngst das Problem, dass ich eine DBF mehrmals hintereinander (unter verschiedenen) Aliasnamen geöffnet hatte, aber die :cDbank hieß immer gleich und somit gab es eine Meldung über eine DBF, die eigentlich nicht so hieß. Sowas verführt natürlich dazu, unendlich und an der falschen Stelle zu suchen. Selbst wenn ich den Alias anzeigen würde, wüßte ich aber immer noch nicht von welcher Instanz es die DBF ist. Also wäre es schön, wenn ich die auslesen könnte um somit genau zu wissen, was da rumzickt.
Cargo fällt somit auch flach, weil da auch nichts automatisch reingeschrieben werden könnte, was genau definiert wer was ist.!

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 16:15
von brandelh
Hallo Manfred,

ich würde NIE den Alias() Namen bei Xbase++ benutzen, da dieser nie sicher ist.
Ich verwende den numerischen Selectbereich. Also

Code: Alles auswählen

USE cDBF ... NEW // KEIN ALIAS ANGEBEN
if neterr()
  ... 
endif
::nAlias := select()
das hat zwei Vorteile, der Selectbereich ist im Programm (je Thread) eindeutig und wenn man wissen will ob er noch offen ist
wird es nie eine Fehlermeldung bei (::nAlias)->(used()) geben. Bei (cAlias)->(used()) knallt es wenn es den Alias nicht (mehr) gibt.

Somit könntest du in der Fehlerroutine den Selectbereich ausgeben.

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 16:18
von Manfred
Hubert,

das war nur ein Beispiel. Bitte nicht drauf herumreiten. Ich nutze die Selectnummer

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 16:28
von brandelh
Manfred,

wenn du mir nicht glauben willst, dass es sowas wie den Instanznamen nicht gibt, baue doch zum Testen eine Methode mit einen schweren Fehler ein.
Dann schau in der XppError.LOG nach ob du den NAMEN der Variablen dort findest. Wenn nein, geht es einfach nicht (außer du legst extra ein Feld NameIVar an),
falls doch, kannst du in der ErrorSys.prg nachsehen wie sie den Namen ermittelt haben ;-)

Code: Alles auswählen

method ...:HierKnallts(oXbp)
    local cMichKenntManNicht := "A", nWasSollDas
    nWasSollDas := cMichKenntManNicht ^ 2
return self
das sollte eine schöne Fehlermeldung geben, bitte die XppError.LOG posten :D

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 16:34
von Manfred
Hubert,

ich glaube Dir das. Auf jeden Fall. Ich wollte nur ein Abschweifen verhindern. Aber wenn es nicht geht, dann geht es nicht.

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 16:58
von brandelh
Der Select-Bereich kann dir schon helfen, aber ist es eigentlich nicht egal in welcher der "Instanzen" der Fehler auftritt,
es kommt doch auf den Inhalt der Datenfelder, den Selectbereich und den durchlaufenen Quellcode an oder ?

Ich habe bei mir die ErrorSys.PRG so aufgebohrt, dass sie mir Aktenzeichen, Sachbearbeiter und Routine des Fehlers ausgibt ...
Oft reicht aber auch das nicht aus, da das andere Vorgehen erst Situationen produziert, die ich bei meinen Test gar nicht vorausgesehen habe.

Re: Name einer Instanz ermitteln

Verfasst: Do, 01. Mär 2012 17:09
von Herbert
Manfred hat geschrieben:Ich habe eine Fehlerroutine, die entsprechende Meldungen rauswirft, welche DBF nicht das macht, was der Anwender erwartet.

Code: Alles auswählen

============================================================================
ERROR MESSAGE from  "D:\xbase\MANFRED.EXE"  Date:, 14.10.10, 20:36:06
Xbase++ version     :, Xbase++ (R) Version 1.90.355
Operating system    :, Windows 7 06.01 Build 07600
Application version :, ZUSCALC, 7.1, 01.09.2010
User: Manfred/MANFRED-PC
----------------------------------------------------------------------------
oError:canDefault   :Nein
oError:canRetry     :Nein
oError:canSubstitute:Ja
oError:cargo        :NIL
oError:description  :Vom Benutzer nicht erwartetes Verhalten
oError:genCode      :2
oError:operation    :<NIL> / <42>
oError:osCode       :0
oError:severity     :2
oError:subCode      :3
oError:subSystem    :BASE
oError:thread       :5
oError:tries        :0
----------------------------------------------------------------------------
CALLSTACK:
----------------------------------------------------------------------------
Aufgerufen von: DBEZKA(623)
Aufgerufen von: PRNLIST:SAVEDATA(256)
Aufgerufen von: (B)PRNLIST:INIT(78)
Aufgerufen von: XBPPUSHBUTTON:HANDLEEVENT(968)
Aufgerufen von: DIALOG(294)
Etwa so?
:D
Manfred hat geschrieben:Ich bilde x Instanzen von einem Datenbankobjekt und öffne damit x-mal eine DBF. Der Name oXbp(X):cDbank ist immer der gleiche, aber der Alias ist ein anderer. Jetzt hatte ich jüngst das Problem, dass ich eine DBF mehrmals hintereinander (unter verschiedenen) Aliasnamen geöffnet hatte, aber die :cDbank hieß immer gleich und somit gab es eine Meldung über eine DBF, die eigentlich nicht so hieß. Sowas verführt natürlich dazu, unendlich und an der falschen Stelle zu suchen. Selbst wenn ich den Alias anzeigen würde, wüßte ich aber immer noch nicht von welcher Instanz es die DBF ist. Also wäre es schön, wenn ich die auslesen könnte um somit genau zu wissen, was da rumzickt.
Cargo fällt somit auch flach, weil da auch nichts automatisch reingeschrieben werden könnte, was genau definiert wer was ist.!
Schön speziell. In diesem Fall würde ich die DB einmal öffnen und für alle im selben Selectbereich ansprechbar lassen.

Re: Name einer Instanz ermitteln

Verfasst: Fr, 02. Mär 2012 3:52
von AUGE_OHR
Manfred hat geschrieben:Cargo fällt somit auch flach, weil da auch nichts automatisch reingeschrieben werden könnte, was genau definiert wer was ist.!
nö ... das ist IMHO die einzige Lösung mit :Cargo was "allgemein" gilt.

Code: Alles auswählen

cName := oDialog:title
cName := oStatic:caption
cName := oButton:caption
wären ja spezifisch für bestimmte XbParts.
im Grunde müsstest du mit oXbp:isDerivedFrom() "feststellen" um was für ein XbPart es sich handelt.

Frage : pro ALIAS() auch ein Thread ?

wenn ja, vielleicht wäre dort ein Ansatz um dem Thread ( wer/wo/wann ) mehr Infos zu entlocken ?

Re: Name einer Instanz ermitteln

Verfasst: Fr, 02. Mär 2012 9:47
von UliTs
Hallo Manfred,

kannst Du nicht einfach die Programmzeilennummer speichern/verwenden?
Wenn ich es richtig verstanden habe, möchtest Du das ganze ja im "Fehlerfall" auswerten...
Und dann kannst Du direkt in die Zeile im Programmcode reingehen und siehst auch den Namen der Local-Variable :-) .

Uli

Re: Name einer Instanz ermitteln

Verfasst: Fr, 02. Mär 2012 9:51
von Manfred
Um die Sache auf den Punkt zu bringen:

Ich kann alles über Umwege machen. Ich wollte nur wissen, ob es einen kurzen, knappen, eleganten Weg gibt. Ich habe oft feststellen müssen, dass ich viel zu viel Verbiegungen vollzogen habe um etwas zu erreichen, was vom System her schon längst zur Verfügung stand. Deshalb meine Frage! Im Zweifelsfalle gebe ich einen Parameter in der entsprechenden Öffnungemethode mit, über den ich alles sehen kann. Aber das ist nur der letzte Weg. Aber scheinbar auch der einzige.

Re: Name einer Instanz ermitteln [ERLDIEGT]

Verfasst: Sa, 03. Mär 2012 0:26
von AUGE_OHR
Manfred hat geschrieben:Wie komme ich an den Namen einer Instanz ran?
indem du einen "vergibst" ...

einen "Namen" kannst du IMHO nicht verwenden ... damit kann die Maschine "so" nichts anfangen ;)
die Antwort von Hubert mit o:Cargo ist "die" auf einen "Namen".

was anderes ist dass jedes mal, wenn Xbase++ ein Object "erzeugt", es ein Handle geben MUSS ... eine Frage an Pablo.

p.s. ich nehme solche "dynamischen" Objecte immer in ein Array zwecks "Verwaltung" auf.