Unterstützung bei OOP

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Unterstützung bei OOP

Beitrag von Frank Grossheinrich »

Bruno,

das kann man so aus der Hüfte nicht mal schnell auf OOP umschreiben. Dafür weiß ich zu wenig von deinem Code und was sich in welchem Objekt befindet.

OOP mag man oder mag man nicht. Es gibt keine Pflicht OOP zu programmieren. Da gehen die Meinungen sehr weit auseinander. Es gibt meiner Meinung nach auch kein richtig oder falsch. Man kommt funktional/prozedural genau so weit wie mit OOP. Es ist einfach eine andere Art der Programmierung.

Wenn es interessiert: gib das in Google ein "oop site:doc.alaska-software.com"

Ich habe das nur angemerkt, da man für Xbase++ kein OOP können muss und du explizit um Unterstützung bei OOP gebeten hast. Klassenfunktionen und Methoden gab es bereits bei Clipper.

Wenn dein Code funktioniert und das tut, was er soll, ist das guter Code (meistens jedenfalls). Obwohl mich fast wundert, wenn der gezeigte Code funktionieren würde. Denn einfach eine neue :caption zuzuweisen, zeigt in aller Regel noch nix Neues an. Dafür gibt es eigentlich die Methode :setCaption() oder man muss die Instanz durch den Lebenszyklus jagen und :configure() aufrufen.

Gruß
Frank
We love Xbase++, and you?
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Unterstützung bei OOP

Beitrag von Bruno »

Hi Frank,
das ändern der Caption hat eigentlich nur einen Grund, wie bekomme ich warum die Caption als Anzeige in die Statusbar. Rein zum experimentellen Umgang mit Objekten, so lerne ich am schnellsten AHA. Diese kleine Funktion gibt bei genauem Betrachten einen Teil der Möglichkeiten wieder. Stück für Stück kommt man sich näher, Jimmy hat ja schon die Methode kurz erklärt, genau das worauf ich raus wollte, nur das ich den Vergleich ncht mehr brauche, versteh ich noch nicht.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Unterstützung bei OOP

Beitrag von brandelh »

