suche ...

Vorschläge, Infos, Verbesserungen, Technisches

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

suche ...

Beitrag von AUGE_OHR »

wie suche ich nach

Code: Alles auswählen

GetTextDimensions
:angry4:
gruss by OHR
Jimmy
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: suche ...

Beitrag von azzo »

Hallo Jimmy,
versuche es mit Google und der Beschränkung auf die Seite www.xbaseforum.de.

GetTextDimensions site:http://www.xbaseforum.de

Wahrscheinlich gibt es keinen Treffer.
lg
Otto
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: suche ...

Beitrag von brandelh »

Schaue mal neben in den Erläuterungstext:
Suche nach Wörtern:
Setze ein + vor ein Wort, das gefunden werden muss und ein - vor ein Wort, das nicht gefunden werden darf. Verwende mehrere Wörter getrennt durch | innerhalb einer Klammer, wenn nur eines der Wörter gefunden werden muss. Benutze ein * als Platzhalter für teilweise Übereinstimmungen.
'sle' findet z.B. kein XbpSle(), denn XbpSle es ist nur ein Teilbegriff.
'*sle' findet XbpSle(), denn () und - sind genauso wie Blanks Worttrenner
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: suche ...

Beitrag von Herbert »

Wie kommst du auf dieses Wort? Im API ist das nicht bekannt.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: suche ...

Beitrag von AUGE_OHR »

Herbert hat geschrieben:Wie kommst du auf dieses Wort? Im API ist das nicht bekannt.
GetTextDimensions ist ein Artikel von Günter Beyes und es ging um GetTextExtentPoint32() vs. GraQueryTextBox().
genau zu sein habe ich die

Code: Alles auswählen

FUNCTION HandleFromFont( oFont )
gesucht und in der Alaska Newsgroup gefunden.

Re: Graphic printing
public.xbase++.generic
29. Juli 2005

ich hänge es hier mal als Attachment an
Dateianhänge
GraTest.zip
Author: Günter Beyes
Demonstrate the WinAPI function GetTextExtentPoint32, which may be used as a faster replacement
for GraQueryTextBox in some of its most frequent use cases.
(8.66 KiB) 355-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: suche ...

Beitrag von Herbert »

Aha, danke.
Womit programmiert eigentlich Alaska? Doch auch mit C und entsprechenden API-Calls?
Falls diese Funktion intern beim Aufbau von Dialogen verwendet wird, wäre eine Optimierung der Gra-Funktionen zur Performance-Steigerung mehr als angebracht. Nicht erst mit Version 3.0, wenn dort dann überhaupt.
Grüsse Herbert
Immer in Bewegung...
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: suche ...

Beitrag von UliTs »

Herbert hat geschrieben:Aha, danke.
Womit programmiert eigentlich Alaska? Doch auch mit C und entsprechenden API-Calls?
Falls diese Funktion intern beim Aufbau von Dialogen verwendet wird, wäre eine Optimierung der Gra-Funktionen zur Performance-Steigerung mehr als angebracht. Nicht erst mit Version 3.0, wenn dort dann überhaupt.
Soweit ich weiß, programmiert Alaska hauptsächlich in xBase (auch den Compiler!). Lediglich Schnittstellen, die in xBase nicht zu realisieren sind, der P-Code-Kernel und vereinzelte Optimierungen sind in C++ programmiert.
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: suche ...

Beitrag von brandelh »

Womit ein Compiler entwickelt wird, sagt nichts darüber aus, wie schnell die Anwendungen sind, die er erzeugt.

Xbase++ hat einige Eigenschaften, die der Geschwindigkeit entgegen stehen.
Die größte Bremse dürfte sein, dass Xbase++ Variablen benutzt, die alle hier möglichen Typen enthalten können.
Eine gewisse Optimierung liegt darin, dass sie versuchen Integer Werte zu erkennen und dann die Variable auch auf LONG zu setzen.
Aber dieser Komfort für den Programmierer bremst ungemein durch nötige interne Umwandlungen.
Einige APIs können so gar nicht direkt mit Xbase++ bedient werden (DOUBLE oder DWORD Rückgabewerte etc.).

Ebenso die Möglichkeit zur Laufzeit mal so eben aus einem Quellcode einen codeblock zu erstellen, das setzt
neben den flexiblen Variablen eben auch vorraus, dass der compiler selbst zumindest teilweise im runtimesystem hinterlegt ist.
Alles hat Vor- und Nachteile ;-)
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: suche ...

Beitrag von UliTs »

brandelh hat geschrieben:...Ebenso die Möglichkeit zur Laufzeit mal so eben aus einem Quellcode einen codeblock zu erstellen, das setzt
neben den flexiblen Variablen eben auch vorraus, dass der compiler selbst zumindest teilweise im runtimesystem hinterlegt ist.
Alles hat Vor- und Nachteile ;-)
Stimmt :!:
Wobei ich vermute, dass der Compiler in jedem xBase-Programm indirekt durch die benötigten DLLs enthalten ist.
Ist es nicht so, dass die Codeblöcke zur Laufzeit übersetzt werden, bevor sie ausgeführt werden?
Hat jemand mal getestet, ob z.B.

