Seite 1 von 2

Klassen Erstellung

Verfasst: Do, 29. Mär 2012 13:20
von messing
Servus,
habe mal ein paar Tage die Doku studiert.
Wenn ich aus den Klassen XbpSLE und GET eine Klasse ableite z.B. MyGet erbt die abgeleitete Klasse die Eigenschaften.

Code: Alles auswählen

   CLASS MyGet from XbpSle, Get
   METHOD init
   ENDCLASS
   METHOD MyGet:init( nRow, nCol )
      ::nRow   := IIF( nRow == NIL, ROW(), nRow )
      ::nCol   := IIF( nCol == NIL, COL(), nCol )
   RETURN self

Wer hilft dabei, diese Klasse Schritt für Schritt aufzubauen?
Dies mag für Euch eventuell nicht nötig sein, doch würde dieser Klassenaufbau hier, jedem das Kapitel KLASSE näherbringen.
Davon profitieren alle, ob Anfänger oder Fortgeschrittene in der Klassen Programierung.
Die Methode Init habe ich einfach nur eingesetzt um mir das Objekt genauer ansehen zu können.

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 13:27
von Jan
Bruno,

schau Dir doch mal die SLEPic-Klasse an. Die ist ebenfalls von XbpSle abgeleitet. Das könnte Dir also gute Ansatzpunkte geben.

Jan

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 13:31
von brandelh
Oder die von mir, Datum, Zahlen, auch eine mit Filter in der Wissensbasis gibt es meine Klassen.

Gerade am Anfang ist es nützlich zunächst fertige zu benutzen und den Quellcode anzusehen.
Gerade die Tastatursteuerung von SLE ist kein Anfänger Thema ;-)

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 13:33
von Tom
Davon abgesehen glaube ich kaum, dass es gelingen wird, aus XbpSLE und Get eine funktionierende Klasse zu erzeugen. :wink:

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 14:08
von messing
Hi Jan, hi Hubert, hi Tom
an Jan, bitte Link zu SLEPic, Danke. Schon gefunden. Gibts das auch mit deutschem Datum und Zahlenformat?
an Hubert wonach muß ich in der Wissensbasis suchen?
an Tom, Ob sich eine funktionierende Klasse daraus erzeugen läßt? Ich habs im Debugger bis zum INIT laufenlassen und konnte eindeutig das Objekt erkennen. Das heißt zwar nicht, das diese Klasse funktionieren würde, aber auch nicht, das es nicht funktionieren würde. Ich bin von der Vererbung ausgegangen und der Beschreibung Objekt im Objekt. Natürlich habe ich von Klassen keine Ahnung, das gebe ich offen zu, aber zum lernen wäre die Idee nicht schlecht.

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 14:12
von georg
Hallo, Tom -


manchmal liebe, manchmal hasse ich Deine kurzen, knappen, korrekten Antworten.

@messing: rein technisch ist die Ableitung möglich, aber GET ist eine Klasse für VIO bzw. Hybrid-Modus, während XbpSLE eigentlich für Hybrid- oder XbpDialog-Modus gedacht ist.

Ein offensichtliches Problem ist z.B. die Adressierung, während GET mit Zeile, Spalte operiert, verwendet XbpSLE eigentlich eine Pixel-Position zusammen mit einer Grössenangabe in Pixel.

Ableiten kannst Du eine solche Klasse schon, aber sie wird nicht richtig funktionieren.

SLEPic findest Du hier: http://www.gogalthorp.com/splash. Dort findest Du die SLEPic Version 1.88 mit Quellcode.


Gruss,

Georg

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 14:22
von messing
georg hat geschrieben:Hallo, Tom -


manchmal liebe, manchmal hasse ich Deine kurzen, knappen, korrekten Antworten.

@messing: rein technisch ist die Ableitung möglich, aber GET ist eine Klasse für VIO bzw. Hybrid-Modus, während XbpSLE eigentlich für Hybrid- oder XbpDialog-Modus gedacht ist.

