DELPHI : PROCEDURE SPLIT SIMILAIRE A LA FONCTION EPONYME EN VB

FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009 - 11 févr. 2008 à 10:57
 Keneda - 30 sept. 2014 à 09:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45704-delphi-procedure-split-similaire-a-la-fonction-eponyme-en-vb

var i: integer;
.......
with TStringList.Create do
try
  StrictDelimited:= True; 
  Delimiter:= ';';
  DelimitedText:= 'poux;cailloux;genoux;hiboux;;';  
  for i:= 0 to Count-1 do
     ShowMessage(Strings[i]); 
finally
  Free;
end;
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
6 mars 2008 à 12:08
Procédure revue et corrigée (toute exception sera silencieuse).

procedure TfrmDemo.frmDemoOnActivate(Sender: TObject);
procedure setCursor(hWnd:integer; lpCursorName:PAnsiChar);
var
hCur:integer;
begin
hCur:=LoadCursor(0, lpCursorName);
if (hcur<>0) then begin
SetClassLong(hWnd, GCL_HCURSOR, hCur);
DestroyCursor(hCur);
end;
end;
begin
//Déclare et affiche le caractère de délimitation
Delimiter:=';';
lblDelimiter.Caption:= 'Delimiter: "' + Delimiter + '"';
//Curseur des boutons
setCursor(btnSplit.Handle, IDC_HAND);
setCursor(btnClose.Handle, IDC_HAND);
end;
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
6 mars 2008 à 11:51
Note : les déclarations des l'API utilisées se trouve dans l'unité Windows.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
6 mars 2008 à 10:21
Pour information des lecteurs, voici les spécifications complètes de l'API qui a fait l'objet de la remarque fondée de notre ami Renfield.

Declaration:
Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As String) As Long

Parameters:
· hInstance
Identifies an instance of the module whose executable file contains the cursor to be loaded.

· lpCursorName
Points to a null-terminated string that contains the name of the cursor resource to be loaded. Alternatively, this parameter can consist of the resource identifier in the low-order word and zero in the high-order word. The MAKEINTRESOURCE macro can also be used to create this value.
To use one of the Win32 predefined cursors, the application must set the hInstance parameter to NULL and the lpCursorName parameter to one the following values:
IDC_APPSTARTING
Standard arrow and small hourglass
IDC_ARROW
Standard arrow
IDC_CROSS
Crosshair
IDC_IBEAM
Text I-beam
IDC_ICON
Obsolete for applications marked version 4.0 or later.
IDC_NO
Slashed circle
IDC_SIZE
Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SIZEALL
Four-pointed arrow
IDC_SIZENESW
Double-pointed arrow pointing northeast and southwest
IDC_SIZENS
Double-pointed arrow pointing north and south
IDC_SIZENWSE
Double-pointed arrow pointing northwest and southeast
IDC_SIZEWE
Double-pointed arrow pointing west and east
IDC_UPARROW
Vertical arrow
IDC_WAIT
Hourglass

Return values :
If the function succeeds, the return value is the handle of the newly loaded cursor.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
6 mars 2008 à 09:56
Le "finally" est toujours exécuté même si une exception est levée. Dans ce cas, effectivement, il n'est pas vraiment nécessaire.

A+,
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 mars 2008 à 09:47
je parle du try finally
est-ce réellement indiqué ici, dans la mesure ou tu ne fait qu'utiliser des APIs

au pire, elles renverront des codes indiquant une erreur...


enfin, y'a pas lieu de s'attarder là, j'ai juste vu passer ce commentaire sur la source, ca m'a intrigué.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
6 mars 2008 à 09:42
Bonjour l'artiste,

Je ne comprends pas ta remarque car cette procédure ne génère aucune exception (Delphi7 ou 2007). D'ailleurs, il s'agit d'une transcription en Pascal d'une proc. très connue par les programmeurs VB. Il faudrait détailler le contexte et son usage.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 mars 2008 à 22:56
try
hCur:=LoadCursor(0, lpCursorName);
SetClassLong(hWnd, GCL_HCURSOR, hCur);
finally
DestroyCursor(hCur);
end;

.... je codes en VB, pas en Delphi, mais... je trouve étrange de constater, à la leccture de ce code, que les API semblent générer des exceptions....
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
5 mars 2008 à 11:40
En aparté, vous pouvez notez la manière de récupérer un curseur système différent d'un curseur Delphi :

procedure TfrmDemo.frmDemoOnActivate(Sender: TObject);
procedure setCursor(hWnd:integer; lpCursorName:PAnsiChar);
var
hCur:integer;
begin
try
hCur:=LoadCursor(0, lpCursorName);
SetClassLong(hWnd, GCL_HCURSOR, hCur);
finally
DestroyCursor(hCur);
end;
end;
begin
//Déclare et affiche le caractère de délimitation
Delimiter:=';';
lblDelimiter.Caption:= 'Delimiter: "' + Delimiter + '"';
//Curseur des boutons
setCursor(btnSplit.Handle, IDC_HAND);
setCursor(btnClose.Handle, IDC_HAND);
end;
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
13 févr. 2008 à 14:51
La conversion de la procédure en fonction donnerait la signature suivante :

function Split(const Delimiter: char; DelimitedText: string): TStrArray;

Il n'y a donc pas de quoi fouetter un chat pas plus que l'élargissement du caractère de délimitation à un type string. L'ajout d'autres paramètres ne présente pas à mon point de vue un trés grand intérêt. C'est pourquoi, après réflexion et correction du titre, je ne pense pas surcharger la méthode présentée.

Cordialement,
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
12 févr. 2008 à 11:08
Split(expression[, delimiter[, limit[, compare]]])

Alors, effectivement, vos souvenirs sont bons. Je n'ai pas le temps actuellement de surcharger cette méthode et d'écrire une procédure réellement semblable. Mais je vous promets de m’y atteler dès que possible.
cs_pascal99 Messages postés 24 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 20 janvier 2009
12 févr. 2008 à 10:28
Bonjour,
si mes souvenirs de VB sont bons, split est une fonction et delimiter une string (il peut etre compose de plusieurs caracteres) dont la valeur par defaut est l'espace.

Ce serait bien de modifier votre procedure en fonction.

Bons codes
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
11 févr. 2008 à 15:55
Erratum :
la longueur maximum du tableau dynamique est naturellement de 256 éléments.
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
11 févr. 2008 à 11:27
Par suite, il est possible de réduite l'emploi de setLength en déclarant d'abord la longueur maximum (255) puis la longueur effective trouvée (k).
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
11 févr. 2008 à 10:57
L'utilisation de SetLength limite la longueur du tableau à 255 éléments. "NewLength doit avoir une valeur comprise entre 0 et 255".
Rejoignez-nous