Prototype oder Import, was ist besser bzw. richtig

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Prototype oder Import, was ist besser bzw. richtig

Beitrag von hjbremer »

Da ich bisher meine Programme ohne Unicode Unterstützung geschrieben habe und ich für ein großes Programm Vista Funktionen nachträglich einbauen will, habe ich mir die Unicode Stringumwandlung für SendMessage_() zu vereinfachen versucht. Zwecks dessen habe ich SendMessage_() importiert.

Nun habe ich 2 Möglichkeiten gefunden, im Code als Version1 bzw. 2 gekennzeichnet

Frage: welche ist besser bzw. korrekter

Frage 2: Und wie ändert man den Font von so einem Command Button

Code: Alles auswählen

;PB  4.4, 4.6, 5.1 Windows Vista 32Bit x86 
;mit/ohne Unicode Option beim Compilieren
;XP Skin Option einschalten !!!

Enumeration
   #window   
   #button1
   #button2
   #liste1
EndEnumeration

;Version 1
Prototype P_BCM_SETNOTE(hwnd, msg, wparam, text.p-unicode)

OpenLibrary(0, "User32.dll")  
Global BCM_SETNOTE.P_BCM_SETNOTE = GetFunction(0, "SendMessageA")
CloseLibrary(0)

Macro ButtonGadgetSetNote(nr, text)      
   BCM_SETNOTE(GadgetID(nr), #BCM_SETNOTE, 0, text)
EndMacro

;Version 2
Import "User32.lib"
   SendMessageA_BCM_SETNOTE(hwnd, msg, wparam, text.p-unicode) As "_SendMessageA@16"
EndImport

Macro ButtonGadgetSetNote2(nr, text)      
   SendMessageA_BCM_SETNOTE(GadgetID(nr), #BCM_SETNOTE, 0, text)
EndMacro

;LV
Import "UxTheme.lib"
   SetWindowTheme(hwnd, AppName.p-unicode, IdList)
EndImport

#BCM_SETNOTE = $00001609
#BS_COMMANDLINK  = $0000000E
#BS_DEFCOMMANDLINK = $000000F

OpenWindow(#window, 150, 100, 600, 300, "")

ButtonGadget(#button1, 20, 20, 211, 50, "#BS_COMMANDLINK", #BS_COMMANDLINK)
ButtonGadgetSetNote(#Button1, "mehr Bla")

ButtonGadget(#button2, 20, 90, 241, 55, "#BS_DEFCOMMANDLINK", #BS_DEFCOMMANDLINK)
ButtonGadgetSetNote2(#Button2, "noch mehr Bla")

flags = #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection ;|#PB_ListIcon_GridLines
ListIconGadget(#liste1, 280, 20, 280, 260, "0", 40, flags)
SetGadgetColor(#liste1, #PB_Gadget_BackColor, $A9F3c8)

SetWindowTheme(GadgetID(#liste1), "Explorer", 0)

For j = 1 To 3
   AddGadgetColumn(#liste1, j, Str(j), 80)
Next   
For j = 0 To 27      
   AddGadgetItem(#liste1, -1, Str(j)+#LF$+"Hans"+#LF$+"Meier"+#LF$+Str(Random(999)))              
Next 

Repeat: event = WaitWindowEvent()                 
Until event = #PB_Event_CloseWindow 
PS: Weiß jemand was man gegen die dicken senkrechten Linien machen kann, bei eingeschaltetem Style
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prototype oder Import, was ist besser bzw. richtig

Beitrag von STARGÅTE »

Mich wunder es das Variante Funktionieren soll, denn wenn du die Library sofort wieder schließt, kannst du ja nicht mehr auf die Funktion zugreifen.

OpenLibrary/CloseLibrary öffnet die Ressourcen extern und der Zugriff ist auch extern.
Bei Import wird die Funktion direkt in die EXE mit einkompiliert.
Das sind also zwei völlig unterschiedliche Sachen, wo du entscheiden musst, was du eigentlich ahben willst.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Prototype oder Import, was ist besser bzw. richtig

Beitrag von ts-soft »

Import oder OpenLibrary ist eigentlich leicht zu beantworten.
Immer, wenn sichergestellt ist, das die Function beim start der Exe zur Verfügung steht,
ist bei den meisten APIs gegeben, aber z.B. UxTheme.dll wird auf Win9x nicht existieren,
ist der Import vorzuziehen.

Ist dies nicht sichergestellt, sollte man OpenLibrary verwenden um Fehlermeldung vom OS und
nicht starten der Exe zu vermeiden. Nur bei OpenLibrary kann man auf den Fehler reagieren.

@STARGÅTE
Die User32.dll, genauso wie die Kernel32.dll werden von PB sowieso immer geladen. Er setzt durch
CloseLibrary() dieser DLLs lediglich den Referenzzähler um eins herunter. Sollte man aber besser
nicht so machen :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Prototype oder Import, was ist besser bzw. richtig

Beitrag von hjbremer »

Vielen Dank für die Antworten, werde also Import benutzen :allright:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten