Textanzeigen im GUI Modus

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Textanzeigen im GUI Modus

Beitrag von saul »

Hallo,
bisher habe ich Anzeigen, wie z.B. Fortschrittsanzeigen immer mit @10,10 say ..... gemacht. Bei msgbox muss man immer ok bestätigen, kommt also nicht in Frage. Wie stellt man denn solche verschieden langen Texte im GUI Modus dar?

mfg
Wolfgang
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: Textanzeigen im GUI Modus

Beitrag von AUGE_OHR »

hi,

einen längeren Text kann man mit CHR(13)+CHR(10) "umbrechen"

unter GUI kann man einen Text als Caption einer XbpStatic anzeigen oder man "malt", mit den GRA Function, den Text auf einen Parent.

der "ok" Button bei einer MsgBox() hat noch einen weiteren Zweck : er "löscht" das Fenster samt Inhalt
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Textanzeigen im GUI Modus

Beitrag von georg »

Guten Morgen, Wolfgang -


es gibt - wie immer beim Programmieren - mehrere Wege zum Ziel.

Möglichkeit 1 ist, eine XbpStatusBar() einzusetzen (siehe Dokumentation und Beispiele) und dort die Information auszugeben. Bei einem meiner Programme erscheint bei einem längeren Ladeprozess dort dann "Datensatz n von x geladen (Laufzeit bisher: m,n Sekunden)".

Möglichkeit 2: mit einer aktiven Subscription kannst Du von Alaska das XbasePack3 laden (das letzte, wenn ich mich nicht täusche), das bringt eine ProgressBar Klasse mit, die einen Verlauf optisch darstellt. Wenn ich mich nicht irre, hat Jimmy auch eine solche Lösung hier mal gepostet, vielleicht trägt er das in diesem Beitrag ja nach.

Möglichkeit 3: Erzeuge ein XbpStatic() mit :type := XBPSTATIC_TYPE_TEXT und ändere dann über :setCaption() den darin angezeigten Wert (das war Jimmy's Vorschlag).

Möglichkeit 4: Erzeuge ein XbpStatic() mit :type := XBPSTATIC_TYPE_GROUPBOX (damit ein Rahmen da ist), und dann ein weiteres XbpStatic() auf dem vorhandenen mit :type := XBPSTATIC_TYPE_TEXT und gib dort z.B. Repl("|", n) aus, entsprechend dem Fortschritt. Das braucht aber etwas Rechenaufwand, um herauszufinden, wieviele Balken dort reinpassen. Damit kannst Du dann auch einen Progressbar simulieren.

Es gibt natürlich noch viele andere Ansatzmöglichkeiten, aber das sind die, die mir so auf Anhieb einfallen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: Textanzeigen im GUI Modus

Beitrag von AUGE_OHR »

georg hat geschrieben:Möglichkeit 1 ist, eine XbpStatusBar() einzusetzen
Möglichkeit 2: ... das bringt eine ProgressBar Klasse mit, die einen Verlauf optisch darstellt.
in der Wissensbasis gibt es die DXE LIB mit diversen "native" Controls d.h. man benötigt kein MsComCtl.OCX oder MsComCt2.OCX

im Statusbar Demo habe ich, als Thread, optional ein Progressbar eingebaut ( s.h. Demo Source )
gruss by OHR
Jimmy
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Textanzeigen im GUI Modus

Beitrag von saul »

Hallo,
Danke dafür. Da habe ich ja am Wochenende wieder einiges zu lernen und zu probieren.

mfg
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Textanzeigen im GUI Modus

Beitrag von brandelh »

Unter VO hatte ich fürs indizieren mit grafischen Funktionen wie unter Clipper im Textmodus einen Laufbalken gebaut.
Dieser hat die nötige Zeit für den Vorgang aber mehr als verdoppelt.
Die oben angesprochenen Windowslaufbalken laufen ohne konkrete 0 bis 100% Anzeige
einfach durch und kosten daher kaum Zeit. Auch ein Static das mit dem Text 0 bis 100% versorgt wird,
bremst kaum, wenn man es nicht für jeden Durchgang aufruft, sondern vorher prüft ob sich am Text was geändert hat.
Wie bisher auch, darf die Funktion nicht in dem Index auftauchen !

Unter Clipper hatte man es leicht eine Anzeige abhängig vom Datensatz auf z.b. alle 100 Datensätze zu begrenzen:

Code: Alles auswählen

INDEX ON FeldName TO IndexName  EVAL  MeineAnzeigeFunktion() EVERY 100
der code wäre immer noch gültig, aber er macht nix:
Dokumentation von Xbase++ hat geschrieben:EVAL <lExpression>
...
Achtung: diese Option wird von der NTXDBE und der CDXDBE ignoriert.
Heute kann man das so umgehen indem man den Indexbegriff sowohl als Text als auch als Codeblock übergibt,
im codeblock aber die Anzeigefunktion aufruft. Hierbei muss der zurückgegebene String (also der Indexbegriff) identisch sein.
Setzen und Abfragen von Controls dauert viel länger als interne Variablenzugriffe, daher nur geänderten Text anzeigen lassen.
Hier ein Beispiel in dem die Reihenfolge innerhalb des Codeblocks entscheident ist.
Die Funktion OrdAnzeige() ändert den Indexbegriff nicht.

Code: Alles auswählen

ordCreate( "Adressen_Name.NTX", , "upper(Name)",  {|| OrdAnzeige(), upper(name) } )
function OrdZeigBalken()
    STATIC nProzent := 0 // Achtung, Funktion darf nur einmal aufgerufen werden ! Eine Klasse wäre besser.
    LOCAL oXbp := GetAnzeigeControl() // z.B. ein XbpSLE()
     // schlecht - weil sehr langsam - wäre es die Anzeige für jeden Satz anzuzeigen. 
    if nProzent < DbPosition() 
       nProzent := DbPosition() 
       oXbp:SetData( alltrim(str(nProzent))+ " %" )
    endif
return nil
Ein anderes Beispiel:

Code: Alles auswählen

ordCreate( "Adressen_Name.NTX", , "upper(Name)",  {|| OrdAnzeige(upper(name)) } )
function OrdZeigBalken(cIndexBegriff)
    STATIC nProzent := 0 // Achtung, Funktion darf nur einmal aufgerufen werden ! Eine Klasse wäre besser.
    LOCAL oXbp := GetAnzeigeControl() // z.B. ein XbpSLE()
     // schlecht - weil sehr langsam - wäre es die Anzeige für jeden Satz anzuzeigen. 
    if nProzent < int(DbPosition())
       nProzent := int(DbPosition())
       oXbp:SetData( alltrim(str(nProzent))+ " %" )
    endif
return cIndexBegriff // unverändert durchreichen !
Gruß
Hubert
Antworten