Ein offensichtliches Problem ist z.B. die Adressierung, während GET mit Zeile, Spalte operiert, verwendet XbpSLE eigentlich eine Pixel-Position zusammen mit einer Grössenangabe in Pixel.

Ableiten kannst Du eine solche Klasse schon, aber sie wird nicht richtig funktionieren.

SLEPic findest Du hier: http://www.gogalthorp.com/splash. Dort findest Du die SLEPic Version 1.88 mit Quellcode.


Gruss,

Georg
Hi Georg
deine Antwort gibt Hoffnung ! :D !
Wenn man bei GET keine Pos. angibt, landet es bei 0,0
Fakt ist, das mit den paar Codezeilen, im Debugger eindeutig ein Objekt erkennbar ist, welches auch die PICTURE Bezeichnung enthält.
Betreffend der Koordinaten gebe ich zu, 0,0 bei GET bezieht sich auf oben links im CRT.

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 14:35
von georg
Hallo, messing -


der Compiler erzeugt einfach eine Kreuzung aus den beiden Objekten. Theoretisch geht das, ob das Objekt aber verwendbar ist, steht auf einem anderen Blatt.

Das dieses zusammengesetzte Objekt eindeutige Merkmale der beiden Eltern-Objekte besitzt, und diese auch im Debugger einzusehen ist, liegt an der Sprache.

Ein Compiler prüft auch nur die Übereinstimmung mit der Sprachsyntax, nicht aber den logischen Aufbau des Programmcodes.

Code: Alles auswählen

cFeld := "heute"
dFeld := Date()
IF cFeld = dFeld
wird vom Compiler problemlos übersetzt, wird aber beim IF in der Ausführung scheitern, obwohl beide Variablen doch die richtigen, zugewiesenen Werte (auch im Debugger) besitzen ...


Gruss,

Georg

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 14:49
von Tom
Fakt ist, das mit den paar Codezeilen, im Debugger eindeutig ein Objekt erkennbar ist, welches auch die PICTURE Bezeichnung enthält.
Wenn ein Laster mit einem PKW bei sehr hoher Geschwindigkeit zusammenstößt, entsteht daraus tatsächlich eine Limousine mit Ladefläche, also, wenn man so will, ein "best of two worlds". Tatsächlich dürfte es schwierig werden, mit dem neu entstandenen "Fahrzeug" Personen oder Last zu bewegen. Durch die Kollision entsteht nämlich vor allem sehr viel Schrott.

Klassen, die in eine gemeinsame, neue Klasse überführt werden, dürfen nicht interferieren, und sie sollten sich sinnvoll ergänzen. Außerdem ist Deine Denkweise nicht ganz richtig: Die Klassen werden nicht "gemischt" (Paarung eines Esels mit einer Taube - wir erhalten ein mausgraues, fliegendes Lasttier), was allerdings eine faszinierende Idee ist. Schau Dir mal die Klassenbeschreibung der XbpComboBox an. Die verweist auf die Superklassen XbpSLE und XbpListbox. Sie erzeugt zwei Objekte. Die abgeleitete Klasse sorgt dafür, dass die Objekte automatisch interagieren können, sich also ergänzen. Das dürfte sehr schwierig werden, wenn man ein XbpSLE und ein Get "verheiratet".

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 15:05
von messing
Hi Tom,

Wenn ein Laster mit einem PKW bei sehr hoher Geschwindigkeit zusammenstößt, entsteht daraus tatsächlich eine Limousine mit Ladefläche, also, wenn man so will, ein "best of two worlds". Tatsächlich dürfte es schwierig werden, mit dem neu entstandenen "Fahrzeug" Personen oder Last zu bewegen. Durch die Kollision entsteht nämlich vor allem sehr viel Schrott.

Ich lach mich scheckig :D :D .

