xbpBrowse() Aufbau, aber wie?

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

xbpBrowse() Aufbau, aber wie?

Beitrag von Manfred »

Hi,

ich stehe mal wieder vor einem Scherbenhaufen. Ich habe jetzt alles durchgelesen, was über XXXBrowse hier steht, komme aber überhaupt nicht weiter. Ich baue mir gerade ein Testprg zusammen, in dem ich mir nach und nach ein XbpBrowse zusammensetze, mit dem ich später einmal alles möglich machen kann und anhand dessen ich die Sache irgendwie versuche zu verstehen. Aber irgendwie ist die Mauer so hoch und lang, das es scheint, als gäbe es kein Drüberkommen.

Ich habe jetzt den Standard, dass das XbpBrowse mir eine Tabelle anzeigt. Prima. XbpBrowse() kann alles, was ein XbpQuickbrowse() kann. Wie komme ich weiter, was muß ich lesen um überhaupt zu verstehen, was ich jetzt wie einbaue? Ich möchte gerne eine Eingabezeile haben, in der ich zeichenweise direkt suchen kann, so wie in qbrowse2. Kriege ich nicht hin -> weil keine Ahnung was ich tun muß. Dann habe ich gelesen, das es :colorBlock gibt - > klappt nicht, weil unbekannt.

Ich weiß überhaupt nicht wie ich es anfassen soll.

Woher wißt ihr das alles? Nur nachgelesen? Super kombiniert? Es ist echt frustrierend.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

Dir scheint nicht ganz klar zu sein, daß ein XbpBrowse aus mehreren Objekten besteht, nämlich aus XbpColumn-Objekten, die wiederum aus :heading-, :dataarea- und :footing-Objekten zusammengesetzt sind. Diese wiederum sind XbpCell-Group-Objekte. Die :colorBlock-Instanz steht nur dem Column-Objekt zur Verfügung, nicht dem XbpBrowse selbst. Wenn Du mit AddColumn() eine neue Spalte erstellst, kann das zurückgereichte Column-Objekt einen colorBlock bekommen, und nur dann. XbpBrowse kennt diese iVar nicht.

Ich kann mich wieder nur Wolfgangs Vorschlag anschließen. Roger Donnays eXPress++ läßt einen sehr leicht zum Beispiel komplexe Browses bauen, und er übernimmt für Dich solche Verständnisgeschichten. Nach und nach kann man aber im Feinbereich mit den auch auf diese Art entstehenden Objekten arbeiten und verstehen, wie sie aufgebaut sind. Ein Browse entsteht bei Roger so:

Code: Alles auswählen

@ 1,1 DCBROWSE oBrowse ALIAS "MyData" SIZE 100,25 DATALINK {||MyBrowseEdit(oBrowse)}
DCBROWSECOL FIELD name HEADER "Name" WIDTH 15 PARENT oBrowse COLOR {|x|MyColor(x)}
usw.

FUNCTION MyColor(x)
IF x == "Müller"
  RETURN {GRA_CLR_WHITE,GRA_CLR_BLUE}
ENDIF
RETURN {GRA_CLR_BLACK,GRA_CLR_WHITE}
(nur ein Beispiel)
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

mir ist schon klar, das mehrere Objekte im Spiel sind, auch bein anderen Klassen. Ich tue mich schwer damit zu kapieren, wie die zusammengbaut und dann gesteuert werden. Wann was wie an wen übergeben oder abgefragt werden soll/muß.

Ich weiß nicht ob es so ratsam ist immer wieder Zusatztools zu benutzen um irgendwas einfacher programmieren zu können, mir geht es in allererster Linie darum die Dinge zu verstehen und da habe ich Bedenken, dass es über den Umweg mit Tools besser laufen soll.
Es gibt viele Zustztools, die man benutzen kann, die aber auch Geld kosten, das ich zur Zeit nicht dafür übrig habe. Außerdem hat mir die Vergangenheit gezeigt, dass es dass nicht ist. Ich habe mir immer mal einige Dinge dazugekauft und dann aber feststellen müssen, dass trotzdem das entsprechende Wissen fehlte und das möchte ich mir auf jeden Fall aneignen, indem ich halt versuche mir alles nach und nach aufzubauen und zu verstehen.
Ich weiß, dass alles eigentlich eine Sache von Containern ist, in die wiederum andere Container gepackt werden, aber immer der Reihe nach. Nur habe ich noch diverse Probleme damit, ab wann ich was aus welchem Container ansprechen, oder benutzen kann.

Habe ich denn die Anleitung zu Xbase++ so schlecht gelesen?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von brandelh »

Hallo Manfred,

für dein SLE , das als Suchbegriff aktiv im Browser sucht und positioniert, brauchst du dringend Object code, sonst kommst du nicht weiter.

oSuchSle nennen wir mal das SLE, das oberhalb deines Browsers liegt.
oBrowser nennen wir den Browser

