Codeblock in Klasse [Erledigt]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Codeblock in Klasse [Erledigt]

Beitrag von Jan »

So, endlich mal eine Klassenfrage von mir #-o Jetzt kommt hier die Enführung in Klassen für Dummies.

Folgendes: Ich habe eine Klasse, in der diverse Statics und Dialoge aufgebaut werden. Nun möchte ich da gerne noch ein :resize einbauen.

Also: Es gibt einen ::oParent, der der Parent von ::oDlg ist. Das funktioniert auch alles, null Problemo. Aber hier knallt es:

Code: Alles auswählen

::oParent:resize{|aOldSize, aNewSize, self|;
                 ::oDlg:lockUpdate(.T.), ;
                 ::oDlg:lockUpdate(.F.), ;
                 ::oDlg:invalidateRect()}
Zwischen die beiden :lockUpdate() muß natürlich noch was gemacht werden, das lass ich aber erstmal weg. Aber natürlich gibt das hier einen Laufzeitfehler wegen des ::oDlg.

Kann mir jemand sagen, wie ich in dem Codeblock den ::oDlg anspreche? Mutige und Geduldige vor! :?
Zuletzt geändert von Jan am Fr, 27. Mär 2009 6:40, insgesamt 1-mal geändert.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Codeblock in Klasse

Beitrag von AUGE_OHR »

Jan hat geschrieben: Also: Es gibt einen ::oParent, der der Parent von ::oDlg ist. Das funktioniert auch alles, null Problemo. Aber hier knallt es:
STOP !
Frage :

Code: Alles auswählen

::oDlg := myClass():New(::oParent)
wenn Ja, was ist ::oParent : Dialog, DrawingArea oder Static ... ?
Jan hat geschrieben:

Code: Alles auswählen

::oParent:resize{|aOldSize, aNewSize, self|;
                 ::oDlg:lockUpdate(.T.), ;
                 ::oDlg:lockUpdate(.F.), ;
                 ::oDlg:invalidateRect()}
Zwischen die beiden :lockUpdate() muß natürlich noch was gemacht werden, das lass ich aber erstmal weg. Aber natürlich gibt das hier einen Laufzeitfehler wegen des ::oDlg.
YUP muss es bei ::oDlg:lockUpdate() den das geht nicht auf die :drawingArea !

Code: Alles auswählen

::oParent:drawingArea:resize{|aOldSize, aNewSize, oSelf| ;
                   ::myResize(aOldSize, aNewSize, oSelf) }
Du "malst" doch die XbParts auf der :drawingArea und nicht "auf" dem ::oDlg.
Der müsste wohl in der :drawingArea:Childlist() stecken.

Code: Alles auswählen

Methode MyClass:myResize(aOldSize, aNewSize, oSelf)
LOCAL aChild
LOCAL i,iMax

   IF aOldSize[1] == 0 .AND. aOldSize[2] == 0       // was minimized
      aOldSize := aNewSize                          // use NewSize
   ELSEIF aNewSize[1] == 0 .OR. aNewSize[2] == 0    // is minimized
      RETURN                                        // do nothing
   ELSEIF aNewSize[1] == aOldSize[1] .AND. aNewSize[2] == aOldSize[2]
      RETURN                                        // same Size
   ENDIF

   oSelf:lockUpdate(.T.)
   aChild := oSelf:Childlist()
   iMax := LEN(aChild)
   FOR i := 1 TO iMax
         DO CASE
              CASE aChild[i]:isDerivedFrom("XbpDialog")
                      aChild[i]:setPosAndSize(aPos,aSize)
...
         ENDCASE
   NEXT
   oSelf:lockUpdate(.F.)
   oSelf:invalidateRect()
RETURN self
wenn ich das nun soweit richtig verstanden habe ist ::oDlg ein MDI Client, also muss ::oDlg selbst auch noch einen :resize Codeblock bekommen,
oder wolltest du "den" direkt ansprechen?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Codeblock in Klasse

Beitrag von brandelh »

Jan hat geschrieben:

Code: Alles auswählen

::oParent:resize{|aOldSize, aNewSize, self|;
                 ::oDlg:lockUpdate(.T.), ;
                 ::oDlg:lockUpdate(.F.), ;
                 ::oDlg:invalidateRect()}
Hallo Jan,

auch wenn die Beispiele es oft so zeigen, SELF darf nicht als Variablenname in den Parameterteil,
da sonst im Codeblock alle Zugriffe auf :: auf diesen SELF ausgeführt werden !

::oDLG in deinem Beispiel ist somit nicht mehr das was du erwartest, sondern SELF:oDLG -> somit dein ::oParent:oDLG, denn
der 3. Parameter wird bei der Ausführung mit dem Objekt geladen, das diese Methode aufgerufen hat.
Falls also keine weiteren Fehler vorhanden sind, sollte es so gehen ...

Code: Alles auswählen

::oParent:resize{|aOldSize, aNewSize, oXbp|;
                 ::oDlg:lockUpdate(.T.), ;
                 ::oDlg:lockUpdate(.F.), ;
                 ::oDlg:invalidateRect()}
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Codeblock in Klasse

Beitrag von Jan »

Hallo Hubert,

genau das Problem habe ich so auch gesehen. Und das ergibt ja nun mal auch den Laufzeitfehler. Aber da ich nun bekanntermaßen kein Klassen-Mensch bin wußte ich nicht, wie ich das umgehen kann. Ich werde also heute Abend mal Deinen Tipp versuchen.