Dein Vergleich hat mir die Tränen in die Augen getrieben! Vor Lachen ! :D Ich hab mir das mal bildlich vorgestellt. Limoousine mit Ladefläche !!! :D

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 15:16
von messing
Servus,
SLEPic verlangt Clickdate
was müßte ich abändern, da clickdate nicht benötigt wird.

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 15:24
von Tom
Clickdate ist doch dabei. Musst nix ändern.

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 15:39
von Jan
Ich habe clickdate und so einiges anders, was für mich überflüssig ist, rausgeschmissen.

Jan

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 16:31
von messing
Jan hat geschrieben:Ich habe clickdate und so einiges anders, was für mich überflüssig ist, rausgeschmissen.

Jan
Servus Jan,
Ich brauch nur die Formatierungsmöglichkeit.
Wenn du das soweit geändert hast, dann bitte ich um den Quellcode. Begründung: Wenn ich deine geänderte Version mit SLEPic vergleiche, fallen mir mit Sicherheit die Änderungen auf. Wäre eine Möglichkeit zu vergleichen wie sich das in der Klassenprogramierung auswirkt.

Re: Klassen Erstellung

Verfasst: Do, 29. Mär 2012 17:22
von brandelh
messing hat geschrieben:an Hubert wonach muß ich in der Wissensbasis suchen?
Author: BrandelH
HB_CLAS* .... aber ich habe es dir rausgesucht:

http://www.xbaseforum.de/viewtopic.php?f=16&t=499

Re: Klassen Erstellung

Verfasst: Fr, 30. Mär 2012 1:50
von messing
Hi Hubert,

Danke

Re: Klassen Erstellung

Verfasst: Sa, 31. Mär 2012 10:12
von AUGE_OHR
Tom hat geschrieben:Davon abgesehen glaube ich kaum, dass es gelingen wird, aus XbpSLE und Get eine funktionierende Klasse zu erzeugen. :wink:
ich "denke" es ist so was wie C:\ALASKA\XPPW32\Source\samples\solution\xbpget\xbpget.prg gemeint

Code: Alles auswählen

/*
 * XbpGet Klasse
 */
CLASS XbpGet FROM XbpSLE
...

CLASS InvisibleGet FROM Get
   EXPORTED:
   METHOD init
   METHOD display
ENDCLASS

METHOD InvisibleGet:Init( nRow, nCol, bVarBlock, cVarName, cPicture, ;
                          cColor, bValid, bWhen )
RETURN ::Sle:Init( bVarBlock, cVarName, cPicture, bValid, bWhen )

METHOD InvisibleGet:display()
RETURN self
da wird "auf" einem XbpSLE ein ( invisible ) GET erzeugt.

Re: Klassen Erstellung

Verfasst: Di, 24. Apr 2012 13:53
von messing
Servus an die Gemeinde,
jetzt mal was neues.
Ich hab hier mal was angesetzt, und wäre erfreut, wenn Ihr mir helft.
Stundenumrechnung mal als Klasse. lSchalter = .T. für Zeit 00:00:00 bzw. .F. als Stundenzahl