Code: Alles auswählen

bBlock := {||12*12+10-123+12929}
FOR I = 1 TO 1000000
  Eval( bBlock }
NEXT I
schneller ist, als

Code: Alles auswählen

FOR I = 1 TO 1000000
  Eval( {||12*12+10-123+12929} }
NEXT I
Stimmt es, was ich schreibe, dann würde im zweiten Beispiel der Codeblock 1000000x übersetzt, während dies beim ersten Beispiel nur 1x geschehen müsste.
Natürlich würde in beiden Beispielen insgesamt 1000000x ein Codeblock ausgeführt :-)

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: suche ...

Beitrag von brandelh »

Hi Uli,

deine beiden Codeblöcke oben werden zur Compilierzeit einmal übersetzt, denn der Compiler kann diesen direkt erkennen und compilieren.
Das kannst du schön prüfen, wenn du einen Fehler einbaust. Zur Laufzeit wird alles übersetzt, was mit Macros zu tun hat.

bBlock := {|| 'A'++ } gibt der Compiler direkt als Fehler aus
bBlock := &("{|| 'A'++ }") gibt erst zur Laufzeit einen Fehler ;-)

PS: es soll einen kleinen Geschwindigkeitsunterschied zwischen beiden Codeblock-Typen bestehen, warum habe ich aber vergessen. :D
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: suche ...

Beitrag von UliTs »

Hallo Hubert,

ja, Du hast Recht! Die Codeblöcke können und werden bereits zur Compilierzeit übersetzt!
So sind die beiden Beispiele besser und es wär interessant zu sehen, ob die Berechnung "gleich schnell" geschieht (das vermute ich):

Code: Alles auswählen

bBlock := {||12*12+10-123+12929}
FOR I = 1 TO 1000000
  Eval( bBlock }
NEXT I

Code: Alles auswählen

bBlock :=&("{||12*12+10-123+12929}")
FOR I = 1 TO 1000000
  Eval( bBlock }
NEXT I
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: suche ...

Beitrag von brandelh »

warum vermuten, wenn man testen kann :D
hier der code ...

Code: Alles auswählen

#include "XBP.CH"

proc main
   local bBlock, nDauer1, nDauer2
   set alternate to test.txt
   set alternate on
   ?
   ? "Nicht vermuten, sondern testen ;-) "
   ?
   ? "direkt compilierter codeblock, start ",time()
   nDauer1 := seconds()
   bBlock := {||12*12+10-123+12929}
   FOR I = 1 TO 1000000
      Eval( bBlock )
   NEXT I
   nDauer1 := seconds() - nDauer1
   ? "Ende Test 1 ", time(), " Dauer: ",   nDauer1, "Sekunden"
   bBlock := NIL // sicher ist sicher
   ? "über string compilierter codeblock, start ",time()
   nDauer2 := seconds()
   bBlock :=&("{||12*12+10-123+12929}")
   FOR I = 1 TO 1000000
      Eval( bBlock )
   NEXT I
   nDauer2 := seconds() - nDauer2
   ? "Ende Test 2 ", time(), " Dauer: ",   nDauer2, "Sekunden"

   set alternate to

   wait
return

und hier das Ergebnis ...

Code: Alles auswählen

Nicht vermuten, sondern testen ;-) 

direkt compilierter codeblock, start  17:38:04
Ende Test 1  17:38:05  Dauer:           0,80 Sekunden
über string compilierter codeblock, start  17:38:05
Ende Test 2  17:38:06  Dauer:           1,50 Sekunden
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: suche ...

Beitrag von AUGE_OHR »

danke euch für die Codeblock Performance Beispiele.

der Artikel von Günter Beyes bezog sich damals (2005) ja noch auf "drucken" wo die Performance nicht ganz so die Rolle spielt.
wenn man aber GraQueryTextBox() bei Ownerdraw verwendet um ein "wordbreak" zu simulieren "merkt" man schon einen Unterschied zur API GetTextExtentPoint32()
ganz schlimm wird es unter Xbase++ dann wenn man das ganze noch "moved" ... oder so was macht

Code: Alles auswählen

FOR i := 1 TO ::titleHeight
  aColors[1] += ::gradientStep
  aColors[2] += ::gradientStep
  aColors[3] += ::gradientStep
  GraSetColor( oPS, GraMakeRGBColor(aColors), XBPSYSCLR_TRANSPARENT )
  GraBox( oPS, aStartPos, aEndPos, GRA_OUTLINEFILL, ::radius, ::radius )
  aStartPos[2]++
  aEndPos[2]--
NEXT
das geht wohl 1 mal aber nicht 100000 mal hintereinander ohne das es "flickert".

an dieser Stelle setzt übrigens Xoanon an in dessen Stil ich nun die Ownerdraw Sample orientiert habe welche ja nur "pure" Xbase++ und BAP enthalten "dürfen".

p.s. wann ist Einsendeschluss für den Devcon Teilnehmer Wettbewerb ?
gruss by OHR
Jimmy
Antworten