beides einfach mit dem XppFD übereinander basteln und die Namen schön benennen.

Nun mußt du im oSuchSle:keyboard slot oder Methode eine Funktion hinterlegen, die bei jedem Tastendruck (falls du das wünschst) aufgerufen wird, daher im Keyboardblock.

Diese Funktion muß nun einen Suchbefehl in deinem Browser ausführen, habe ich jetzt zwar kein Beispiel es gibt verschiedene Möglichkeiten.
Zum Positionieren (ohne Filtern) würde ich versuchen mit dbseek und dblocate REST den richtigen Satz zu finden (es muß schnell gehen sonst will das keiner ...) und dann mit oBrowser:refreshAll() einen neuaufbau zu erzwingen. Je nach Datei kann das schnell oder langsam sein, aber wenn man sucht ist der Neuaufbau eh zu erwarten ...

So ähnlich habe ich es damals auch unter Clipper mit Tbrowse gemacht.
Man könnte natürlich auch im Browser skippen und die Inhalte vergleichen, aber dblocate ist wesentlich schneller !
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

das denke ich auch so.

Wenn ich z.B. ein oSLE baue, dann muß ich ja etwas haben, über das ich das SLE legen kann. Das ist ja dann in dem Fall das oBrowse. Das habe ich auch so gemacht. In den Qbrowse2 klappt das sofort. Bei meinem XbpBrowse wird es aber nicht angezeigt. Da hapert es ja schon. Irgendwo habe ich noch einen Knoten in der Leitung.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Code bitte (wenn nicht zu viel...)

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

Du hast ja Recht....

Das ist jetzt erstmal das Grundgerüst, das läuft. Hier experimentiere ich mit und schreibe dahinter, was zu welchem Ergebnis führt.

Code: Alles auswählen

*
*
*
* TEstumgebung für XbpBrowse mit dem versuch alle Schikanen einzubauen
********************************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "gra.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
********************************************************************************
PROCEDURE AppSys
          RETURN
********************************************************************************
PROCEDURE main()
          LOCAL cField
          LOCAL mp1, mp2
          LOCAL nI
          LOCAL nEvent := 0
          LOCAL oXbp, oBrowse, oSle

          DbUseArea(.T.,"DBFCDX","\videoneu\datenbanken\vo\titel")
          IF ! FILE("\videoneu\datenbanken\vo\titelxbpbrowse.cdx")
             OrdCreate("\videoneu\datenbanken\vo\titelxbpbrowse","titel","UPPER(bez)")
          ELSE
             OrdListAdd("\videoneu\datenbanken\vo\titelxbpbrowse")
          ENDIF

          //Dialogfenster erzeugen
          oXbp := GuiStdDialog( "Standard GUI Browser für DBF")

          //Browser im Fenster erzeugen
          oBrowse := GuiBrowseDb( oXbp:drawingArea )

          // Spalten für alle Felder anfangen
          FOR nI := 1 TO FCount()
              cField := FieldName( nI )
              oBrowse:addColumn( FieldBlock ( cField ), , cField )
          NEXT

          // Der Browser füllt nach :resize() immer das Fenster aus
          oXbp:drawingArea:resize := { |mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
          oXbp:show()                                                           // jetzt wird erst angezeigt
          oBrowse:show()                                                        // da bei Erzeugung lVisible := .F. war
          SetAppFocus( oBrowse )

          DO WHILE nEvent <> xbeP_Close
             nEvent := AppEvent( @mp1, @mp2, @oXbp )
             oXbp:handleEvent( nEvent, mp1, mp2 )
          ENDDO
          RETURN
********************************************************************************
FUNCTION GuiBrowseDb(oParent,aPos,aSize)
         LOCAL aPresParm
         LOCAL lVisible := .F.
         LOCAL oOwner

         LOCAL oBrowse

         oBrowse              := XbpBrowse():new( oParent, oOwner, aPos, aSize, aPresParm, lVisible)
         oBrowse:adjustHeight := .T.                                            // damit die letzte zeile auch sichtbar wird
         oBrowse:cursorMode   := XBPBRW_CURSOR_ROW                              // die ganze Zeile als Cursor
         oBrowse:softTrack    := .F.                                            // damit das Scrollen weich und sofort klappt
         oBrowse:create()

         // Navigationscodeblöcke für den Browser
         oBrowse:skipBlock     := {|n| DbSkipper(n) }                           // skipped vorwärts, oder rückwärts
         oBrowse:goTopBlock    := {| | DbGoTop()    }
         oBrowse:goBottomBlock := {| | DbGoBottom() }
         oBrowse:phyPosBlock   := {| | Recno()      }

         // Navigationscodeblöcke für den vertikalen Scrollbar
         oBrowse:posBlock      := {| | DbPosition()    }
         oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
         oBrowse:lastPosBlock  := {| | 100             }
         oBrowse:firstPosBlock := {| | 0               }

         RETURN oBrowse
********************************************************************************
FUNCTION GuiStdDialog( cTitle )                                                 // das gibt das fertige Objekt zurück (aha!)
         LOCAL aPos      := {100,100}                                           // Startpostion des Fensters auf dem Parentbildschirm
         LOCAL aPresParm := {}                                                  // Presentations Parameter für den XbasePart
         LOCAL aSize     := {1024,768}                                          // Größe des Fensters auf dem Parentbildschirm

         LOCAL lVisible  := .F.                                                 // bestimmt, ob der XbpDialog nach Aufruf von create() sichtbar ist

         LOCAL oDlg
         LOCAL oOwner
         LOCAL oParent

         DEFAULT cTitle TO "Standard Dialog Fenster"                            // wenn kein Parameter mitgegeben werden würde

         oDlg          := XbpDialog():new(oParent,oOwner,aPos,aSize,aPresParm,lVisible)
         oDlg:icon     := 1                                                     // dieses Icon ist nachher oben links sichtbar!?
         oDlg:tasklist := .T.                                                   // bei .F. fehlen oben rechts die Button und der Rahmen
         oDlg:title    := cTitle                                                // Überschriftentext oben im Kopf
         oDlg:create()                                                          // Objekt wird erzeugt
//         CenterControl(oDlg)                                                    // zentriert am Bildschirm
         oDlg:drawingArea:setFontCompoundName( "8.Helv")                        // Schriftart im Fenster !?
         RETURN oDlg
Zuletzt geändert von Manfred am Fr, 22. Sep 2006 12:39, insgesamt 2-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

OK - und wo ist da jetzt Dein Sle?

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
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:

Beitrag von brandelh »

Manfred hat geschrieben:Wenn ich z.B. ein oSLE baue, dann muß ich ja etwas haben, über das ich das SLE legen kann.
Hallo Manfred,

wenn es ein SuchSLE sein soll, dann liegt das etwas oberhalb der Oberkante des Browsers oder etwas unterhalb der Unterkante, aber NIE darüber ! Sonst verdecken die sich gegenseitig !

Wenn du ein SLE in einer Spaltenzelle willst, um dort einen Wert zu editieren, ist das was ganz anderes.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert, Martin

ich habe es eben editiert und ich glaube ich habe zumindest einen Fehler gefunden.....

Ich mache das nochmal neu und stelle es dann rein, sonst komme ich hier ganz durcheinander.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Manfred,

vielleicht hilft Dir das folgende, einfache Beispiel, um den Aufbau eines
XbpBrowse besser zu verinnerlichen:

Code: Alles auswählen

#include "Xbp.ch" 
#include "Appevent.ch" 
#include "Gra.ch"
#pragma Library( "XppUi2.lib" )

PROCEDURE  Main 

  LOCAL nEvent, mp1, mp2, oXbp 
  LOCAL oDlg, oBrowse, oCol

  USE Customer.dbf EXCLUSIVE NEW

  // Dialogfenster erzeugen
  oDlg := XbpDialog():new( AppDesktop(), , {150,100}, {600,500}, , .F. ) 
  oDlg:title := "Browse-Test" 
  oDlg:create() 

  // Browse erzeugen
  oBrowse := XbpBrowse():new( oDlg:drawingArea, , {10,10}, {560,460}, , .T. )

  // Browse-Navigation festlegen
  oBrowse:skipBlock     := { |n| DbSkipper(n) }
  oBrowse:goTopBlock    := { | | DbGoTop()    }
  oBrowse:goBottomBlock := { | | DbGoBottom() }
  oBrowse:posBlock      := { | | DbPosition()    }
  oBrowse:phyPosBlock   := { | | Recno()      }
  oBrowse:goPosBlock    := { |n| DbGoPosition(n) }
  oBrowse:firstPosBlock := { | | 1         }
  oBrowse:lastPosBlock  := { | | 100       }

  // Spalte 1 erzeugen und an Browse anfuegen
  oBrowse:addColumn( { || LTrim( Customer->custno ) }, 5, "Kd.-Nr." )

  // Spalte 2 erzeugen, an Browse anfuegen und ColorBlock definieren
  oCol := oBrowse:addColumn( { || LTrim( Customer->mr_mrs ) }, 10, "Anrede" )
  oCol:colorBlock := { |xValue| iif( Upper( AllTrim( xValue ) ) == "MR.",   {GRA_CLR_YELLOW,GRA_CLR_RED}, {GRA_CLR_BLUE,GRA_CLR_YELLOW} ) }

  oBrowse:addColumn( { || LTrim( Customer->lastname ) }, 20, "Nachname" )  // Spalte 3
  oBrowse:addColumn( { || LTrim( Customer->firstname ) }, 20, "Vorname" )  // Spalte 4

  oBrowse:create()
  oBrowse:refreshAll()  // Anzeige auffrischen

  oDlg:Show()

  nEvent := 0 
  DO WHILE nEvent <> xbeP_Close 
    nEvent := AppEvent( @mp1, @mp2, @oXbp ) 
    oXbp:handleEvent( nEvent, mp1, mp2 ) 
  ENDDO 

RETURN
Für ein Suchfeld musst Du, wie Martin andeutete, ein SLE erzeugen, die darin stattfindenden Tastatur-Eingaben mittels keyboard-Callback abfragen und den editBuffer() des SLE's per dbSeek() in der Datenbank suchen. Dazu muss die Datenbank nach dem Suchfeld indiziert sein.

Ich hoffe, Du kannst etwas damit anfangen.

Übrigens finde ich dieses Thema (XbpBrowse) passt besser in die Rubrik "GUI" (für spätere Suche).

Tschüs,
Sören
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:

Beitrag von brandelh »

Hi,

die Rubrik mit Tabellen (am Monitor ...) finde ich nicht verkehrt, wenngleich natürlich auch alles GUI ist ;-)