Code: Alles auswählen

   CLASS StdUmrechnung
     EXPORTED:                         
        VAR    cAnfang, cEnde , nAnfang, nEnde, cZeit, nZeit,;
               lSchalter
        METHOD  init, Zeit
   ENDCLASS

   METHOD StdUmrechnung:init( cAnfang, cEnde, lSchalter )
      ::cAnfang   := IIF( cAnfang == NIL, "00:00:00", cAnfang )
      ::cEnde     := IIF( cEnde == NIL, "00:00:00", cEnde )
      ::lSchalter := IIF( lSchalter == NIL, .T., lSchalter )
   RETURN self

   METHOD StdUmrechnung:Zeit
      LOCAL nAnfang, nEnde, nZeit
         if val(substr(::cAnfang,1,2)) = 0
            stuff(::cAnfang,1,0,"00")
         elseif val(substr(::cAnfang,4,2)) = 0
            stuff(::cAnfang,4,0,"00")
         elseif val(substr(::cAnfang,7,2)) = 0
            stuff(::cAnfang,7,0,"00")
         endif
         if Substr(::cAnfang,3,1) <> ":"
            stuff(::cAnfang,3,0,":")
         elseif substr(::cAnfang,6,1) <> ":"
            stuff(::cAnfang,6,0,":")
         endif
         nAnfang:=TimeToSec(::cAnfang)
         nEnde:=TimeToSec(::cEnde)
         nZeit:= nEnde - nAnfang
         if ::lSchalter = .T.
            ::cZeit:=SecToTime(Abs(nZeit))
         else
            ::cZeit:=str(abs(nZeit/60/60,8,2))
         endif
   RETURN self

      oTest1:=StdUmrechnung():new("05:00:00","15:30:00",.T.)
      oTest1:cAnfang:="08:00:00"
      oTest1:Zeit()
      Zeitdifferenz:=oTest1:cZeit
Was müßte ich jetzt noch berücksichtigen, wenn ich dieses Objekt für die Stundenberechnung mit einem SLE verknüpfe?
Und was müßte man allgemein ändern um diese Klasse auszubauen etc.
Ihr seid selber Schuld !!! :D Ihr habt mich nach Hannover gelockt, und ich hab "Blut geleckt"! :D
Und ja, daraus wird keine Limousine mit Ladefläche gemacht :D :D

Re: Klassen Erstellung

Verfasst: Di, 24. Apr 2012 23:28
von AUGE_OHR
messing hat geschrieben:Was müßte ich jetzt noch berücksichtigen, wenn ich dieses Objekt für die Stundenberechnung mit einem SLE verknüpfe?
Und was müßte man allgemein ändern um diese Klasse auszubauen etc.
hm ... das "validate" fehlt noch.
alles in ein SLE zu packen ist ja möglich ... ich hab nun 3 x SLE die aussehen wie 1 SLE ... ich finde es leichter zu handlen

p.s. Windows hat ja auch eine Time / Date Class. Den "Wrapper" und Demosource findest du auf dem USB Stick von der Devcon in meinem Vortrag.
messing hat geschrieben:Ihr seid selber Schuld !!! :D Ihr habt mich nach Hannover gelockt, und ich hab "Blut geleckt"! :D
Und ja, daraus wird keine Limousine mit Ladefläche gemacht :D :D
hehehe ... die "Seele" haben wir bekehrt.

Re: Klassen Erstellung

Verfasst: Mi, 25. Apr 2012 8:41
von messing
AUGE_OHR hat geschrieben:hm ... das "validate" fehlt noch.
alles in ein SLE zu packen ist ja möglich ... ich hab nun 3 x SLE die aussehen wie 1 SLE ... ich finde es leichter zu handlen

p.s. Windows hat ja auch eine Time / Date Class. Den "Wrapper" und Demosource findest du auf dem USB Stick von der Devcon in meinem Vortrag.
Hi Jimmy,
na gut Heim gekommen?

validate, hilf mal auf die sprünge.
Mit SLE verknüpfen meine ich eigentlich, Eingabe von zwei SLE mit versch, Zeiten, welche dann auf das Objekt zugreifen und somit in einem SLE oder Static die Differenz erscheint.
Ich hab erst mal damit angefangen, um den Aufbau der Klassen besser zu verstehen.

Re: Klassen Erstellung

Verfasst: Mi, 25. Apr 2012 9:55
von Jan
AUGE_OHR hat geschrieben:hehehe ... die "Seele" haben wir bekehrt.
Mich werdet Ihr nie bekommen! :roll: :lol:

Jan

Re: Klassen Erstellung