Bruno hat geschrieben: Fr, 05. Mai 2023 11:29 Hi Jan,
ich möchte auch mal mäkeln, :D , Im Forenbanner steht " Xbase-Forum " , " Xbase-Welt " , " Xbase-Entwickler " ! :D
Da fehlt überall das " ++ " :evil4: :evil4: :evil4:
Ich hoffe ihr versteht einen kleinen Spass ! :D
wir sind ja auch NICHT das offizielle und ausschließliche Alaska Xbase++ Forum [-X

Aber Alaska legt zurecht Wert auf die richtige Schreibweise deren Kompilers
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Unterstützung bei OOP

Beitrag von Jan »

Bruo,

krieg Dich doch mal wieder ein. Ich hatte Dir geschrieben, wie Xbase++ korrekt geschrieben wird. Du hattest dann noch mal nachgefragt ob mit großem B oder nicht - obwohl ich das ja schon alles geschrieben hatte. Also habe ich als Beispiel auf das Forenbanner hingwiesen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Unterstützung bei OOP

Beitrag von Bruno »

Jan hat geschrieben: Sa, 06. Mai 2023 22:55 Bruo,

krieg Dich doch mal wieder ein. Ich hatte Dir geschrieben, wie Xbase++ korrekt geschrieben wird. Du hattest dann noch mal nachgefragt ob mit großem B oder nicht - obwohl ich das ja schon alles geschrieben hatte. Also habe ich als Beispiel auf das Forenbanner hingwiesen.

Jan
Hi Jan, hast Du den letzten Satz übersehen?
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Unterstützung bei OOP

Beitrag von AUGE_OHR »

hi Frank,
Frank Grossheinrich hat geschrieben: Fr, 05. Mai 2023 12:00 Obwohl mich fast wundert, wenn der gezeigte Code funktionieren würde. Denn einfach eine neue :caption zuzuweisen, zeigt in aller Regel noch nix Neues an. Dafür gibt es eigentlich die Methode :setCaption() oder man muss die Instanz durch den Lebenszyklus jagen und :configure() aufrufen.
wieso soll die Syntax falsch sein :?:

Code: Alles auswählen

METHOD AenderCaption(cNeuCaption)
   ::Status:Caption := cNeuCaption
RETURN self
dasgehtso.jpg
dasgehtso.jpg (26.35 KiB) 2097 mal betrachtet
probiere mal das (ENDE klicken) :!:

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"

#include "DLL.CH"
#include "NLS.ch"

PROCEDURE APPSYS
LOCAL cTitle  := "DispoEingabe"
LOCAL hWndDlg := DllCall( "User32.dll", DLL_STDCALL, "FindWindowA", 0, cTitle )
   IF !( hWndDlg == 0 )
      DllCall( "User32.dll", DLL_STDCALL, "SetForegroundWindow", hWndDlg )
      DllCall( "User32.dll", DLL_STDCALL, "BringWindowToTop", hWndDlg )
      DllCall( "User32.dll", DLL_STDCALL, "ShowWindow", hWndDlg, 1 )
      DllCall( "User32.dll", DLL_STDCALL, "UpdateWindow", hWndDlg )
      *** It is a second instance....  Bye Bye
      QUIT
   ENDIF
RETURN

******************************************************************************
* Main procedure to test a form
******************************************************************************
PROCEDURE Main
LOCAL nEvent, oXbp, mp1, mp2
LOCAL oDlg

   SET EXCLUSIVE OFF                                                  // Netzwerk SHARE

   SET EPOCH TO YEAR( DATE() ) - 50
   SET CENTURY OFF
   SET DATE GERMAN
   SETLOCALE( NLS_ICURRENCYEURO, "1" )
   SETLOCALE( NLS_SCURRENCY, CHR( 213 ) )

   oDlg := DispoEingabe():New():Create()

   oDlg:Button1:activate := {|| MsgBox("Hello 1") }
   oDlg:Button2:activate := {|| MsgBox("Hello 2") }
   oDlg:Button3:activate := {|| MsgBox("Hello 3") }
   oDlg:Button4:activate := {|| oDlg:AenderCaption("hallo Frank") }

   oDlg:AenderCaption("das geht oder nicht")

   nEvent := xbe_None
   WHILE nEvent != xbeP_Close
      nEvent := AppEvent ( @mp1, @mp2, @oXbp )
      oXbp:HandleEvent ( nEvent, mp1, mp2 )
      IF nEvent == xbeP_Quit
         QUIT   // AppQuit()
      ENDIF
   ENDDO

RETURN

******************************************************************************
* This class is derived from the implementation-level class of the form.
* Instance variables are declared in the _DispoEingabe class.
******************************************************************************
CLASS DispoEingabe FROM _DispoEingabe
   EXPORTED:
      METHOD init
      METHOD create
      METHOD AenderCaption()
ENDCLASS

******************************************************************************
* Initialize form
******************************************************************************
METHOD DispoEingabe:init( oParent, oOwner, aPos, aSize, aPP, lVisible )

   * Execute method of the super class
   ::_DispoEingabe:init( oParent, oOwner, aPos, aSize, aPP, lVisible )

RETURN self


******************************************************************************
* Request system resources
******************************************************************************
METHOD DispoEingabe:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   * Execute method of the super class
   ::_DispoEingabe:create( oParent, oOwner, aPos, aSize, aPP, lVisible )


   * Display the form
   ::show()

RETURN self

METHOD AenderCaption(cNeuCaption)
   ::Status:Caption := cNeuCaption
RETURN self

* Include program code for the implementation-level class of the form
#include "_DISPOEINGABE.PRG"

//EOF

Code: Alles auswählen

#ifndef _DISPOEINGABE_
#define _DISPOEINGABE_

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"

#PRAGMA LIBRARY( "ascom10.lib" )

CLASS _DispoEingabe FROM XbpDialog
   EXPORTED:
      VAR editControls

      * Contained control elements
      VAR Button2
      VAR Button4
      VAR Button1
      VAR Status 
      VAR Button3

      METHOD init
      METHOD create
ENDCLASS

******************************************************************************
* Initialize form
******************************************************************************
METHOD _DispoEingabe:init( oParent, oOwner, aPos, aSize, aPP, lVisible )


   DEFAULT oParent  TO AppDesktop(), ;
           aPos     TO {-4,550}, ;
           lVisible TO .F. , ;
           aPP      TO {}

   AAdd ( aPP, { XBP_PP_BGCLR, GRA_CLR_DARKCYAN } )
   AAdd ( aPP, { XBP_PP_FGCLR, GRA_CLR_BLACK } )
   AAdd ( aPP, { XBP_PP_COMPOUNDNAME, "24.Arial" } )
   
   IF Empty(aSize) == .T.
      IF IsMemberVar(self,"ClientSize") == .T.
         aSize := {0,0}
      ELSE
         aSize := {441,527}
      ENDIF
   ENDIF
   
   ::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   IF aSize[1] == 0 .AND. aSize[2] == 0
      ::XbpDialog:ClientSize := {425,488}
   ENDIF
   ::XbpDialog:drawingArea:ColorBG := GRA_CLR_DARKCYAN  
   ::XbpDialog:taskList := .T.
   ::XbpDialog:title := "DispoEingabe"

   ::editControls := {}

   ::Button2 := XbpPushButton():new( ::drawingArea, , {56,160}, {300,120}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::Button2:caption := "EINGABE"
   ::Button2:tabStop := .T.
   ::Button2:activate := {|| NIL }

   ::Button4 := XbpPushButton():new( ::drawingArea, , {284,8}, {132,60}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::Button4:caption := "ENDE"
   ::Button4:tabStop := .T.
   ::Button4:activate := {|| NIL }

   ::Button1 := XbpPushButton():new( ::drawingArea, , {56,300}, {300,120}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::Button1:caption := "DISPOLISTE"
   ::Button1:tabStop := .T.
   ::Button1:activate := {|| NIL }

   ::Status  := XbpStatusBar():new( ::drawingArea, , {12,440}, {400,40} )

   ::Button3 := XbpPushButton():new( ::drawingArea, , {56,80}, {300,60}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::Button3:caption := "Daten bertragen"
   ::Button3:tabStop := .T.
   ::Button3:activate := {|| NIL }

RETURN self


******************************************************************************
* Request system resources
******************************************************************************
METHOD _DispoEingabe:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::Button2:create()

   ::Button4:create()

   ::Button1:create()

   ::Status:create()
   ::Status:Caption := "Arbeitsjahr:"

   ::Button3:create()


RETURN self

#endif

//EOF
/////
gruss by OHR
Jimmy
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Unterstützung bei OOP

Beitrag von Bruno »

AUGE_OHR hat geschrieben: So, 07. Mai 2023 20:47

Code: Alles auswählen

   IF !( hWndDlg == 0 )
      DllCall( "User32.dll", DLL_STDCALL, "SetForegroundWindow", hWndDlg )
      DllCall( "User32.dll", DLL_STDCALL, "BringWindowToTop", hWndDlg )
      DllCall( "User32.dll", DLL_STDCALL, "ShowWindow", hWndDlg, 1 )
      DllCall( "User32.dll", DLL_STDCALL, "UpdateWindow", hWndDlg )
      *** It is a second instance....  Bye Bye
      QUIT
   ENDIF
Hi Jimmy,
nur mit diesem DllCall ???
Für was werden diese benötigt ?
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Unterstützung bei OOP

Beitrag von AUGE_OHR »

hi Bruno.
Bruno hat geschrieben: Do, 11. Mai 2023 5:48 nur mit diesem DllCall ???
Für was werden diese benötigt ?
die DLL Aufrufe sind um zu "prüfen" ob eine App bzw. Fenster schon läuft, deshalb am Anfang der AppSys

Code: Alles auswählen

hWndDlg := FindWindowEx(,,, cTitle )
IF !( hWndDlg == 0 )
sucht nach einem "Fenster" was den Title hat

SetForegroundWindow
https://learn.microsoft.com/de-de/windo ... oundwindow

BringWindowToTop
https://learn.microsoft.com/de-de/windo ... indowtotop

ShowWindow
https://learn.microsoft.com/de-de/windo ... showwindow

UpdateWindow
https://learn.microsoft.com/de-de/windo ... datewindow

es funktioniert auch wenn das Fenster / App "minimiert" wurde das es "nach vorne" geholt wird
gruss by OHR
Jimmy
Antworten