Beim Suchen muß man natürlich auch noch überlegen, ob man den gewünschten Text irgendwo im Text findet (dblocate(....cSuch $ cFeld1+cFeld2 ...) oder ob man erst die aktuelle Spalte ermittelt um dann den Index zu wählen ...
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.
Ich weiß nicht ob es so ratsam ist immer wieder Zusatztools zu benutzen um irgendwas einfacher programmieren zu können, mir geht es in allererster Linie darum die Dinge zu verstehen und da habe ich Bedenken, dass es über den Umweg mit Tools besser laufen soll.
Sicher sind Tools, die gekapselte Klassenbibliotheken enthalten, aus DLLs bestehen, deren Funktionen man einfach aufruft, nicht geeignet, um die Lernkurve abzuflachen. Aber eXPress++ kommt im Quellcode (plain Xbase++), und man kann dieserart sozusagen vom Ergebnis aus rückwärts lernen. Alleine, wenn man sich anguckt, was der von Roger sehr intensiv genutzte Präprozessor aus "seinen" Befehlen (siehe Beispiel macht), kann man - immer das Ergebnis vor Augen - viel darüber erfahren, wie sowas geht, später auch ohne solche Tools. Gleichzeitig habe ich die Möglichkeit, bequem und tatsächlich objektorientiert zu programmieren, ohne diese Objekte zu Fuß (herkömmlicher Weg) erzeugen zu müssen. Sie existieren, und ich kann nach und nach herangehen und sie manipulieren. Ich habe den Vorschlag ja nicht gemacht, um Dir die Library zu verkaufen, sondern weil ich finde, daß sie sehr gut geeignet ist, diese Seite der Xbase-Programmierung besser zu verstehen. Ich nehme an, daß es mit TopDown ganz ähnlich ist (hier wird allerdings ein anderer Ansatz verfolgt); ob die Klassenbibliotheken von DS-Datasoft auch im Quellcode vorliegen, weiß ich nicht.

Manchmal ist es einfacher, schnell zu einem Ergebnis zu kommen und sich anschließend um das Verständnis seiner Entstehung zu bemühen. Aber das ist, wie gesagt, auch nur ein Vorschlag. Ich denke, Du würdest Dir viele Scherbenhaufen ersparen, wenn Du diesen Weg mal ausprobieren würdest.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Ich verschiebe den Thread mal in "Programmierung allgemein".
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Tom,
Tom hat geschrieben:...; ob die Klassenbibliotheken von DS-Datasoft auch im Quellcode vorliegen, weiß ich nicht.
das hängt davon ab, wieviel Du bezahlst (und welches Paket Du kaufst).
Es gibt XClass++ in der Standardversion (ohne Quälcode) und in der Developerversion (mit Sourcen) - gleiches gilt auch für das ADSClass von ihnen.

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

jetzt weiß ich auch, warum ich mir bisher keine Gedanken über eXPress++ gemacht hatte. Wir hatten schon das Gespräch vor ein paar Monaten, dass Roger nur über Kreditkarte bezahlen läßt. Und da ich keine habe....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Daniel

Beitrag von Daniel »

Hallo Manfred

jetzt haben wir in deiner Person schon den ersten Programmier-Gott. :oops:
Sollen wir dir jetzt huldigen? Wie?
- ich weiss, das ist ziemlich OT, und zudem ja nicht deine "Schuld", Tom hat diese Rangliste ja erstellt.

Wohin soll ich das nun schreiben - in den Raucherraum wage ich mich als NR ja nicht rein ... :? :!: :?:

Gratulation und Gruss
Daniel

P.S. eXPress ohne Kreditkarte:
Geht auch, du kannst Michael Rudrich fragen, ob du das noch über ihn beziehen kannst.
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

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: Das ist jetzt erstmal das Grundgerüst, das läuft.
Hier experimentiere ich mit und schreibe dahinter, was zu welchem Ergebnis führt.

Code: Alles auswählen

          // Spalten für alle Felder anfangen
          FOR nI := 1 TO FCount()
              cField := FieldName( nI )
              oBrowse:addColumn( FieldBlock ( cField ), , cField )
          NEXT
wenn du XbpBrowse "im Griff" hast wirst du es wahrscheinlich "überall"
einsetzen wollen. Deshalb solltest du das "create(n)" der "Column" gleich
in eine eigene Funktion/Class umwandeln.

Die Möglichkeit die "Column" zu "manipulieren" z.b. Farbe ist auch der
wesentliche Unterschied zu XbpQuickBrowse.

Vergessen wird auch immer wieder gerne die "Presentation Parameter"
da diese wesentlich für das "Aussehen" der "Column" zuständig ist. Ohne
"PP" bekommt man z.B. keinen "Footer".

deshalb würde ich nicht :

Code: Alles auswählen

oBrowse:addColumn( FieldBlock(cField ), ,cField )
verwenden sondern es "zerpflücken". Die "Feld"er etc. würde ich in
ein Array packen.

Code: Alles auswählen

FUNCTION myBrowse
...
LOCAL aDBF     := {;
 { {|| SCANDBF->W9MARK } , 1,"*","MARK",;
               "IF(!EMPTY   (SCANDBF->W9MARK),{ 0,12 },NIL )","" },;
 { {|| SCANDBF->ARTIST   } ,15,"Artist"    ,"ARTIST","","" },;
 { {|| SCANDBF->TITEL      } ,15,"Titel"     ,"TITEL"   ,"","" }}
...
USE (zPATH+"myDBF.DBF") ALIAS SCANDBF SHARED
...
aPos  := CenterPos( aSize, AppDesktop():currentSize() )
RETVAR := GBROWSE(oParent,aPos,aSize,aDBF,"MP3 suchen")
aDBF Array Strucktur :
1.) FELD als Codeblock oder String
2.) Breite der Spalte im XbpBrowse
3.) "Header" Text
4.) für Index OrdSetFocus(cName)
5.) Colorblock
6.) Footer im Beispiel nicht verwendet

klar kann man sich das Array so anpassen wie man es selber braucht.

Wie bauen wir nun aus dem Array die "Column" ?

Code: Alles auswählen

FUNCTION  GBROWSE(oParent,aPos,aSize,aDBF,cTitle)
...
LOCAL imax        := LEN(aDBF) // Länge des Arrays

LOCAL aPP3 := { ;
 { XBP_PP_COL_HA_CAPTION          , ""               }, ; 
 { XBP_PP_COL_HA_BGCLR            , GRA_CLR_PALEGRAY }, ;
 { XBP_PP_COL_HA_FGCLR            , GRA_CLR_BLACK    }, ; 
 { XBP_PP_COL_DA_BGCLR            , GRA_CLR_WHITE    }, ;
 { XBP_PP_COL_DA_FGCLR            , GRA_CLR_BLACK    }, ;
 { XBP_PP_COL_DA_HILITE_FGCLR     , GRA_CLR_WHITE    }, ;
 { XBP_PP_COL_DA_HILITE_BGCLR     , GRA_CLR_BLUE     }, ;
 { XBP_PP_COL_DA_CHARWIDTH        , 1                }, ;
 { XBP_PP_COL_DA_CELLALIGNMENT    , XBPALIGN_LEFT    }, ;
 { XBP_PP_COL_DA_FRAMELAYOUT      , XBPFRAME_NONE    }, ;
 { XBP_PP_COL_DA_HILITEFRAMELAYOUT, XBPFRAME_NONE    }, ;
 { XBP_PP_COMPOUNDNAME            , FONT_HELV_SMALL }, ;
 { XBP_PP_COL_DA_CELLFRAMELAYOUT  , XBPFRAME_BOX + XBPFRAME_RAISED } } 

...
   oDlg := XbpDialog():new( oParent, , aPos, aSize, , .F. )
...
oBrowse := GuiBrowseDb(oDlg:drawingArea, {0,0}, {aSize[1],aSize[2]})
FOR i:=1 TO imax
      aPP3[1,2]     := aDBF[i,2]       // title name
      aPP3[8,2]     := aDBF[i,3]       // field wide
      IF EMPTY(aDBF[i,5])               // colorblock
         aPP3[9,2]     := XBPALIGN_LEFT
         oCol            := XbpColumn():new(oBrowse,,,, aPP3)
         IF VALTYPE(aDBF[i,1])=="C"
            oCol:dataLink   := &("{||"+aDBF[i,1]+"}")
         ELSE
            oCol:dataLink   := aDBF[i,1]
         ENDIF
      ELSE
         aPP3[9,2]      := XBPALIGN_RIGHT
         oCol            := XbpColumn():new(oBrowse,,,, aPP3)
         IF VALTYPE(aDBF[i,1])=="C"
            oCol:dataLink   := &("{||"+aDBF[i,1]+"}")
         ELSE
            oCol:dataLink   := aDBF[i,1]
         ENDIF
         // her now colorblock
         oCol:colorBlock := &("{||"+aDBF[i,5]+"}")
      ENDIF
      oCol:create()
      oBrowse:addColumn(oCol)
   NEXT

   oBrowse:show()
   SetAppFocus(oBrowse)
   oBrowse:refreshall()