Verfasst: Mi, 25. Apr 2012 11:42
von messing
Jan hat geschrieben:
AUGE_OHR hat geschrieben:hehehe ... die "Seele" haben wir bekehrt.
Mich werdet Ihr nie bekommen! :roll: :lol:

Jan
Bekommen nicht ! :D bist ja schon dabei :lol:
Hilf mal nach =D>

Re: Klassen Erstellung

Verfasst: Mi, 25. Apr 2012 12:14
von Tom
Hallo, Bruno.

Eine wirklich zwingende Anwendung für eine Klasse ist das nicht - sondern eher ein Klassiker für eine UDF. Whatsoever.

Du müsstest vor dem Aufbau des Dialogs/der SLEs ein Klassenobjekt erzeugen - eines sollte genügen. Alle betroffenen SLEs bestückten dann beispielsweise im SetInputFocus-Slot die beiden iVars und aktualisierten das Anzeigestatic. Im KillInputFocus-Slot müsste dasselbe passieren. Wichtig wäre, dass die Statics auch wirklich nur von dort aktualisiert würden (SetCaption()).

Re: Klassen Erstellung

Verfasst: Mi, 25. Apr 2012 13:07
von messing
Tom hat geschrieben:Hallo, Bruno.

Eine wirklich zwingende Anwendung für eine Klasse ist das nicht - sondern eher ein Klassiker für eine UDF. Whatsoever.

Du müsstest vor dem Aufbau des Dialogs/der SLEs ein Klassenobjekt erzeugen - eines sollte genügen. Alle betroffenen SLEs bestückten dann beispielsweise im SetInputFocus-Slot die beiden iVars und aktualisierten das Anzeigestatic. Im KillInputFocus-Slot müsste dasselbe passieren. Wichtig wäre, dass die Statics auch wirklich nur von dort aktualisiert würden (SetCaption()).
Servus Tom,
hoffe Du bist gut Nach Haus gekommen.
Ja ist ein Klassiker, aber da ich genau weis, was der macht läßt sich das Klassenbeispiel damit gut nachvollziehen. Nach meinem neuesten Wissensstand, sind Klassen nichts anderes als eine Objektbeschreibung, wie was wo das Objekt machen soll bzw. darf. Noch fehlt es mir an der Umsetzungsmöglichkeit allgemein, deswegen frag ich ja an, was evtl. noch fehlt, worauf man noch achten muß.
Als Function liefert RETURN ... einen Wert zurück, im Objekt kann man auf den Wert solange zurückgreifen bis er geändert wurde. In der Func nicht. Die Frage wegen SLE bzw. Static, naja hab geschlafen, Objekt greift auf Objekt zu, SLE oder Static sind ja Objekte. Wie Du siehst, so langsam kommt mehr durch.

Re: Klassen Erstellung

Verfasst: Mi, 25. Apr 2012 13:26
von Martin Altmann
Moin Konstantin,
messing hat geschrieben:Als Function liefert RETURN ... einen Wert zurück, im Objekt kann man auf den Wert solange zurückgreifen bis er geändert wurde. In der Func nicht.
kleiner Hinweis am Rand: Wenn Du eine Variable in der Funktion oder Prozedur als STATIC deklarierst, dann merkt sie sich sehr wohl den Wert!
Beispiel:

Code: Alles auswählen

PROCEDURE AufrufNr()
STATIC nI := 0
? "Dies ist der " + ALLTRIM( STR( nI++ ) ) + ". Aufruf der Prozedur."
RETURN
Wenn Du das jetzt aufrufst, kommt jeweils die folgende Ausgabe auf den Bildschirm:

Code: Alles auswählen

AufrufNr() // -> Dies ist der 1. Aufruf der Prozedur.
AufrufNr() // -> Dies ist der 2. Aufruf der Prozedur.
AufrufNr() // -> Dies ist der 3. Aufruf der Prozedur.
AufrufNr() // -> Dies ist der 4. Aufruf der Prozedur.
Viele Grüße,
Martin