5.40 b2 Je ne comprend plus grand chose aux string ...

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Anonyme2 »

Salut à tous.

Je comprend vite mais faut m'expliquer longtemps :?

J'ai installé la 5.40 b2 et j'essaye de compiler mon projet mais toujours sans y arriver.
J'ai rien trouvé dans le fichier d'aide fr, le site svn est imbuvable pour moi...

Qui peut m'expliquer clairement comment on gère les chaines sur les exemples suivants :

J'utilise la lig nx_splitter de Srod qui fonctionne sans plantage:

La ligne suivante fonctionne jusqu'à pb 5.31

Code : Tout sélectionner

SetProp_(hWnd, @"nxSPLITTER_PROP", *nx)
J'ai tout modifier comme ceci :

Code : Tout sélectionner

SetProp_(hWnd, "nxSPLITTER_PROP", *nx)
là ça compile (je ne sais pas si ça fonctionnera puisque je n'ai pas pu compiler mon projet).

si on se réfère à la doc MS, le second paramètre est de type : LPCTSTR voire un atom
A null-terminated string or an atom that identifies a string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom must be placed in the low-order word of lpString; the high-order word must be zero.
donc un pointeur sur une chaine ou aussi un atom identifiant une chaine.

Je pense que l'expression suivante est correcte mais j'ai une erreur (je me trompe peut-être):

Code : Tout sélectionner

SetProp_(hWnd, @"nxSPLITTER_PROP", *nx)
On doit forcément passer une valeur numérique et jamais @"xxxx" ?

Ensuite dans ma librairie de gestion des menu couleur, j'ai :

Code : Tout sélectionner

 DrawText_(DC, Texte + (llen + 1)*SizeOf(Character), rlen, *Item, #DT_EXPANDTABS | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP | #ES_RIGHT)
et j'ai une erreur "Parenthèses interdite dans une opération de chaine" ......
si on se réfère à la doc MS de DrawText, le second paramètre est de type : LPCTSTR
A pointer to the string that specifies the text to be drawn.
si c'est un pointeur, pourquoi on ne peut pas faire un calcul sur le pointeur ?

Je tente une seconde approche avec un Peeks

Code : Tout sélectionner

DrawText_(DC, PeekS(Texte + (llen + 1)*SizeOf(Character)), rlen, *Item, #DT_EXPANDTABS | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP | #ES_RIGHT)
mais là encore j'ai la même erreur de compilation : "Parenthèses interdite dans une opération de chaine"

alors une nouvelle approche :
je défini une chaine :

Code : Tout sélectionner

Protected mlkj$ = ""
 mlkj$ = PeekS(@Texte + (llen + 1)*SizeOf(Character))
et là ca compile et le @ est bien pris en compte avec PeekS

là je perd le fil , le @est uniquement interdit pour l'utilisation des API mais pas des fonctions PB ?

Si on veut faire évoluer le pointeur de chaine, il faudra recréer à chaque fois une chaine pour la passer ?

j'aimerais une explication sur la nouvelle gestion des chaines avant de modifier mes 78000 lignes de code.

Merci
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par PAPIPP »

Bonjour Denis

Ici les modifications sur les chaines dans l’appel des APIs
Si cette information est insuffisante proposez le PB à FRED

http://www.purebasic.fr/english/viewtop ... =4&t=62995
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Anonyme2 »

Merci PAPIPP

Dommage que c'est du suédois, il me semble l'avoir déjà lu mais je ne me souviens pas d'avoir les réponses.
Je vais jeter un oeil mais pourquoi rien en français ?

c'est une modif majeure!

que de temps perdu ...

Une page d'explication dans la doc française ne serait pas un luxe.
Je sais, rien n'est parfait en ce bas monde :D

Sinon ma demande est essentiellement pour Fred car lui sait ce qu'il a changé, moi pas vraiment.

Encore une demande, ca serait bien de pouvoir installer PB en pouvant obtenir les fichiers chm anglais et français ou autre sans avoir à faire une autre install dans une autre dossier pour récupérer le fichier d'aide en anglais.

Merci
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Micoute »

Denis a écrit :On doit forcément passer une valeur numérique et jamais @"xxxx" ?
Bonjour Denis, je vais essayer de t'aider, chez moi ça fonctionne, avant ceci fonctionnait

Code : Tout sélectionner

size=MultiByteToWideChar_(#CP_ACP,0,ansi,Len(ansi),"","")
maintenant avec cette syntaxe, ça fonctionne

Code : Tout sélectionner

  *ansi = AllocateMemory(SizeOf(String))
  size=MultiByteToWideChar_(#CP_ACP,0,*ansi,Len(ansi),#Null,#Null)
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Fred »

En effet, pour SetProp_() je pense que c'est mieux de laisser le pointeur plutot que de forcer un string, car on peut specifier un ATOM aussi. De meme pour DrawText_() qui peut accepter un buffer en sortie sur le meme parametre ! Je vais modifier ca. N'oubliez pas que c'est toujours une version beta, donc tout est modifiable.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Anonyme2 »

Je te remercie Micoute pour ta peine.

Je comprend bien le problème, ta solution.
Je peut contourner de plusieurs manières par exemple en ouvrant directement la librairie (à vérifier) ou en utilisant un prototype qui permet de passer le même argument de différente manière.

En fait c'est incohérent de considérer le pointeur comme une chaine, quand bien même c'est le cas alors pourquoi le peeks() directement ne fonctionne pas dans drawtext alors qu'il fonctionne avec une variable string ? Ou alors je passe à côté, c'est possible.

Ce que je cherche c'est pas de contourner car j'y arriverais mais j'aime comprendre ce que je fait :lol:

Dès que j'aurais compris tout ça je passe à 5.40. :oops:

@Fred
Je viens de voir ta réponse.

Que veux-tu, avec l'âge je deviens exigeant.

j'aimerais utilise la lib vector /gdi+, c'est cool, le canvasgadget manquait lorsque j'ai fait les exemples gdi+ pour redessiner correctement.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Ollivier »

Denis a écrit :que de temps perdu ...
Bonjour Denis,

quel type de temps perds-tu?

-> un temps à refaire à la main
ou
-> un temps à créer un convertisseur

?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Anonyme2 »

Oui pour moi mais aussi Fred qui répond à droite à gauche, aux autres codeurs qui posent des questions similaires etc.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Anonyme2 »

Même problèmes avec la 5.40 b3.

Setprop et drawtext fonctionnent mais il y a surement des milliers d'API avec ce genre de paramètres, le problème est beaucoup plus profond que quelques API.

Pour l'instant c'est impossible de compiler mon projet, API DrawTextEX() qui est la copine de DrawText(), CreateDC() ne fonctionnent pas et j'en ai vu d'autres en lisant la doc MS.

Je ne sais pas pourquoi c'est devenu si compliqué d'utiliser une API MS avec cette version. Les règles de microsoft sont simples, un pointeur c'est un pointeur et pas une chaine. Les pointeurs de certaines API peuvent être mis à 0 en fonction d'autres paramètres de l'API, voire récupérer une valeur, alors que le compilo attend une chaine.

Fred, tu as surement une bonne raison mais franchement on ne sais pas pourquoi.

Comme je ne connais pas les règles de PB, ça devient pénible alors je reste sur la version précédente pour l'instant car à la compilation j'ai une erreur toute les 30 lignes alors j'arrête de modifier.

EDIT

Je rajoute que je ne suis encore pas parvenu à compiler mon code propre de PureIconManager, je bloque sur ma librairie des menus.

J'utilise aussi une interface IStorage et IStream alors là je me demande comment ça va se passer ...

J'ai vu hier des choses sur les prototype qui m'inquiètent car j'en utilise quelques uns dont certains passent des paramètres différents.
Je commence à avoir mal à la tête ...

Code : Tout sélectionner

;// éditeur d'icônes : Les prototypes
Prototype.i PIM_Init(*GetProcessHeap, HeapCompatibilityInformation, *HeapFragValue, SizeOf_HeapFragValue)
Prototype.i Callback_PIM_EnumResourceGroupName_NE_File(hModule1, IconeInfos$, GroupeId1, lParam1, Is_GroupeName = #True)

Prototype.i Callback_PIM_EnumResourceGroupName_PE_File(hModule1, Nom_Groupe1$, GroupeId1, lParam1)

;// prototype d'un objet Istorage pour créer un stream Istream
Prototype.i PIM_StgCreateStorageEx_Obect(valeur_Nulle, Constante_STGM_R_W, Constante_STGM_Storage, valeur_Nulle1, valeur_Nulle2, valeur_Nulle3, IID_IStorage, *storage)

Prototype.i PIM_Save_PIMRessource_To_ICO_Stream_StgCreateStorageEx(valeur_Nulle, Constante_STGM_R_W, Constante_STGM_Storage, valeur_Nulle1, valeur_Nulle2, valeur_Nulle3, IID_IStorage, *storage)
Prototype.i SaveIcon_To_Stream_StgCreateStorageEx(valeur_Nulle, Constante_STGM_R_W, Constante_STGM_Storage, valeur_Nulle1, valeur_Nulle2, valeur_Nulle3, IID_IStorage, *storage)
Prototype.i Save_NE_GROUPES_TO_Stream_StgCreateStorageEx(valeur_Nulle, Constante_STGM_R_W, Constante_STGM_Storage, valeur_Nulle1, valeur_Nulle2, valeur_Nulle3, IID_IStorage, *storage)
Prototype.i PIM_Creation_Ressource_FOR_ICO_SpecificIcons_StgCreateStorageEx(valeur_Nulle, Constante_STGM_R_W, Constante_STGM_Storage, valeur_Nulle1, valeur_Nulle2, valeur_Nulle3, IID_IStorage, *storage)
Prototype.i PIM_EnumResourceNames_ICO_File(*hModule1, *i1, *lParam1)
Prototype.i PIM_EnumResourceNames_NE_File(hModule1, ResType1, Id1, lParam1)
Prototype.i PIM_EnumResourceNames_NE_File_SpecificIcons(hModule1, ResType1, Id1, List Specific_IconId_Add1.IconId())

Prototype.i Enum_GroupID_In_PE_File(hModule1, ResName1, valeur_Nulle)



;Prototype.i PIM_EnumResourceTypes_NE_File(hModule1, ResType1, lParam1)
Prototype.i PIM_Create_Ico_File_After_deleting_operations(valeur_Nulle, Constante_STGM_R_W, Constante_STGM_Storage, valeur_Nulle1, valeur_Nulle2, valeur_Nulle3, IID_IStorage, *storage)

Prototype.i ProtoUpdateResource_ASCII(hUpdate, *lpName, lpName, wLanguage, Titre.p-ascii, cbData)
Prototype.i Delete_Group_Names_From_PE(hUpdate, *lpName, lpName, wLanguage, Titre, cbData)

;// retrouve la langue des icônes format PE
Prototype Get_Icon_Numeric_ID__Language_From_PE_File(*hModule, ResType, Resname, *lpEnumFunc, *info.InfosResource9)
Prototype Get_Icon_String_ID__Language_From_PE_File(*hModule, ResType, Resname$, *lpEnumFunc, *info.InfosResource9)

;// retrouve la langue du groupes 301 (noms de groupe) format PE
Prototype Get_Group_Names__Language_From_PE_File(*hModule, restype, Resname, *lpEnumFunc, *langue)

;// énumération pour icone à supprimer scrollarea format NE
Prototype Enum_SelectedGroup_For_ScrollArea_Supression_In_NE_File_To_Get_GRPICONDIR(*hModule.PIM_LoadFileToMemory_EX, ResType, ResName, List SelectedGroupIconId_Ex.InfosResource5())

;// utilisé pour supprimer les icônes du scrollarea pour les formats PE
Prototype Supprime_Icons_Of_ScrollArea_From_PE(hModule, ResType, *lpEnumFunc, List Selected_IconId.Icons_To_Remove_From_PE())

Prototype Delete_IconGroup_From_PE_File(hModule, ResType, *lpEnumFunc, List SelectedGroupIconId.Groups_To_Remove_From_PE())

Prototype Delete_IconGroup_Numeric_ID__Language_From_PE_File(hModule, ResType, Resname, *lpEnumFunc, List SelectedGroupIconId.Groups_To_Remove_From_PE())

Prototype Delete_IconGroup_String_ID__Language_From_PE_File(hModule, ResType, Resname$, *lpEnumFunc, List SelectedGroupIconId.Groups_To_Remove_From_PE())

Prototype Delete_Icon_Numeric_ID__Language_From_PE_File(hModule, ResType, Resname, *lpEnumFunc, List SelectedIconId.Icons_To_Remove_From_PE())

Prototype Delete_Icon_String_ID__Language_From_PE_File(hModule, ResType, Resname$, *lpEnumFunc, List SelectedIconId.Icons_To_Remove_From_PE())

Prototype Enum_Count_IconsOnlyFrom_SelectedGroup_In_PE_File(hModule, ResType, *lpEnumFunc, List SelectedGroupIconId.i())

Prototype Enum_Add_Icl_UnNamedSelected_Group(hModule, ResType, *lpEnumFunc, List SelectedGroupIconId.i())

Prototype Supprime_Icons_Of_Selected_Groups_From_PE(hModule, ResType, *lpEnumFunc, List SelectedIconId.Icons_To_Remove_From_PE())

Prototype Enum_Count_IconsOnlyFrom_SelectedGroup_In_NE_File(hModule, ResType, *lpEnumFunc, List SelectedGroupIconId.i())

Prototype Enum_SelectedGroup_In_NE_File_To_Get_GRPICONDIR(*hModule, ResType, *lpEnumFunc, List SelectedGroupIconId_Ex.InfosResource5())

Prototype Enum_SelectedGroup_In_PE_File_To_Get_ICONDIRENTRY(*hModule, ResType, ResName, List SelectedGroupIconId_Ex.InfosResource7())

Prototype Enum_SelectedGroup_In_ICO_File_To_Get_ICONDIRENTRY(*hModule, ResName, List SelectedGroupIconId_Ex.InfosResource8())

Prototype TaskDialog(nHWND, hInstance, *cTitle_x, *cDescription_x, *cContent_x, dwCommonButtons.l, nIcon_x, *pnButton)

Prototype TaskDialogIndirect(*tdlgx.TASKDIALOGCONFIG, *ClickedButtonx, *SelRadiox, *fVerifyx)

Prototype.i PIM_Affiche_Icone_Represantant_Le_Groupe_Icones_Format_PE(hModule1, chaine$, ResName1, valeur_Nulle, valeur_Nulle1)


;// les prototypes des thèmes
Prototype.i GetWindowTheme(Hwnd)
Prototype.i SetWindowTheme(Hwnd, *pt1, *pt2)
Prototype.i IsAppThemed()

CompilerIf Not Defined(GdiplusStartup, #PB_Prototype)
      Prototype.i GdiplusStartup(*token, *input.GdiplusStartupInput, *output.GdiplusStartupOutput)
CompilerEndIf

Prototype GdipLoadImageFromStream(*Istream, *image)
Prototype GdipGetImageWidth(*image, *Width)
Prototype GdipGetImageHeight(*image, *Height)
Prototype GdipCreateHBITMAPFromBitmap(*image, *imageid, background)
Prototype GdipDisposeImage(*image)

CompilerIf Not Defined(GdiplusShutdown, #PB_Prototype)
      Prototype.i GdiplusShutdown(*token)
CompilerEndIf

Prototype GdipCreateBitmapFromScan0(width, height, stride, format, *scan0, *bitmap)

CompilerIf Not Defined(GdipCreateFromHDC, #PB_Prototype)
Prototype.i GdipCreateFromHDC(*hdc, *graphics)
CompilerEndIf


CompilerIf Not Defined(GdipDeleteGraphics, #PB_Prototype)
Prototype GdipDeleteGraphics(*graphics)
CompilerEndIf

Prototype GdipDrawImageRectI(*gfx, *image, x, y, Width, Height)
Prototype GdipGetImageGraphicsContext(*image, *graphics)
Prototype GdipSaveImageToStream(*image, *stream, *clsidEncoder, *encoderParams)
Prototype GdipSaveImageToFile(*image, filename.p-unicode, *clsidEncoder, *encoderParams) 

Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Fred »

Les prototypes ne sont pas affectés par cette version, seulement les API automtiquement importées (avec un '_' a la fin du nom). Il n'y a rien de magique dedans, quand une API attend une chaine, on met une chaine PB, ou #Null$ si tu veux mettre 0. PB est fait pour etre facile a utilisé, ce n'est pas du C où tout est pointeur.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par nico »

C'est un parti pris, la manipulation des API nécessite un niveau intermédiaire, la doc des API sur MSDN donne les types d' arguments connus et universelles du langage C/C++, la nécessité de reconvertir pour l'adapté au système PureBasic ne me semble pas du tout au premier abord un plus. Autant respecter la doc MSDN à ce sujet, non?

Ce qui sert aux API, sert aussi aux traitements des messages dans une callback, tout cela fait un tout.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par G-Rom »

je comprend pas le problème :

Code : Tout sélectionner

MessageBox_(0,"foo","foo",0)
Fonctionne très bien sur la 5.4 , plus besoin de passer par des pointeurs avec @ avant le string.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Ollivier »

@G-Rom

D'accord, mais est-ce que tu comprends la logique bien limitée avec quelques mots pour convertir d'une version antérieure à la version 5.40?

Est-ce que c'est régulier? Et les précisions de retour, quelle doivent-elles être précisément?

Si Denis, il faut qu'on ponde un code de conversion/retour de défaut...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par Anonyme2 »

Ollivier a écrit : Si Denis, il faut qu'on ponde un code de conversion/retour de défaut...
Je pense passer par des fonctions en assembleur pour contourner, j'ai plusieurs API dont le paramètre est un pointeur sur une chaine et pas une chaine.
Ces pointeurs évoluent dans mon code, alors si à chaque fois il faut recréer une chaine ....
Pourquoi ne pas empiler la chaine sur la pile lors de l'appel?

je me suis écrit un bout de code pour lister mes API et j'adapterais pour celles que le compilateur rejette. mais que de boulot...

J'en ai vu d'autres en consultant la doc MS, je pense qu'il y en a des centaines voire plus. qui elles aussi peuvent accepter d'autres valeurs qu'un 0 et dont le pointeur est en entrée/sortie.

Ou alors ouvrir directement les dll et si problème utiliser les prototypes. Mais quel bordel, tout ça pour ça...

Fred, simplement, si utiliser les API comme MS le permet te gène, alors supprime les imports, on n'utilisera que les fonctions PB.
Mais à chaque API une fonction PB, moi ça me va, avec une syntaxe qui permet de passer ce qui est possible pour chaque API.

Sérieusement, pour les codeurs qui veulent sortir des fonctions toutes prêtes, pourquoi compliquer la syntaxe ?
Tu sais utiliser une API, tu gères, tu sais pas tu passes ton chemin...
Fred a écrit :Les prototypes ne sont pas affectés par cette version, seulement les API automatiquement importées (avec un '_' a la fin du nom).
Mais pourquoi ? seules ces API importées de cette manière et pas les fonctions PB ? et si on ouvre directement les dll, on n'a plus de souci ? Si c'est le cas, je vais travailler comme ça...
Et si on utilise pour chaque API un proto, on n'a plus de souci de syntaxe PB. Si c'est le cas c'est une bonne option.

Pourquoi ne pas supprimer les pointeurs, plus de soucis pour personne. Franchement je ne vois pas ou tu veux en venir.

Si on sait utiliser une API, alors on peut gérer soi-même. Il faut vraiment se tirer une balle dans le pied ?
Il ne s'agit pas d'envenimer les choses, mais d'exprimer un avis différent de Fred.
G-Rom a écrit :je comprend pas le problème :
C'est bien pour toi, mais je pense pas être le seul à dire que l'on régresse. Il faudra supprimer de la doc toutes les phrases "pour codeurs avancés"...

lit les posts ici http://www.purebasic.fr/english/viewtop ... 5&start=45
tu verras que c'est pénible pour d'autres que moi.

Je ne prend pas souvent la parole mais là je pense que c'est très important.

Si on ne veut pas que cela ressemble à du C etc;, faut tout retirer, les interfaces, les pointeurs et appliquer stricto sensu la norme du basic.

Fred, je ne pense pas que tu parviennes à me convaincre, car les modifs devraient être plus profondes pour ne pas coller à tel ou tel language.
Supprimer aussi l'asm, procedureC, procedureDllC etc. etc.

Le débat est ouvert, mais j'aime toujours PB et depuis 15 ans :wink:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 5.40 b2 Je ne comprend plus grand chose aux string ...

Message par G-Rom »

là je perd le fil , le @est uniquement interdit pour l'utilisation des API mais pas des fonctions PB ?
Effectivement & en lisant la doc msdn :
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
C'est des pointeurs, je suis aller un peu vite en besogne.
Répondre