wie ihr seht wird zuerst der "Presentation Parameter" aPP3 durch das
jeweilige aDBF Element ersetzt und ein "Column" Object erzeugt bevor
man dieses oBrowse:addColumn(oCol).

So damit hättest man ein Grundgerüst für eine eingene Funktion/Class
die man immer wieder verwenden kann.

gruss by OHR
Jimmy
Zuletzt geändert von AUGE_OHR am Fr, 22. Sep 2006 19:42, insgesamt 1-mal geändert.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

kurz den Kopf durchpusten lassen und zumindest ein Teil klappt jetzt.

Code: Alles auswählen

*
*
*
* TEstumgebung für XbpBrowse mit dem versuch alle Schikanen einzubauen
********************************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "gra.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
********************************************************************************
PROCEDURE AppSys
          RETURN
********************************************************************************
PROCEDURE main()
          LOCAL cField
          LOCAL mp1, mp2
          LOCAL nI
          LOCAL nEvent := 0
          LOCAL oXbp, oBrowse, oSle

          DbUseArea(.T.,"DBFCDX","\videoneu\datenbanken\vo\titel")
          IF ! FILE("\videoneu\datenbanken\vo\titelxbpbrowse.cdx")
             OrdCreate("\videoneu\datenbanken\vo\titelxbpbrowse","titel","UPPER(bez)")
          ELSE
             OrdListAdd("\videoneu\datenbanken\vo\titelxbpbrowse")
          ENDIF

          //Dialogfenster erzeugen
          oXbp := GuiStdDialog( "Standard GUI Browser für DBF")

          //Browser im Fenster erzeugen
          oBrowse := GuiBrowseDb( oXbp:drawingArea )

          oSle    := XbpSle():new( oXbP:drawingArea,,,,,.T.)
          oSle:keyboard := {|nKey,mp2,obj| browseSearch( nKey, obj, oBrowse, "titel")}
          oSle:create()

          BrowseResize( oSle, oBrowse, oXbp:drawingArea:currentSize())

          // Spalten für alle Felder anfangen
          FOR nI := 1 TO FCount()
              cField := FieldName( nI )
              oBrowse:addColumn( FieldBlock ( cField ), , cField )
          NEXT

          // Der Browser füllt nach :resize() immer das Fenster aus
          oXbp:drawingArea:resize := { |mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
          oXbp:show()                                                           // jetzt wird erst angezeigt
          oBrowse:show()                                                        // da bei Erzeugung lVisible := .F. war
          SetAppFocus( oSle )

          DO WHILE nEvent <> xbeP_Close
             nEvent := AppEvent( @mp1, @mp2, @oXbp )
             oXbp:handleEvent( nEvent, mp1, mp2 )
          ENDDO
          RETURN
********************************************************************************
FUNCTION GuiBrowseDb(oParent,aPos,aSize)
         LOCAL lVisible := .T.
         LOCAL oBrowse

         oBrowse              := XbpBrowse():new( oParent,, aPos, aSize,, lVisible)
         oBrowse:adjustHeight := .T.                                            // damit die letzte zeile auch sichtbar wird
         oBrowse:cursorMode   := XBPBRW_CURSOR_ROW                              // die ganze Zeile als Cursor
         oBrowse:softTrack    := .F.                                            // damit das Scrollen weich und sofort klappt
         oBrowse:create()

         // Navigationscodeblöcke für den Browser
         oBrowse:skipBlock     := {|n| DbSkipper(n) }                           // skipped vorwärts, oder rückwärts
         oBrowse:goTopBlock    := {| | DbGoTop()    }
         oBrowse:goBottomBlock := {| | DbGoBottom() }
         oBrowse:phyPosBlock   := {| | Recno()      }

         // Navigationscodeblöcke für den vertikalen Scrollbar
         oBrowse:posBlock      := {| | DbPosition()    }
         oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
         oBrowse:lastPosBlock  := {| | 100             }
         oBrowse:firstPosBlock := {| | 0               }

         RETURN oBrowse
********************************************************************************
FUNCTION GuiStdDialog( cTitle )                                                 // das gibt das fertige Objekt zurück (aha!)
         LOCAL aPos      := {100,100}                                           // Startpostion des Fensters auf dem Parentbildschirm
         LOCAL aSize     := {1024,768}                                          // Größe des Fensters auf dem Parentbildschirm

         LOCAL lVisible  := .T.                                                 // bestimmt, ob der XbpDialog nach Aufruf von create() sichtbar ist

         LOCAL oDlg

         DEFAULT cTitle TO "Standard Dialog Fenster"                            // wenn kein Parameter mitgegeben werden würde

         oDlg          := XbpDialog():new(,,aPos,aSize,,lVisible)
         oDlg:icon     := 1                                                     // dieses Icon ist nachher oben links sichtbar!?
         oDlg:tasklist := .T.                                                   // bei .F. fehlen oben rechts die Button und der Rahmen
         oDlg:title    := cTitle                                                // Überschriftentext oben im Kopf
         oDlg:create()                                                          // Objekt wird erzeugt
//         CenterControl(oDlg)                                                    // zentriert am Bildschirm
         oDlg:drawingArea:setFontCompoundName( "8.Helv")                        // Schriftart im Fenster !?
         RETURN oDlg
********************************************************************************
FUNCTION browseResize( oSle, obrowse, aSize)
         oSle:setpos({0,aSize[2]-24})
         oSle:setSize({aSize[1],24})

         oBrowse:setSize({aSize[1], aSize[2]-24})
RETURN (.T.)
********************************************************************************
FUNCTION browseSearch( nKey, oSle, oBrowse, cIndex)
         LOCAL cValue := Upper( Alltrim( oSle:editBuffer()))

         Dbseek(cValue,.T.,cIndex)
         oBrowse:refreshall()      // ist das die richtige Lösung? aber es klappt jetzt
         RETURN(.T.)
Zuletzt geändert von Manfred am Fr, 22. Sep 2006 19:50, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

das mit dem oBrowse:refreshall(), das hatte mir noch gefehlt......

Juchu, es klappt jetzt.

Jetzt geht es an den nächsten Punkt.
Zuletzt geändert von Manfred am Fr, 22. Sep 2006 19:46, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

so wie es aussieht, ist der Tag schon wieder gerettet. Ich habe jetzt das SLE mit dem XbpBrowse verbunden und es klappt. Und vor allen Dingen, was mich am meisten freut, ist die Tatsache, das im Unterschied zum XbpQuickBrowse, im Browser gescrollt werden kann und dann der Datensatz wirklich übernommen wird, auf dem der Cursor steht. Das muß wohl an der unterschiedlichen Arbeitsweise von den beiden Browseklassen liegen.

Es klappt, der Scherbenhaufen ist erstmal wieder weg.....

8)
:wav:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von brandelh »

Hallo Manfred,

genau, der XbpBrowse verhält sich mit dem Cursor parallel zu dem Satzzeiger ähnlich dem TBrowse von Clipper. Durch viele Parameter kann man den Browser anpassen und auch Editierfelder vorsehen, leider wird er für manche Aufgaben deshalb aber auch zu langsam.

Wenn man dann diese Flexibilität nicht braucht, dann kann man mit dem Quickbrowser wesentlich schnellere Anzeigen schaffen.

Das ist der Unterschied, der Rennwagen für reine Anzeigen, das gemächliche Schlachtschiff für die Schwergewichte ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,
Du hast vollkommen Recht. XbpBrowse ist etwas langsamer. Aber allein die Tatsache, dass XbpBrowse auch den Datensatz ordentlich überneimmt, der nur im Browser angeklickt wurde, führt mich dahin, mich damit mehr zu beschäftigen.

Aber ich schätze einmal, es wird in der Zukunft sicherlich ein Zusammenspiel beider Browser für ihre jewiligen Zwecke geben. Allerdings erst, wenn ich ein wenig mehr Durchblick habe.

Jetzt geht es zum nächsten Schritt.

:walk:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

so, nachdem das Teil jetzt erstmal läuft, ist aber noch etwas merkwürdig aufgestoßen:

Code: Alles auswählen


*
*
*
* TEstumgebung für XbpBrowse mit dem versuch alle Schikanen einzubauen
********************************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "gra.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
********************************************************************************
PROCEDURE AppSys
          RETURN
********************************************************************************
PROCEDURE main()
          LOCAL cField
          LOCAL mp1 := 0, mp2 := 0
          LOCAL nI
          LOCAL nEvent := 0
          LOCAL oXbp, oBrowse, oSle

          DbUseArea(.T.,,"titel")
          IF ! FILE("titelxbpbrowse.ntx")
             OrdCreate("titelxbpbrowse","titel","UPPER(bez)")
          ELSE
             OrdListAdd("titelxbpbrowse")
          ENDIF

          //Dialogfenster erzeugen
          oXbp := GuiStdDialog( "Standard GUI Browser für DBF")

          //Browser im Fenster erzeugen
          oBrowse := GuiBrowseDb( oXbp:drawingArea )

          oSle    := XbpSle():new( oXbP:drawingArea,,,,,.F.)
          oSle:keyboard := {|nKey,mp2,obj| browseSearch(obj, oBrowse, "titel")}
          oSle:create()

          BrowseResize( oSle, oBrowse, oXbp:drawingArea:currentSize())

          // Spalten für alle Felder anfangen
          FOR nI := 1 TO FCount()
              cField := FieldName( nI )
              oBrowse:addColumn( FieldBlock ( cField ), , cField )
          NEXT

          // Der Browser füllt nach :resize() immer das Fenster aus
          oXbp:drawingArea:resize := { |mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
          oXbp:show()                                                           // jetzt wird erst angezeigt
          oBrowse:show()                                                        // da bei Erzeugung lVisible := .F. war
          oSle:show()
          SetAppFocus( oSle )

          DO WHILE nEvent <> xbeP_Close
             nEvent := AppEvent( @mp1, @mp2, @oXbp )
             oXbp:handleEvent( nEvent, mp1, mp2 )
          ENDDO
          RETURN
********************************************************************************
FUNCTION GuiBrowseDb(oParent,aPos,aSize)
         LOCAL lVisible := .F.
         LOCAL oBrowse

         oBrowse              := XbpBrowse():new( oParent,, aPos, aSize,, lVisible)
         oBrowse:adjustHeight := .T.                                            // damit die letzte zeile auch sichtbar wird
         oBrowse:cursorMode   := XBPBRW_CURSOR_ROW                              // die ganze Zeile als Cursor
         oBrowse:softTrack    := .F.                                            // damit das Scrollen weich und sofort klappt
         oBrowse:create()

         // Navigationscodeblöcke für den Browser
         oBrowse:skipBlock     := {|n| DbSkipper(n) }                           // skipped vorwärts, oder rückwärts
         oBrowse:goTopBlock    := {| | DbGoTop()    }
         oBrowse:goBottomBlock := {| | DbGoBottom() }
         oBrowse:phyPosBlock   := {| | Recno()      }

         // Navigationscodeblöcke für den vertikalen Scrollbar
         oBrowse:posBlock      := {| | DbPosition()    }
         oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
         oBrowse:lastPosBlock  := {| | 100             }
         oBrowse:firstPosBlock := {| | 0               }

         RETURN oBrowse
********************************************************************************
FUNCTION GuiStdDialog( cTitle )                                                 // das gibt das fertige Objekt zurück (aha!)
         LOCAL aPos      := {100,100}                                           // Startpostion des Fensters auf dem Parentbildschirm
         LOCAL aSize     := {1024,768}                                          // Größe des Fensters auf dem Parentbildschirm

         LOCAL lVisible  := .F.                                                 // bestimmt, ob der XbpDialog nach Aufruf von create() sichtbar ist

         LOCAL oDlg

         DEFAULT cTitle TO "Standard Dialog Fenster"                            // wenn kein Parameter mitgegeben werden würde

         oDlg          := XbpDialog():new(,,aPos,aSize,,lVisible)
         oDlg:icon     := 1                                                     // dieses Icon ist nachher oben links sichtbar!?
         oDlg:tasklist := .T.                                                   // bei .F. fehlen oben rechts die Button und der Rahmen
         oDlg:title    := cTitle                                                // Überschriftentext oben im Kopf
         oDlg:create()                                                          // Objekt wird erzeugt
//         CenterControl(oDlg)                                                    // zentriert am Bildschirm
         oDlg:drawingArea:setFontCompoundName( "8.Helv")                        // Schriftart im Fenster !?
         RETURN oDlg
********************************************************************************
FUNCTION browseResize( oSle, obrowse, aSize)
         oSle:setpos({0,aSize[2]-24})
         oSle:setSize({aSize[1],24})

         oBrowse:setSize({aSize[1], aSize[2]-24})
RETURN (.T.)
********************************************************************************
FUNCTION browseSearch(oSle, oBrowse, cIndex)
         LOCAL cValue := Upper( Alltrim( oSle:editBuffer()))

         Dbseek(cValue,.T.,cIndex)
         oBrowse:refreshAll()
         RETURN(.T.)
Wenn man das Fenster mit der Maus verändert, verschwindet das SLE und taucht auch nicht wieder auf. Es ist nur am rechten Rand zu sehen, dass es irgendwie im Hintergrund zu sehen ist.
Sicherlich eine Frage der Focussetzung? (tolles Wort). Aber wie macht man das denn dann?

@Jimmy,

Deine Beispiele werde ich mir am WE mal ansehen und schauen, ob ich da schon durchblicke. Also nicht denken, ich hätte sie nicht beachtet, oder ignoriert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
der Fehler dürfte in Deinem Aufruf des BrowseResize liegen! Du nimmst dort ja die Größe der drawingArea - darfst Du natürlich nicht, da Du davon ja auch noch die Höhe des Sles abziehen mußt...

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.
Antworten