XbpParts.prg
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 128
- Registriert: Mi, 26. Okt 2005 18:41
- Wohnort: Berlin
- Kontaktdaten:
XbpParts.prg
Hallo,
der Versuch die Klasse
CLASS XbpPushButton FROM XbpBasePushButton
durch einbindung von XbpParts.prg zu redefinieren, führt zu einem Fehler beim Linken. Die Fehlermeldung sagt, die Klasse XbpPushButton sei schon definiert und der Linker weigert sich - jedenfalls mit den üblichen Schaltern - die App zusammenzulinken.
Aber wie nutzt man denn nun die Eigenschaft, dass die Standard-Xbp´s von den entsprechenden XbpBase-Klassen abgeleitet werden, für Redefinitionen, bzw Erweiterungen der Originalklasse? Was ich nicht möchte ist die Klasse umzubenennen, d.h. die redefinierte Klasse muß in jedem Fall so heißen wie die Original Xbase-Klasse.
Wenn dies nicht möglich Sein sollte, dann interessiert mich der Sinn und Zweck der Einführung einer zwischengeschalteten zusätzlichen XbpBase-Klasse in 331?
Gruß
Olaf870
der Versuch die Klasse
CLASS XbpPushButton FROM XbpBasePushButton
durch einbindung von XbpParts.prg zu redefinieren, führt zu einem Fehler beim Linken. Die Fehlermeldung sagt, die Klasse XbpPushButton sei schon definiert und der Linker weigert sich - jedenfalls mit den üblichen Schaltern - die App zusammenzulinken.
Aber wie nutzt man denn nun die Eigenschaft, dass die Standard-Xbp´s von den entsprechenden XbpBase-Klassen abgeleitet werden, für Redefinitionen, bzw Erweiterungen der Originalklasse? Was ich nicht möchte ist die Klasse umzubenennen, d.h. die redefinierte Klasse muß in jedem Fall so heißen wie die Original Xbase-Klasse.
Wenn dies nicht möglich Sein sollte, dann interessiert mich der Sinn und Zweck der Einführung einer zwischengeschalteten zusätzlichen XbpBase-Klasse in 331?
Gruß
Olaf870
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Olaf.
Und was geschieht, wenn Du die zwei Zeilen Klassendefinition für XbpPushButton aus XbpParts.PRG einfach auskommentierst? Ich meine, ich verstehe den Linker - es gibt zwei gleichlautende Klassendefinition, which one shall I take? Ansonsten, siehe Rogers Code: Gerade beim Einsatz von Drittbibliotheken halte ich es für gefährlich, eine Standardklasse zu überschreiben. Eleganter (aber sicher auch mühevoller) ist die Schaffung einer neuen Klasse OBXbpPushButton.
Edit: Verstehe ich richtig, Du versuchst, XbpParts.PRG zusätzlich zu linken? Meiner Meinung nach geschieht das ohnehin automatisch.
Und was geschieht, wenn Du die zwei Zeilen Klassendefinition für XbpPushButton aus XbpParts.PRG einfach auskommentierst? Ich meine, ich verstehe den Linker - es gibt zwei gleichlautende Klassendefinition, which one shall I take? Ansonsten, siehe Rogers Code: Gerade beim Einsatz von Drittbibliotheken halte ich es für gefährlich, eine Standardklasse zu überschreiben. Eleganter (aber sicher auch mühevoller) ist die Schaffung einer neuen Klasse OBXbpPushButton.
Edit: Verstehe ich richtig, Du versuchst, XbpParts.PRG zusätzlich zu linken? Meiner Meinung nach geschieht das ohnehin automatisch.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Tom,
so wie ich Olaf verstehe, will er XbpParts.prg direkt einbinden um dort eigene Eigenschaften unterzubringen. Genauso wie man AppSys.PRG oder DBESys.PRG nutzt. Allerdings wird eine local definierte Funktion immer der aus der DLL Datei vorgezogen, ob dies auch bei Klassen ist, weiß ich nicht.
so wie ich Olaf verstehe, will er XbpParts.prg direkt einbinden um dort eigene Eigenschaften unterzubringen. Genauso wie man AppSys.PRG oder DBESys.PRG nutzt. Allerdings wird eine local definierte Funktion immer der aus der DLL Datei vorgezogen, ob dies auch bei Klassen ist, weiß ich nicht.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 128
- Registriert: Mi, 26. Okt 2005 18:41
- Wohnort: Berlin
- Kontaktdaten:
Tom:
XbpParts.obj ist in der Tat schon in einer Xbase-Standard-dll eingelinkt. Wenn nicht, dann wäre es einfacher.
Aber welchen Sinn hat XbpParts.prg, wenn man es nicht verwenden kann?
Gruß
Olaf870
Aber darum geht es gerade: Damit auch Drittbibliotheken in den Genuß der neuen Klasse kommen, muß die Klasse gleich heißen.Gerade beim Einsatz von Drittbibliotheken halte ich es für gefährlich, eine Standardklasse zu überschreiben.
XbpParts.obj ist in der Tat schon in einer Xbase-Standard-dll eingelinkt. Wenn nicht, dann wäre es einfacher.
Aber welchen Sinn hat XbpParts.prg, wenn man es nicht verwenden kann?
Gruß
Olaf870
-
- Rekursionen-Architekt
- Beiträge: 128
- Registriert: Mi, 26. Okt 2005 18:41
- Wohnort: Berlin
- Kontaktdaten:
Hallo Andreas,
ich kann da meist nicht viel Informatives oder Neues erkennen.
Auszug XbpParts.prg:
Wäre doch gut, wenn man seine alten Xbase-Programme durch Redefinition der Xbase-Klassen mal schnell und wirkungsvoll anpassen könnte?
Gruß Olaf870
ich kann da meist nicht viel Informatives oder Neues erkennen.
Auszug XbpParts.prg:
Code: Alles auswählen
//////////////////////////////////////////////////////////////////////
/// <summary>
/// <para>
/// Deklaration der Klasse "XbpCombobox"
/// </para>
/// </summary>
//////////////////////////////////////////////////////////////////////
CLASS XbpCombobox FROM XbpBaseCombobox
ENDCLASS
//////////////////////////////////////////////////////////////////////
/// <summary>
/// <para>
/// Deklaration der Klasse "XbpListBox"
/// </para>
/// </summary>
//////////////////////////////////////////////////////////////////////
CLASS XbpListBox FROM XbpBaseListBox
ENDCLASS
Gruß Olaf870
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
egal was jetzt geht, die Lage der PRG (SYS Verzeichnis), der recht dürftige Inhalt der Implementierungen (verweisen meist auf die Basisklasse) läst nur den Schluss zu, dass genau wie bei APPSYS und DBESYS ein Ersatz/ eine Änderung des Origialcodes in der DLL möglich sein soll.
Alles andere macht aus meiner Sicht keinen Sinn.
egal was jetzt geht, die Lage der PRG (SYS Verzeichnis), der recht dürftige Inhalt der Implementierungen (verweisen meist auf die Basisklasse) läst nur den Schluss zu, dass genau wie bei APPSYS und DBESYS ein Ersatz/ eine Änderung des Origialcodes in der DLL möglich sein soll.
Alles andere macht aus meiner Sicht keinen Sinn.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: XbpParts.prg
hi,
in der STD.CH reicht doch aus um alle "XbpPushButton" auf "MyButton"
"umzuleiten"
aussieht ...)
gruss by OHR
Jimmy
wieso ? ein einfaches :olaf870 hat geschrieben: Was ich nicht möchte ist die Klasse umzubenennen, d.h. die redefinierte
Klasse muß in jedem Fall so heißen wie die Original Xbase-Klasse.
Code: Alles auswählen
#define XbpPushbutton MyButton
"umzuleiten"
hm, tja ... darf man das ... (wenn der Pushbutton nicht mehr wie einerolaf870 hat geschrieben: Damit auch Drittbibliotheken in den Genuß der neuen Klasse kommen, muß die Klasse gleich heißen.
aussieht ...)
gruss by OHR
Jimmy
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Hi,
ich kann den Ansatz von Olaf durchaus verstehen. Ich benutze Express und wollte schon immer mal bei Roger nachfragen, ob er nicht einen "Zwischenschritt" (eine Ableitung) zwischen seinen Klassen und den Originalklassen anbieten könnte:
Dann könnte man in MyXbpCombobox die eigenen Anpassungen vornehmen. Genau das wäre jetzt über XbpParts.prg theoretisch möglich (solange es kein Problem gibt weil evtl. das original XbpParts.prg schon in die Express-DLL eingelinkt ist...).
Natürlich darf man keine Änderungen vornehmen, die das System des Third-Party-Anbieters stören...
ich kann den Ansatz von Olaf durchaus verstehen. Ich benutze Express und wollte schon immer mal bei Roger nachfragen, ob er nicht einen "Zwischenschritt" (eine Ableitung) zwischen seinen Klassen und den Originalklassen anbieten könnte:
Code: Alles auswählen
CLASS DCXbpCombobox FROM MyXbpCombobox
ENDCLASS
CLASS MyXbpCombobox FROM XbpCombobox
ENDCLASS
Natürlich darf man keine Änderungen vornehmen, die das System des Third-Party-Anbieters stören...
Gruß
Markus
Mitglied der XUG Saarland-Pfalz
Markus
Mitglied der XUG Saarland-Pfalz
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
-
- Rekursionen-Architekt
- Beiträge: 128
- Registriert: Mi, 26. Okt 2005 18:41
- Wohnort: Berlin
- Kontaktdaten:
Hallo Allerseits,
Andreas von Alaska hat geantwortet. Bei ihm geht es. Und bei mir jetzt auch. Anscheindend lag es am Linker: Er kommt manchmal mit alten DEF und/oder EXP-Dateien nicht zurecht, bzw. baut sie nicht neu.
Also:
Xbpparts.PRG verändern und einlinken, dann DEF und EXP-Dateien löschen.
Für Markus und andere DC-Anwender: Xbparts.OBJ auch in DCLIPX.XPJ einlinken, dann geht z.B. folgendes:
Xbparts.prg:
test.prg
Also: XbpParts ist doch nicht so nutz- und sinnlos. So hat man nun also doch die Möglichkeit, das ein bischen statisch daherkommende (aber recht gute) DC-System etwas aufzustylen. Andreas rät zwar davon ab, da was zu ändern. Aber gegen so ein paar winzige Kleinigkeiten ist sicher nichts einzuwenden.
Gruß
Olaf870
Andreas von Alaska hat geantwortet. Bei ihm geht es. Und bei mir jetzt auch. Anscheindend lag es am Linker: Er kommt manchmal mit alten DEF und/oder EXP-Dateien nicht zurecht, bzw. baut sie nicht neu.
Also:
Xbpparts.PRG verändern und einlinken, dann DEF und EXP-Dateien löschen.
Für Markus und andere DC-Anwender: Xbparts.OBJ auch in DCLIPX.XPJ einlinken, dann geht z.B. folgendes:
Xbparts.prg:
Code: Alles auswählen
#include "font.ch"
#include "common.ch"
#include "gra.ch"
CLASS XbpPushButton FROM XbpBasePushButton
EXPORTED:
INLINE METHOD SetCaptionClr(cCaption, nClr, cFont)
LOCAL oBmp, oPS, aBox, oFont, xSize, ySize, xPos, yPos
DEFAULT cFont TO FONT_TIMES_MEDIUM
DEFAULT lAlign TO .F.
DEFAULT nClr TO GRA_CLR_CYAN
oPS := ::LockPS()
oBmp := XbpBitmap():New(oPS):Create()
aBox := GraQueryTextBox(oPS, cCaption)
oBmp:Make(::Currentsize()[1], ::Currentsize()[2])
oBmp:PresSpace(oPS)
GraSetColor(oPS, nClr)
xSize := aBox[4, 1] - aBox[2, 1]
ySize := aBox[3, 2] - aBox[2, 2]
xPos := (::currentSize()[1] - xSize) / 2
yPos := (::currentSize()[2] - ySize) / 2
oFont := XbpFont():new(oPs)
oFont:create(cFont)
GraSetFont(oPs, oFont)
GraStringAt(oPS, {xPos, yPos}, cCaption)
oBmp:PresSpace( )
::UnlockPS()
oBmp:transparentClr := oBmp:GetDefaultBgColor()
::Caption := oBmp
::Configure()
RETURN self
ENDCLASS
Code: Alles auswählen
PROC TEST
LOCAL oPushBlue6W, oPushRed2W
@ 7, 45 DCPUSHBUTTON CAPTION '+6W' ;
SIZE 4, 1.2 ;
OBJECT oPushBlue6W;
TOOLTIP 'Wiedervorlage in 42 Tagen' ;
FANCY ;
ACTION { || NIL} ;
@ 7, 49 + DCPUSHBUTTON CAPTION '+2W' ; //
SIZE 4, 1.2 ;
OBJECT oPushRed2W;
TOOLTIP 'Wiedervorlage in 2 Wochen' ;
FANCY ;
ACTION { || NIL } ;
DCREAD GUI ;
EVAL { | o | ;
, oPushBlue6W:SetCaptionClr( "Hal" ), GRA_CLR_BLUE );
, oPushRed2W:SetCaptionClr( "lo" ), GRA_CLR_RED, );
};
RETURN
Gruß
Olaf870
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland