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
Textanzeigen im GUI Modus
Moderator: Moderatoren
- AUGE_OHR
- 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
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
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
Jimmy
-
- 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
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.
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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- AUGE_OHR
- 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
in der Wissensbasis gibt es die DXE LIB mit diversen "native" Controls d.h. man benötigt kein MsComCtl.OCX oder MsComCt2.OCXgeorg hat geschrieben:Möglichkeit 1 ist, eine XbpStatusBar() einzusetzen
Möglichkeit 2: ... das bringt eine ProgressBar Klasse mit, die einen Verlauf optisch darstellt.
im Statusbar Demo habe ich, als Thread, optional ein Progressbar eingebaut ( s.h. Demo Source )
gruss by OHR
Jimmy
Jimmy
Re: Textanzeigen im GUI Modus
Hallo,
Danke dafür. Da habe ich ja am Wochenende wieder einiges zu lernen und zu probieren.
mfg
Wolfgang
Danke dafür. Da habe ich ja am Wochenende wieder einiges zu lernen und zu probieren.
mfg
Wolfgang
- brandelh
- 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
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:
der code wäre immer noch gültig, aber er macht nix:
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.
Ein anderes Beispiel:
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
Heute kann man das so umgehen indem man den Indexbegriff sowohl als Text als auch als Codeblock übergibt,Dokumentation von Xbase++ hat geschrieben:EVAL <lExpression>
...
Achtung: diese Option wird von der NTXDBE und der CDXDBE ignoriert.
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
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
Hubert