Seite 3 von 5

Verfasst: 23.03.2006 19:09
von Falko
Konne hat geschrieben:
Möglich wäre es, aber nicht sinnvoll. Wenn es sinnvoll wäre, hätte Billy es
implementiert. Wer also sowas braucht, muß es sich proggen, für sowas
ausgefallenes kann es keine fertigen Befehle geben.
Ich finde den Befehl gar nicht ausgefalen und ich habe mich schon oft darueber geaergert aber ich denke da hatte einfach jemand keinen bock das zu schreiben, warscheinlich ist #Numeric nur ein api Flag und das anzuhaengen ist halt doch leichter wie eine kleine abweichung selber zu proggen.

Nunja man kann ja ein Buttongadget vor das stringgadget machen dass immer von + zu - stringt und dann ein textgadget mit "." und dann noch ein Stringgadget fuer die nachkomma stellen und ass dann alles in ne Procedure und dann sieht es doch doof aus nunja war ja auch nur ein vorschlag.
Ich glaube, das wollte Bill Gates nicht erreichen :mrgreen:

http://www.purebasic.fr/english/viewtopic.php?t=20535

Verfasst: 23.03.2006 22:01
von ts-soft
Bevor die Lösung von H.Brill in Vergessenheit gerät, weil: Das Rad wurde bereits erfunden und die NEdit.dll (Freeware) hat noch nicht einmal 5 KB.

Hab jetzt mal eine PB4 Include erstellt ("NEdit_Include.pbi")

Code: Alles auswählen

; Flags
; 1 = Nur EIN Komma/Punkt im String zulassen
; 2 = Nur 2 Ziffern hinter dem Komma/Punkt zulassen
; 4 = Minus nur einmal und am Anfang zulassen

Prototype NEdit(hWnd.l, Flags.l)

Procedure NEdit_Init(DLLFile.s = "NEdit.dll")
  Shared NEditDLL.l
  NEditDLL = OpenLibrary(#PB_Any, DLLFile)
  If NEditDLL
    Global NEdit.NEdit = GetFunction(NEditDLL, "InitMessages")
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure NEdit_Destroy(hWnd.l)
  DestroyWindow_(hWnd)
EndProcedure

Procedure NEdit_End()
  Shared NEditDLL.l
  If NEditDLL
    CloseLibrary(NEditDLL)
  EndIf
EndProcedure


Und ein entsprechendes Testprogram gibt es auch dazu:

Code: Alles auswählen

XIncludeFile "NEdit_Include.pbi"

If OpenWindow(0, #PB_Ignore, 0, 200, 150, "")
  If CreateGadgetList(WindowID(0))
    StringGadget(0, 10, 10, 180, 30, "")
    If NEdit_Init()
      NEdit(GadgetID(0), 7)
    EndIf
  Else
    End
  EndIf
Else
  End
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

NEdit_Destroy(GadgetID(0))
NEdit_End()
Autor der DLL: Frank Abbing
Download auf seiner Homepage: http://fabbing.de/

Verfasst: 24.03.2006 00:42
von Falko
@ts-soft
Der Nachteil daran ist leider, das man immer für solche Keinigkeiten
eine DLL mitliefern muss.
Dabei habe ich gerade etwas gefunden, was über Objekte und Methoden über IsValid() gehen könnte. Siehe dieses C-Beispiel.

http://www.codeproject.com/cs/miscctrl/numedit.asp

Es geht ja nicht darum reine Zahlen mit Punkt und Komma
ins StringGadget zu bekommen, sondern eher darum einen String
dort hinzubekommen, der nur aus Zahlen, Vorzeichen,
Punkt und Komma bestehen darf.
Alles andere sollte nicht einzugeben sein.

Diesen String kann man jederzeit in einer Fliesskommazahl ändern
als auch wieder ins StringGadget zurückschreiben.

Das sollte die Frage wegen "#PB_String_Numeric ??" gegenübergestellt
sein. Da wegen der API leider nur Zahlen akzeptiert werden und mehr nicht.

Das RAD nicht neu erfinden, war auch mein Gedanke. Aber
nicht durch eine DLL, die man immer mitliefern muss.

Das wäre so, als wolle man Zahlen ins StringGadget schreiben wozu
man eine DLL benutzen müsste. :mrgreen:

Vielleicht kann ja jemand diesen C-Source (wahrsch. ein Interface) in PB konvertieren, damit die Einschränkung #PB_String_Numeric vielleicht
so umgangen werden kann.

Vielleicht wäre das auch von Fred möglich diesen C-Source in PB
mit einzubinden.

MfG Falko

Verfasst: 24.03.2006 00:54
von ts-soft
Ich werde mich aber nirgends anmelden um den Source, den man
wahrscheinlich nicht nutzen kann, downzuloaden :mrgreen:

LoadDLLMemory tuts auch :wink:

Verfasst: 24.03.2006 18:33
von H.Brill
Melde mich mal wieder.
Ich habe mit dem Autor der DLL per Mail Kontakt
aufgenommen. Leider hat der den Quellcode (mit MASM
erstellt) nicht mehr. Wollte erreichen, daß er vielleicht
die Funktion von
InitMessages
auf
PB_InitMessages
umstellt, um vielleicht so mit DLL2LIB eine STATIC LIB
herzustellen. Wenn ich die LIB mit IMPORT / ENDIMPORT
einbinde, bekomme ich nen Fehler : unresolved external.
Scheint irgendwie nicht zu gehen. Habs auch schon mit dem
LibraryMaker versucht. Der bringt zwar keinen Fehler aber
PB findet die Funktion auch nicht (logisch -> fehlendes PB_).

Was meint ihr ? Könnte ich es mal mit nem HexEditor versuchen.
Es wird ja kein Code verändert, sondern ich will nur die Funktions-
namen in der DLL bzw. LIB ändern.

Verfasst: 24.03.2006 18:47
von Falko
Versuchen kann man es zwar mit dem Hexeditor, aber veröffentlichen ohne dessen Genehmigung wäre wohl schlecht.

Aber ich habe hier was in Delphi oder Pascal gefunden (mit Interface). Leider kann ich das nicht testen, wie das aussieht. Sieht aber ähnlich wie im obigen Link aus. Der Download ist der Source, der auch auf dieser Seite weiter unten angezeigt wird.

http://www.beensoft.nl/sdp/NumEdit2.htm


MfG Falko

Verfasst: 24.03.2006 19:27
von H.Brill
Natürlich würde ich Frank zuerst fragen, wenn es mir
gelänge. Da es ja Freeware ist, denke ich schon, daß
er zustimmt. Ich hatte ihm schon gesagt, daß er die
LIB im Erfolgsfall in sein Paket mit dazupacken möchte.

Wenn nicht, meinte er, ich soll es mit Subclassing des
Editcontrols versuchen.

Er hat mir auch schon manchen Gefallen getan.

Verfasst: 24.03.2006 20:53
von Falko
Wenn das klappt, wäre ich sehr daran interessiert.

Denn es wäre in PB sehr schön, während der Eingabe
im StringGadget Zahlen(0...9) und Zeichen( - , . ) als
zugelassene Eingabe bekommen kann und nicht die
Einschränkung gebunden an der API nur reine Zahlen
zu überprüfen.

Weis wer, wie das bei Linux gemacht wird. So wie ich
immer lese, kann man unter linux nicht mittels Windows-API
zugreifen, oder irre ich mich da?

Genau wie ts-soft vorher schon sagte, man müsse das RAD nicht
neu erfinden. Am Besten gleich in PB sowas eingebaut und Ruhe
ist im Saal :mrgreen: .

Es wäre doch möglich in PB (Plattformübergreifend)
diese EditBox mit erweiterten Einstellungen zu erstellen,
wenn dieses schon in Linux vielleicht auch eine eigene Routine
ausserhalb der API ist. :roll:


MfG Falko

Verfasst: 24.03.2006 21:02
von ts-soft
Wieso ausserhalb der API in Linux? :freak:
Auch in Linux wird API verwandt. Ein Application Programming Interface wird
es wohl in jedem OS geben :mrgreen:

Verfasst: 24.03.2006 21:10
von H.Brill
Scheint nicht zu funktionieren. Habs nun mit nem
Hexeditor probiert. Die DLL kann ich gar nicht verändern,
da dann DLL2LIB beim Konvertieren abstürzt. Wenn ich
die von DLL2LIB erstellte LIB verändere, erkennt PB
die Funktion nicht. Genauso, wenn ich die vom LibraryMaker
erstellte LIB ändere, habe ich das gleiche Ergebnis.

Ich probier es morgen mal wieder. Hab heut abend nicht
den Sinn dazu (12-Stunden - Arbeitstag).