In allen anderen Dialogen, wo ich das :resize() mache, funktioniert das ja einwandfrei. Aber da ist das auch nicht in eine Klasse geschrieben.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Codeblock in Klasse

Beitrag von Martin Altmann »

Hallo Jan,
da Du das self (bzw. oXbp) aus dem Parameterteil innerhalb des Codeblocks gar nicht benutzt, kannst Du es natürlich auch ganz weglassen (inkl. dem , davor -> |aOldSize, aNewSize|).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Codeblock in Klasse

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: In allen anderen Dialogen, wo ich das :resize() mache, funktioniert das ja einwandfrei. Aber da ist das auch nicht in eine Klasse geschrieben.
hm ... ist der Code nur ein "Beispiel" ? ... ich sehen nicht wie "aNewSize" hier wirken sollte ?
Martin hat geschrieben: (inkl. dem , davor -> |aOldSize, aNewSize|)
aber wie soll ein Resize() den überhaupt ohne aNewSize funktionieren ?

... oder war das eine "allgemeine" Function Resize() die du nun zur Method machst ?
Hubert hat geschrieben: auch wenn die Beispiele es oft so zeigen, SELF darf nicht als Variablenname in den Parameterteil,
da sonst im Codeblock alle Zugriffe auf :: auf diesen SELF ausgeführt werden !
JA deshalb benenne ich den 3th. Parameter oft in oSelf um oder lasse ihn weg, wie Martin sagte.

ich bin jetzt davon ausgegangen das die Class FROM XbpDialog ist und die Child auf der :drawingArea liegen.
Damit wäre oSelf im Codeblock des Child

Code: Alles auswählen

::oParent:drawingArea:resize{|aOldSize, aNewSize, oSelf| ;
                   ::myResize(aOldSize, aNewSize, oSelf) }
ja die :drawingArea den das wäre doch das XbpWindow() !?
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Codeblock in Klasse

Beitrag von Jan »

Jimmy,

Du siehst das leider total falsch.

Was ich mache ist, daß ich in den ::oParent:resize-Slot die Größenänderung aller oder mancher auf dem Parent enthaltenen XBParts durchziehe. Da meist nicht alles angesprochen wird mache ich das manuell für jeden XBPart einzeln. Du hast ja auf dem XUG-Treffen gesehen, was das Resultat ist.

Die 3 Parameter im Codeblock brauche ich daher überhaupt nicht. Ich mache das nur häufig so daß ich die trotzdem eintrage, weil das manchmal ein Ideengeber ist für etwas, was man noch so machen könnte, oder wie man das eleganter machen könnte. Die stehen da also auch dann drin, wenn die garnicht abgefragt werden.

Übrigens: ::oParent ist die Drawingarea eines Dialoges.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Codeblock in Klasse

Beitrag von AUGE_OHR »

Jan hat geschrieben: Was ich mache ist, daß ich in den ::oParent:resize-Slot die Größenänderung aller oder mancher auf dem Parent enthaltenen XBParts durchziehe. Da meist nicht alles angesprochen wird mache ich das manuell für jeden XBPart einzeln. Du hast ja auf dem XUG-Treffen gesehen, was das Resultat ist.

Übrigens: ::oParent ist die Drawingarea eines Dialoges.
klar "kann" man das dann auch so machen, aber es soll doch eine Class werden :)

deine XbParts "erben" doch von der DrawingArea praktisch den :resize Slot und du musst es nicht
jedem einzelnem XbPart "beibringen". In der :resize Method hab ich doch das

Code: Alles auswählen

CASE aChild[i]:isDerivedFrom()
was ich zu Unterscheidung benutze.

In eine Class hast du doch auch Zugriff auf "alle" VAR denen du XbParts zugordnet hast, also
kannst du genau bestimmen wann/wer sich wie verhalten soll(te)

"alles" was mit der Class zu tun hat geht nur durch 1 Aufruf und ist auf die Method konzentriert.
Jan hat geschrieben: Die 3 Parameter im Codeblock brauche ich daher überhaupt nicht...
bei einer Method myClass:resize FROM XbpDialog hast du völlig recht.

Man kann aber auch eine Procedure/Function für mehrere "ähnliche" Class(en) nehmen und da
ist der 3th. Parameter self im Prinzip schon richtig damit die Procedure/Function weiss
welche Class den nun gemeint ist

p.s. schon mal mit/ohne :invalidateRect() probiert ?
bei setPosandSize() braucht man oft kein :invalidateRect() während setSize() es oft benötigt ...
was nun wiederum zu einem "flicker" beim :resize führen könnte ...
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Codeblock in Klasse

Beitrag von Jan »

Jimmy hat geschrieben:p.s. schon mal mit/ohne :invalidateRect() probiert ?
bei setPosandSize() braucht man oft kein :invalidateRect() während setSize() es oft benötigt ...
was nun wiederum zu einem "flicker" beim :resize führen könnte ...
Ja klar. Das gibt dann regelmäßig Darstellungsfehler. manche alte Sachen bleiben stehen, neue werden nicht korrekt abgebildet. Deswegen baue ich das in meine Resize-Funktionen immer mit ein. Im Resize habe ich grundsätzlich nur :setPos() und :setSize() drin. Und normalerweise nicht beide auf den gleichen XBPart.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Codeblock in Klasse [Erledigt]

Beitrag von Jan »

So. Wie versprochen habe ich gestern Abend mal den "self" aus dem Codeblock rausgenommen. Und wie gedacht, es funktioniert. Danke für die Hinweise.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten