ProDeveloppeur
Messages postés5Date d'inscriptionmercredi 8 octobre 2008StatutMembreDernière intervention27 septembre 2010 5 nov. 2008 à 18:10
Pourquoi le fichier RegisterTrayIcons.pas manque dans le téléchargement ??????? Il est demandé pour l'installation du composant TCoolTrayIcon
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 16 sept. 2008 à 20:38
Hmm Francky, je suis en train de faire le composant ...
Je ne vois pas comment récupérer le contenu de la page avec un GET ...
Pourrais-tu me donner des pistes supplémentaires ?
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 31 juil. 2008 à 20:02
"Enfin, pourquoi ne pas aller plus loin avec le composant "CoolTrayIcon" et afficher l'Ip sur 4 icons dans la TrayIcon avec sens de lecture de l'Ip." cette méthode à déjà été abordée par un source, et je ne vais pas faire preuve d'originalité si je plagie :o.
Et de plus pour ceux qui aiment avoir un PC propre et rapide, 4 icônes pour 1 application dans la zone de notif. n'est pas terrible :o (pensez à mon père ... :x)
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 31 juil. 2008 à 20:00
Bonsoir,
Cincap je vais essayer les propriétés IconIndex + une imagelist, en plus l'avantage c'est qu'il n'y a plus besoin de trimbaler 3 icônes avec l'appli :)
Merci, je vais arranger ça dès que possible.
Cordialement, Bacterius !
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 28 juil. 2008 à 16:22
@ Bacterius,
En utilisant les propriétés du composant TCoolTrayIcon et un TimageList, il y a moyen de lui faire afficher les 3 icons.
Avec cette modification, l'application à l'air stable.
procedure TMainForm.UpdateSysTray(szTip: Pchar;IconID: TState);
begin
case IconID of
Connected: TrayIcon.Iconindex := 1;
Connecting: TrayIcon.Iconindex := 0;
Disconnected: TrayIcon.Iconindex := 2;
end;
TrayIcon.Hint := SzTip;
end;
@+,
Cincap
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 28 juil. 2008 à 12:15
Bonjour à toutes et à tous,
Après test sur WinXp pack3 et Delphi6, je constate que les 2 adresses Ip sont les mêmes alors qu'il devrait avoir une différence d'un chiffre entre l'Ip du serveur et l'Ip du client.
On peut le vérifier avec le bouton "Démarrer" puis "Connexions" puis "afficher toutes les connexions" et dans "Accès à distance" le click droit sur sa connexion, Statut puis onglet détail.
Bug à la fermeture de l'application.
Pour ma part, j'utilise le mutex pour ne lancer qu'une seule fois l'application, il y a peut être mieux !
Enfin, pourquoi ne pas aller plus loin avec le composant "CoolTrayIcon" et afficher l'Ip sur 4 icons dans la TrayIcon avec sens de lecture de l'Ip.
@+,
Cincap
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 27 juil. 2008 à 19:13
Lol je viens d'essayer la variable globale, on reçoit toujours l'erreur AV ...
je crois que je vais laisser l'icône errer dans la mémoire plutôt que de chercher à résoudre ce problème lol.
Non je lol je continue à chercher ^^
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 27 juil. 2008 à 19:08
Bonsoir,
ah oui en effet bien vu Mardi4Fr !
Je viens de récuperer mon Delphi et je cherchais justement cette Access Violation.
Mais il y a une fuite de mémoire dans ce cas ... car sans I.Free, I est recréée sans cesse, et n'est pas détruite. Eventuellement faire une variable SysIcon globale, à créer au lancement de l'appli, et détruite à la fermeture ? c'est peut-être une solution.
Encore merci Mardi4Fr :)
Cordialement, Bacterius !
mardi4fr
Messages postés2Date d'inscriptionmercredi 10 mars 2004StatutMembreDernière intervention27 juillet 2008 27 juil. 2008 à 19:03
Bonjour ,
En supprimant dans la procedure TMainForm.UpdateSysTray
cette ligne I.Free ,j'ai plus l'erreur AV .
moi je sais pas si le composant s'installe ou pas ...
je les installes quasiment jamais ^^
je compile en ligne de commande ce qui m'évite de surcharger l'IDE par contre pour modifier le code il faut passer par un éditeur externe (Ex. NotePad++) ... mais ça le fait ;)
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 26 juil. 2008 à 14:22
Bonjour,
c'est quand même bizarre que certaines personnes y arrivent et pas d'autres. Si tu es sur Delphi 6 alors il faut ouvrir le paquet : CoolTrayIcon_D6plus.dpk
Et voila normalement ça s'installe, penaud ...
Essaye ça et si tu as encore des problèmes ... dis le nous :p
Cordialement, Bacterius !
nethacker
Messages postés288Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention12 octobre 2011 26 juil. 2008 à 14:08
Bonjour j'arrive pas à installer Tcooltrayicon ! enfin c'est compilé dans le paquet, mais c'est pas dans la palette ! par contre pas de problèmes avec tous les autres!
et c'est sur D6 xD
Merci !
Francky23012301
Messages postés400Date d'inscriptionsamedi 6 août 2005StatutMembreDernière intervention11 février 20161 25 juil. 2008 à 17:18
Le composant est déja fais : tu copie le code dans le blockNote et tu l'enregistre sous IPAddress.pas et d'installer le composant normalement.
Ensuite : tu as juste à mettre function GETIP(Var FileText:TStringList): boolean; (désolé d'avoir oublié Var FileText:TStringList) dans le private et de finir de coder cette fonction en utilisant le protocole HTTP (Voir Iprelax.com).
type
TIPAddress = class(TComponent)
private
Sock: TSocket;
function ResolveIP(Const AURL: string): string;
function GETIP(Var FileText:TStringList): boolean; //ICI
protected
FPort: cardinal;
FURL: string;
public
Tu n'as plus grand chose à faire
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 25 juil. 2008 à 17:15
Si je peux me permettre encore un petit conseil, Bacterius...
Ton source est sans doute un très bon exercice pour toi et j'espère que les conseils de notre communauté te font progresser. Mais il a un gros défaut qui empêche sans doute beaucoup d'entre nous de le tester. C'est qu'on a déjà vu le sujet traité plusieurs fois sur ce site.
Tu aurais pu, avec le même principe, faire preuve d'un peu plus d'originalité. Par exemple un programme qui te prévient quand une nouvelle question est posée sur le forum de delphifr ou un truc du même genre.
Tu aurais appris tout autant et peut-être même plus; et ça aurait intéressé beaucoup plus de monde.
Essaie d'appliquer ce principe à l'avenir. Ce sera davantage profitable pour tout le monde.
D'ailleurs, rien ne t'empêche d'essayer de coder l'idée que je viens de te donner, maintenant que tu es à l'aise dans ce genre de problèmes ;)
En tout cas, on te voit progresser à vu d'oeil.
Bravo, et continue comme ça!
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 25 juil. 2008 à 16:20
Bonjour,
@Caribensila : merci pour le code du RunOnce, c'est vrai qu'il est plutôt facile (vu ton code) à mettre en fonction, alors qu'un composant est beaucoup plus gênant (il faut l'installer, etc ...)
Merci :)
@Francky : merci d'essayer de m'aider pour le composant, je comprends le principe, mais, je ne connais rien à la conception de composants, et je doute que j'aie le niveau de programmation necessaire pour pouvoir en faire. Mais je vais quand même essayer de voir comment je pourrais faire pour le composant.
Merci à vous deux :)
Je vais travailler dessus dès que possible, mais là je réinstalle Windows sur mon ordinateur, et je ne peux donc rien faire pour l'instant, je pourrai m'y mettre ce soir ou demain :p
Je suis sur l'ordinateur d'un ami ^^
Cordialement, Bacterius !
Francky23012301
Messages postés400Date d'inscriptionsamedi 6 août 2005StatutMembreDernière intervention11 février 20161 25 juil. 2008 à 15:54
Voila le début d'un composant pour récupérer l'IP Internet en utilisant les WinSockets :
type
TIPAddress = class(TComponent)
private
Sock: TSocket;
function ResolveIP(Const AURL: string): string;
protected
FPort: cardinal;
FURL: string;
public
function Connect: boolean;
function Disconnect: boolean;
function Connected: boolean;
function Error: string;
function ReceivedString(Const AString: string): boolean;
function SendString(AString: string): boolean;
Constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property PORT: cardinal Read FPort Write Fport;
property URL: string Read FURL Write FURL;
{ Published declarations }
end;
var
State: integer = 1;
WSAData: TWSAData;
SockAddrIn: TSockAddrIn;
Answer:String;
const
CRLF = #13#10;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TEST, [TIPAddress]);
end;
constructor TIPAddress.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
WSAStartUp(257, WSAData);
state := 0;
end;
destructor TIPAddress.Destroy;
begin
WinSock.closesocket(Sock);
WSACleanup();
state := 0;
inherited Destroy;
end;
function TIPAddress.ResolveIP(Const AURL: string): string;
type
TAPInAddr = array [0..100] of PInAddr;
PAPInAddr = ^TAPInAddr;
var
Index: integer;
WSAData: TWSAData;
HostEnt: PHostEnt;
PInAddr: PAPInAddr;
begin
Result := '';
WSAStartUp($101, WSAData);
try
HostEnt := GetHostByName(PChar(AURL));
if HostEnt <> nil then
begin
PInAddr := PAPInAddr(HostEnt^.h_addr_list);
Index := 0;
while PInAddr^[Index] <> nil do
begin
Result := (inet_ntoa(PInAddr^[Index]^));
Inc(Index);
end;
end;
except
end;
WSACleanUp();
end;
function TIPAddress.Connect: boolean;
begin
State := 0;
Result := False;
sock := Winsock.Socket(AF_INET, SOCK_STREAM, 0);
if sock <> winsock.INVALID_SOCKET then
begin
with SockAddrIn do
begin
sin_family := AF_INET;
sin_port := htons(Fport);
sin_addr.S_addr := inet_addr(PChar(ResolveIP(FURL)));
end;
if Winsock.Connect(sock, SockAddrIn, SizeOf(SockAddrIn)) <> Socket_Error then
begin
State := 1;
Result := True;
end;
end;
end;
function TIPAddress.Disconnect: boolean;
begin
Result := False;
if winSock.closesocket(Sock) <> Winsock.SOCKET_ERROR then
begin
State := 0;
Result := True;
end;
end;
function TIPAddress.Connected: boolean;
begin
if State = 1 then
Result := True
else
Result := False;
end;
function TIPAddress.ReceivedString(Const AString: string): boolean;
var
StringReceived: array [0..2048] of char;
begin
ZeroMemory(@StringReceived[0], SizeOf(StringReceived));
winsock.Recv(Sock, StringReceived, SizeOf(StringReceived), 0);
if (Copy(StringReceived, 1, 3) <> Astring) then
Result := False
else
Begin
Result := True;
Answer:=StringReceived;
Delete(Answer,Pos(AString,Answer),length(AString));
End;
end;
function TIPAddress.SendString(AString: string): boolean;
begin
if winsock.Send(Sock, AString[1], Length(AString), 0) = winsock.SOCKET_ERROR then
Result := False
else
Result := True;
end;
function TIPAddress.Error: string;
begin
case winsock.WSAGetLastError of
10004: Result := 'Interrupted function call.';
10013: Result := 'Refused permission.';
10014: Result := 'Bad address.';
10022: Result := 'Invalid Arguments.';
10024: Result := 'Too many open files.';
10035: Result := 'Resource temporarily unavailable.';
10036: Result := 'peration in progress.';
10037: Result := 'Operation already in progress.';
10038: Result := 'Socket operation or no-socket.';
10039: Result := 'Destination address required.';
10040: Result := 'Too long message .';
10041: Result := 'Protocol wrong type for socket.';
10042: Result := 'Bad protocol option.';
10043: Result := 'Protocol not supported.';
10044: Result := 'Socket type not supported.';
10045: Result := 'Operation not supported.';
10046: Result := 'Protocol family not supported.';
10047: Result := 'Address family not supported by protocol family.';
10048: Result := 'Address already in use.';
10049: Result := 'Cannot assign requested address.';
10050: Result := 'Network is down.';
10051: Result := 'Network is unreachable.';
10052: Result := 'Network dropped connection on reset.';
10053: Result := 'Software caused connection abort.';
10054: Result := 'Connection reset by peer.';
10055: Result := 'No buffer space available.';
10056: Result := 'Socket is already connected.';
10057: Result := 'Socket is not connected.';
10058: Result := 'Cannot send after socket shutdown.';
10060: Result := 'Connection timed out.';
10061: Result := 'Connection refused.';
10064: Result := 'Host is down.';
10065: Result := 'No route to host.';
10067: Result := 'Too many processes.';
10091: Result := 'Network subsystem is unavailable.';
10092: Result := 'WINSOCK.DLL version out of range.';
10093: Result := 'Successful WSAStartup not yet performed.';
10094: Result := 'Graceful shutdown in progress.';
11001: Result := 'Host not found.';
11002: Result := 'Non-authoritative host not found.';
11003: Result := 'This is a non-recoverable error.';
11004: Result := 'Valid name, no data record of requested type.';
end;
end;
End.
Il te reste plus qu'a utiliser les procédures SendString et ReceivedString pour implémenter le protocole HTTP :
Ca devrait faire un truc du style
function TIPAddress.GETIP: boolean;
var
Index: cardinal;
begin
Result := False;
if State = 0 then Exit;
SendString('GET /copyright.htm HTTP/1.1'+CRLF+CRLF);
if not ReceivedString('200') then Exit;
SendString('host: 'FfURL+CRLF+CRLF);
if not ReceivedString('200') then Exit;
//Procédure pour récuperer la page : <HTML>.....</HTML>
end;
Il te reste le plus simple à faire
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 25 juil. 2008 à 15:27
Salut,
@Bacterius
Pour le RunOnce, tu peux utiliser ces qq lignes de code :
var HandleMutex : THandle;
function IsRunning : Boolean;
begin
result := true;
SetLastError(NO_ERROR);
if OpenMutex(MUTEX_ALL_ACCESS,false,pChar('MonMtx'))<>0 then exit;
HandleMutex := CreateMutex(Nil,true,pChar('MonMtx'));
if HandleMutex = 0 then ShowMessage('Erreur de Mutex')
else result := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if IsRunning then Halt;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HandleMutex <> 0 then ReleaseMutex(HandleMutex);
end;
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 25 juil. 2008 à 15:21
Bonjour,
@yvesssimon : ya un truc etrange, Cirec n'a pas eu les messages que tu as. Je pense qu'il avait deja une version anterieure de CoolTrayIcon.
Je vais récuperer tout ça et le mettre dans le zip.
@Francky : J'ai déjà mis la version 2 qui ne prend plus en charge le registre pour les options (uniquement pour le démarrage de Windows, mais on peut la supprimer via le menu options). Mais je ne comprends pas ce que tu peux dire "pour supprimer les clés" ... tu veux dire un kit de survie pour ceux qui ont téléchargé la version 1 et qui ont le BDR pourri par mes clés options ?
Pour ce qui concerne l'ip internet : je ne sais pas trop utiliser les WinSockets, mais je vais me renseigner. Je posterai tout ça dans quelques temps.
Cordialement, Bacterius !
Francky23012301
Messages postés400Date d'inscriptionsamedi 6 août 2005StatutMembreDernière intervention11 février 20161 25 juil. 2008 à 15:11
Pour la base de registre, rajoute une procédure via un bouton pour supprimer les clés. Ca évitera que les gens fassent des betises en le faisant manuellement.
Pour l'IP internet : utiliser les WinSockets. Tu fais un mini client HTTP qui récupère le fichier HTML de http://www.mon-ip.com/. Puis traitement classique pour en sortir l'IP
yvessimon
Messages postés637Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 9 janvier 2017 25 juil. 2008 à 14:59
Bonjour,
il demande " RegisterTrayIcons " à la compil !
Salutations
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 25 juil. 2008 à 12:42
@Cirec j'ai eu ton problème de freeze au démarrage de l'appli. Je crois que j'ai pu isoler la ligne qui faisait beuger :
TrayIcon.Behavior := bhWin2000;
Je l'ai enlevée tout se passe bien chez moi maintenant.
Je corrige tout de suite pour pas que vous ayez à le faire.
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 25 juil. 2008 à 12:36
Bon j'ai mis la version 2 :
- fichiers ini
- textTrayIcon pour yvessimon
- Indentation du code plus uniforme et moins tabulaire (incrémentation de 1 à 2 espaces).
Une remarque : j'ai oublié d'updater la version dans la fiche A propos. Ca sera pour la prochaine MAJ ^^
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 25 juil. 2008 à 11:51
Ah ouais mais pour le lancement au démarrage, je laisse dans le registre ? (l'utilisateur peut toujours enlever la clef dans le menu options) ... et je ne vois pas d'autre manière de faire que l'application se lance au démarrage. Enlever cette option ?
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 25 juil. 2008 à 11:50
Bonjour,
@Cirec je vais refaire le système en écrivant plutôt dans un fichier ini, que dans le registre. De plus l'accès au registre est parfois bloqué pour certains utilisateurs, genre Invité.
Et je vais égaliser l'identation.
Et ca te donne l'ip cool :)
@yvessimon le compilateur te demande texttrayicon.dcu ?
Si je le trouve sur ma machine je le mettrai dans le zip
Cordialement, Bacterius !
yvessimon
Messages postés637Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 9 janvier 2017 25 juil. 2008 à 09:16
non non le gèle vient d'un "petit" bordel dans le OnCreate de la fiche.
Très rapidement j'ai mis en commentaire ces quelques lignes :
//Show;
//BringToFront; // On affiche (sinon il ne s'affiche pas au démarrage)
// SetFocus; // On le met devant et on lui met la focalisation
et l'application démarre et fonctionne ...
mais le problème de l'erreur à la fermeture reste entier.
L'écriture de données dans la BDR n'est pas une bonne idée. Elle est déjà assez chargé par Windows et d'autres application, pas la peine d'en rajouter. Puis peut de personne apprécie que l'on y stock des informations surtout que les données des options resteront polluer la BDR même si l'on ne désire plus se servir de ton prog (il faut les virer à la main) alors qu'un fichier Ini, placé dans le répertoire de l'application, suffisait amplement.
C'est tout ce que j'ai vu/regardé pour l'instant.
puis s'il te plait refait l'indentation de ton code.
ça ne donne vraiment pas envie de s'y plonger.
Sinon je le répète l'application donne bien l'IP, de ce coté tout fonctionne. ^^
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 21:03
Ah tu peux aussi essayer de virer RunOne, il permet juste de ne lancer qu'une seule fois l'application, mais qui sait c'est ptet lui qui te gêle le logiciel.
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:58
Bonsoir,
j'ai noté que je n'avais pas testé une partie du code : en fait je n'ai jamais testé la boîte de dialogue "la clé registre ..." au début du logiciel, si jamais les options n'étaient pas trouvées dans le registre, car je les avais ajoutées à la main. Je les aie supprimées, mais ça marche quand même chez moi. Je peux cliquer sur OK, et tout ce passe bien ...
Tu m'avais dit que le code de Caribensila sur le WebBrowser ne marchait pas, c'est peut-être la cause, elle est appelée par le timer, 4 secondes après le lancement du programme. Ca a beugé à ce moment la ?
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:52
Bonsoir,
un problème dans le code :O pourtant chez moi ça marche. Le message c'est normal, mais c'est pas normal de pas pouvoir la fermer. Est ce que tu as l'autorisation d'écrire dans le registre ? Ca expliquerait pas mal de trucs. Quant à la ressource WindowsXP.RES, en effet je l'oublie souvent, mais elle peut être troquée contre XPMan pour Delphi 7 et +
Mais je la mets quand même !
Pourrais-tu me dire sur quel OS tu tournes, pour que je voie quel partie du code a un problème de compatibilité ...
ben non désolé ... il manque encore la ressource :
"WindowsXP.RES"
Bon j'en ai une sous le coude mais il serait préférable de l'ajouter au Zip
et sinon ça merde grave (si quelqu'un pouvait tester pour voir)
enfin chez moi ça ne fonctionne pas du tout .. quand je lance l'application elle reste bloquée sur la MessageBox :
---------------------------
Information
---------------------------
L'adresse registre "HKCU:\Software\Ip Master" n'existe pas. Ce logiciel la créera pour pouvoir effectuer des traitements sur les options.
---------------------------
OK
---------------------------
on ne peut pas fermer cette boite et dans la barre des taches il y a une icône (mais celle qui devrait être) avec le popup mais aucun des MenuItems ne fonctionnent !!!!!
j'ai du tuer le processus pour pouvoir quitter.
Il y a un sérieux problème dans le code.
Pour l'instant je n'ai pas le temps de regarder le code.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:29
Voila c'est fait.
Je sais pas pourquoi je mets toujours // devant les explications de mise à jour, c'est une habitude que j'ai eue depuis mon inscription sur CS. Et je sais pas pourquoi je dis ça ...
Cordialement, Bacterius !
PS : Je pense que ca sera bon maintenant Cirec ^^'
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:25
Damned le composant RunOne, je l'avais oublié
Et puis pour le dossier cooltrayicon, je vire les DCU et ca devrait être fini lol
c'est le message du compilateur que j'ai copier .. et voici le suivant:
Main.pas(8) Fatal: F1026 File not found: 'RunOne.dcu'
Donc il faut encore ajouter l'unité 'RunOnce.pas'
et il y a encore des fichiers inutiles dans le répertoire CoolTrayIcon ;)
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:09
Voila c'est fait le nettoyage du zip :)
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:06
Ah au fait ya un truc qui va pas dans ton dernier commentaire Cirec :
"File not found: 'SimpleTimer.dcu'"
"et comme tu vas refaire le Zip profites en pour virer tous les fichier inutiles ( *.dcu ..."
> Bon je sors
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 20:04
Bonjour,
ah ? je ne savais pas qu'il fallait SimpleTimer, je vais le récuperer sur ma machine et je nettoyerai le zip. Au fait je voudrais garder le IpExe.res, car il contient l'icone de l'application (ca serait cool de la garder sinon ça aura une moins belle gueule ...)
Bon je corrige le zip.
@ Francky:
"Le composant CoolTrayIcon : tu aurais du (Pour un composant) l'utiliser dynamiquement. Là tu risques d'avoir peu de testeurs (C'est la raison pour laquelle je n'ai pas testé mais juste regarder le code)."
La compilation en ligne de commande .... tu connais ? ^^
j'ai pas encore testé mais je me rappel que le code de Caribensila ne fonctionnait pas chez moi :(
Je retenterai donc pour être certain ... des fois que ... ^^
Sinon j'avais utilisé une Dll de BruNews ... qui elle fonctionnait chez moi.
Voilà le reste du commentaire viendra après le teste.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 16:54
Bonjour,
oui Francky23012301 je vais répondre à tes remarques :
- identation : oui c'est vrai que j'ai été un peu sale sur l'identation, c'était soit 2 tabs, soit un saut de ligne, en fait il n'y a pas de différence entre procédure et fonction (ou pure coincidence).
- TWebBrowser : j'ai préféré utiliser webbrowser parce que je me sentais plus à l'aise avec, en effet avec les composants Indy je suis vite perdu avec tous ces composants, et puis tout le monde n'a pas Indy. Quant aux sockets, j'avais essayé à la place du webbrowser mais je n'ai jamais réussi à récuperer quoi que ce soit, et de toute façon c'était si instable (exceptions, plantages ...) que j'ai préféré revenir au TWebBrowser. Bien sur il est adaptable en Indy ou en socket.
- IP locale avec WinSocket : il est possible de récuperer l'adresse internet avec WinSocket, mais pas quand on est derrière un routeur. D'ailleurs je ne me suis pas trop posé sur l'ip locale, au début c'était juste pour l'ip internet et puis comme j'avais la fonction sous la main, je me suis dit pourquoi pas !
- Composant CoolTrayIcon : je ne sais pas comment créer des composants dynamiquement, je vais essayer d'apprendre.
- Mélange de sources déjà existants, c'est vrai j'ai pris la procédure de Caribensila, mais je ne vois pas où j'ai pris d'autres sources déjà existants (en tout cas je crois n'avoir emprunté que celle de Caribensila, j'ai codé le reste tout seul lol)
Je sais qu'il y a pas mal de trucs à revoir dans ce petit utilitaire, mais je te remercie d'avoir quand même lu le code, certaines personnes se contentent de lire la description, et de noter en conséquence sans laisser de commentaire (je ne nommerai personne ...)
Et je te remercie également pour tes points positifs, j'ai essayé de commenter au maximum pour qu'il soit lisible même de ma soeur (mais c'est pas encore gagné ...).
Merci beaucoup :)
Cordialement, Bacterius !
PS : Ce commentaire est beaucoup trop long ...
Francky23012301
Messages postés400Date d'inscriptionsamedi 6 août 2005StatutMembreDernière intervention11 février 20161 24 juil. 2008 à 15:48
Salut Bacterius,
Alors quelques remarques :
*Ton indentation admet des petits problemes : En effet suivant les procédures ou fonctions, elle diffère.
Normalement on écrit :
Begin
If .... Then
End;
L'espace correspond à 2 Echaps et pas 2 tabulations : Hors suivant les procédures tu fais soit l'un soit l'autre.
*Je trouve l'utilisation du TWebBrowser inutile ici : Indy, ou à la rigueur TSocket auraient été mieux. Autre remarque : pour l'adresse IP Local tu utilises les WinSocket : pourquoi ne pas faire la meme chose pour l'IP Internet : ca aurait donné un sacré intéret à ta source.
*Le composant CoolTrayIcon : tu aurais du (Pour un composant) l'utiliser dynamiquement. Là tu risques d'avoir peu de testeurs (C'est la raison pour laquelle je n'ai pas testé mais juste regarder le code).
*Ce code est un mélange de sources déja existants : ca c'est pas top, car ca n'apporte pas grand chose (Enfin c'est juste mon opinion).
Sinon le code est bien commenté, composants renommés, c'est propre et facilement compréhensif.
Je note pas
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 24 juil. 2008 à 13:02
5 nov. 2008 à 18:10
16 sept. 2008 à 20:38
Je ne vois pas comment récupérer le contenu de la page avec un GET ...
Pourrais-tu me donner des pistes supplémentaires ?
Cordialement, Bacterius !
31 juil. 2008 à 20:02
Et de plus pour ceux qui aiment avoir un PC propre et rapide, 4 icônes pour 1 application dans la zone de notif. n'est pas terrible :o (pensez à mon père ... :x)
Cordialement, Bacterius !
31 juil. 2008 à 20:00
Cincap je vais essayer les propriétés IconIndex + une imagelist, en plus l'avantage c'est qu'il n'y a plus besoin de trimbaler 3 icônes avec l'appli :)
Merci, je vais arranger ça dès que possible.
Cordialement, Bacterius !
28 juil. 2008 à 16:22
En utilisant les propriétés du composant TCoolTrayIcon et un TimageList, il y a moyen de lui faire afficher les 3 icons.
Avec cette modification, l'application à l'air stable.
procedure TMainForm.UpdateSysTray(szTip: Pchar;IconID: TState);
begin
case IconID of
Connected: TrayIcon.Iconindex := 1;
Connecting: TrayIcon.Iconindex := 0;
Disconnected: TrayIcon.Iconindex := 2;
end;
TrayIcon.Hint := SzTip;
end;
@+,
Cincap
28 juil. 2008 à 12:15
Après test sur WinXp pack3 et Delphi6, je constate que les 2 adresses Ip sont les mêmes alors qu'il devrait avoir une différence d'un chiffre entre l'Ip du serveur et l'Ip du client.
On peut le vérifier avec le bouton "Démarrer" puis "Connexions" puis "afficher toutes les connexions" et dans "Accès à distance" le click droit sur sa connexion, Statut puis onglet détail.
Bug à la fermeture de l'application.
Pour ma part, j'utilise le mutex pour ne lancer qu'une seule fois l'application, il y a peut être mieux !
Enfin, pourquoi ne pas aller plus loin avec le composant "CoolTrayIcon" et afficher l'Ip sur 4 icons dans la TrayIcon avec sens de lecture de l'Ip.
@+,
Cincap
27 juil. 2008 à 19:13
je crois que je vais laisser l'icône errer dans la mémoire plutôt que de chercher à résoudre ce problème lol.
Non je lol je continue à chercher ^^
Cordialement, Bacterius !
27 juil. 2008 à 19:08
ah oui en effet bien vu Mardi4Fr !
Je viens de récuperer mon Delphi et je cherchais justement cette Access Violation.
Mais il y a une fuite de mémoire dans ce cas ... car sans I.Free, I est recréée sans cesse, et n'est pas détruite. Eventuellement faire une variable SysIcon globale, à créer au lancement de l'appli, et détruite à la fermeture ? c'est peut-être une solution.
Encore merci Mardi4Fr :)
Cordialement, Bacterius !
27 juil. 2008 à 19:03
En supprimant dans la procedure TMainForm.UpdateSysTray
cette ligne I.Free ,j'ai plus l'erreur AV .
27 juil. 2008 à 18:50
Voir ici pour plus d'informations:
http://delphi.developpez.com/cours/CompilateurLigneCommande/
27 juil. 2008 à 17:46
26 juil. 2008 à 14:38
je les installes quasiment jamais ^^
je compile en ligne de commande ce qui m'évite de surcharger l'IDE par contre pour modifier le code il faut passer par un éditeur externe (Ex. NotePad++) ... mais ça le fait ;)
26 juil. 2008 à 14:22
c'est quand même bizarre que certaines personnes y arrivent et pas d'autres. Si tu es sur Delphi 6 alors il faut ouvrir le paquet : CoolTrayIcon_D6plus.dpk
Et voila normalement ça s'installe, penaud ...
Essaye ça et si tu as encore des problèmes ... dis le nous :p
Cordialement, Bacterius !
26 juil. 2008 à 14:08
et c'est sur D6 xD
Merci !
25 juil. 2008 à 17:18
Ensuite : tu as juste à mettre function GETIP(Var FileText:TStringList): boolean; (désolé d'avoir oublié Var FileText:TStringList) dans le private et de finir de coder cette fonction en utilisant le protocole HTTP (Voir Iprelax.com).
type
TIPAddress = class(TComponent)
private
Sock: TSocket;
function ResolveIP(Const AURL: string): string;
function GETIP(Var FileText:TStringList): boolean; //ICI
protected
FPort: cardinal;
FURL: string;
public
Tu n'as plus grand chose à faire
25 juil. 2008 à 17:15
Ton source est sans doute un très bon exercice pour toi et j'espère que les conseils de notre communauté te font progresser. Mais il a un gros défaut qui empêche sans doute beaucoup d'entre nous de le tester. C'est qu'on a déjà vu le sujet traité plusieurs fois sur ce site.
Tu aurais pu, avec le même principe, faire preuve d'un peu plus d'originalité. Par exemple un programme qui te prévient quand une nouvelle question est posée sur le forum de delphifr ou un truc du même genre.
Tu aurais appris tout autant et peut-être même plus; et ça aurait intéressé beaucoup plus de monde.
Essaie d'appliquer ce principe à l'avenir. Ce sera davantage profitable pour tout le monde.
D'ailleurs, rien ne t'empêche d'essayer de coder l'idée que je viens de te donner, maintenant que tu es à l'aise dans ce genre de problèmes ;)
En tout cas, on te voit progresser à vu d'oeil.
Bravo, et continue comme ça!
25 juil. 2008 à 16:20
@Caribensila : merci pour le code du RunOnce, c'est vrai qu'il est plutôt facile (vu ton code) à mettre en fonction, alors qu'un composant est beaucoup plus gênant (il faut l'installer, etc ...)
Merci :)
@Francky : merci d'essayer de m'aider pour le composant, je comprends le principe, mais, je ne connais rien à la conception de composants, et je doute que j'aie le niveau de programmation necessaire pour pouvoir en faire. Mais je vais quand même essayer de voir comment je pourrais faire pour le composant.
Merci à vous deux :)
Je vais travailler dessus dès que possible, mais là je réinstalle Windows sur mon ordinateur, et je ne peux donc rien faire pour l'instant, je pourrai m'y mettre ce soir ou demain :p
Je suis sur l'ordinateur d'un ami ^^
Cordialement, Bacterius !
25 juil. 2008 à 15:54
unit IPAddress;
interface
uses
Windows, Winsock, SysUtils, Classes, ScktComp,ComCtrls;
type
TIPAddress = class(TComponent)
private
Sock: TSocket;
function ResolveIP(Const AURL: string): string;
protected
FPort: cardinal;
FURL: string;
public
function Connect: boolean;
function Disconnect: boolean;
function Connected: boolean;
function Error: string;
function ReceivedString(Const AString: string): boolean;
function SendString(AString: string): boolean;
Constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property PORT: cardinal Read FPort Write Fport;
property URL: string Read FURL Write FURL;
{ Published declarations }
end;
var
State: integer = 1;
WSAData: TWSAData;
SockAddrIn: TSockAddrIn;
Answer:String;
const
CRLF = #13#10;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TEST, [TIPAddress]);
end;
constructor TIPAddress.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
WSAStartUp(257, WSAData);
state := 0;
end;
destructor TIPAddress.Destroy;
begin
WinSock.closesocket(Sock);
WSACleanup();
state := 0;
inherited Destroy;
end;
function TIPAddress.ResolveIP(Const AURL: string): string;
type
TAPInAddr = array [0..100] of PInAddr;
PAPInAddr = ^TAPInAddr;
var
Index: integer;
WSAData: TWSAData;
HostEnt: PHostEnt;
PInAddr: PAPInAddr;
begin
Result := '';
WSAStartUp($101, WSAData);
try
HostEnt := GetHostByName(PChar(AURL));
if HostEnt <> nil then
begin
PInAddr := PAPInAddr(HostEnt^.h_addr_list);
Index := 0;
while PInAddr^[Index] <> nil do
begin
Result := (inet_ntoa(PInAddr^[Index]^));
Inc(Index);
end;
end;
except
end;
WSACleanUp();
end;
function TIPAddress.Connect: boolean;
begin
State := 0;
Result := False;
sock := Winsock.Socket(AF_INET, SOCK_STREAM, 0);
if sock <> winsock.INVALID_SOCKET then
begin
with SockAddrIn do
begin
sin_family := AF_INET;
sin_port := htons(Fport);
sin_addr.S_addr := inet_addr(PChar(ResolveIP(FURL)));
end;
if Winsock.Connect(sock, SockAddrIn, SizeOf(SockAddrIn)) <> Socket_Error then
begin
State := 1;
Result := True;
end;
end;
end;
function TIPAddress.Disconnect: boolean;
begin
Result := False;
if winSock.closesocket(Sock) <> Winsock.SOCKET_ERROR then
begin
State := 0;
Result := True;
end;
end;
function TIPAddress.Connected: boolean;
begin
if State = 1 then
Result := True
else
Result := False;
end;
function TIPAddress.ReceivedString(Const AString: string): boolean;
var
StringReceived: array [0..2048] of char;
begin
ZeroMemory(@StringReceived[0], SizeOf(StringReceived));
winsock.Recv(Sock, StringReceived, SizeOf(StringReceived), 0);
if (Copy(StringReceived, 1, 3) <> Astring) then
Result := False
else
Begin
Result := True;
Answer:=StringReceived;
Delete(Answer,Pos(AString,Answer),length(AString));
End;
end;
function TIPAddress.SendString(AString: string): boolean;
begin
if winsock.Send(Sock, AString[1], Length(AString), 0) = winsock.SOCKET_ERROR then
Result := False
else
Result := True;
end;
function TIPAddress.Error: string;
begin
case winsock.WSAGetLastError of
10004: Result := 'Interrupted function call.';
10013: Result := 'Refused permission.';
10014: Result := 'Bad address.';
10022: Result := 'Invalid Arguments.';
10024: Result := 'Too many open files.';
10035: Result := 'Resource temporarily unavailable.';
10036: Result := 'peration in progress.';
10037: Result := 'Operation already in progress.';
10038: Result := 'Socket operation or no-socket.';
10039: Result := 'Destination address required.';
10040: Result := 'Too long message .';
10041: Result := 'Protocol wrong type for socket.';
10042: Result := 'Bad protocol option.';
10043: Result := 'Protocol not supported.';
10044: Result := 'Socket type not supported.';
10045: Result := 'Operation not supported.';
10046: Result := 'Protocol family not supported.';
10047: Result := 'Address family not supported by protocol family.';
10048: Result := 'Address already in use.';
10049: Result := 'Cannot assign requested address.';
10050: Result := 'Network is down.';
10051: Result := 'Network is unreachable.';
10052: Result := 'Network dropped connection on reset.';
10053: Result := 'Software caused connection abort.';
10054: Result := 'Connection reset by peer.';
10055: Result := 'No buffer space available.';
10056: Result := 'Socket is already connected.';
10057: Result := 'Socket is not connected.';
10058: Result := 'Cannot send after socket shutdown.';
10060: Result := 'Connection timed out.';
10061: Result := 'Connection refused.';
10064: Result := 'Host is down.';
10065: Result := 'No route to host.';
10067: Result := 'Too many processes.';
10091: Result := 'Network subsystem is unavailable.';
10092: Result := 'WINSOCK.DLL version out of range.';
10093: Result := 'Successful WSAStartup not yet performed.';
10094: Result := 'Graceful shutdown in progress.';
11001: Result := 'Host not found.';
11002: Result := 'Non-authoritative host not found.';
11003: Result := 'This is a non-recoverable error.';
11004: Result := 'Valid name, no data record of requested type.';
end;
end;
End.
Il te reste plus qu'a utiliser les procédures SendString et ReceivedString pour implémenter le protocole HTTP :
Ca devrait faire un truc du style
function TIPAddress.GETIP: boolean;
var
Index: cardinal;
begin
Result := False;
if State = 0 then Exit;
SendString('GET /copyright.htm HTTP/1.1'+CRLF+CRLF);
if not ReceivedString('200') then Exit;
SendString('host: 'FfURL+CRLF+CRLF);
if not ReceivedString('200') then Exit;
//Procédure pour récuperer la page : <HTML>.....</HTML>
end;
Il te reste le plus simple à faire
25 juil. 2008 à 15:27
@Bacterius
Pour le RunOnce, tu peux utiliser ces qq lignes de code :
var HandleMutex : THandle;
function IsRunning : Boolean;
begin
result := true;
SetLastError(NO_ERROR);
if OpenMutex(MUTEX_ALL_ACCESS,false,pChar('MonMtx'))<>0 then exit;
HandleMutex := CreateMutex(Nil,true,pChar('MonMtx'));
if HandleMutex = 0 then ShowMessage('Erreur de Mutex')
else result := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if IsRunning then Halt;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HandleMutex <> 0 then ReleaseMutex(HandleMutex);
end;
25 juil. 2008 à 15:21
@yvesssimon : ya un truc etrange, Cirec n'a pas eu les messages que tu as. Je pense qu'il avait deja une version anterieure de CoolTrayIcon.
Je vais récuperer tout ça et le mettre dans le zip.
@Francky : J'ai déjà mis la version 2 qui ne prend plus en charge le registre pour les options (uniquement pour le démarrage de Windows, mais on peut la supprimer via le menu options). Mais je ne comprends pas ce que tu peux dire "pour supprimer les clés" ... tu veux dire un kit de survie pour ceux qui ont téléchargé la version 1 et qui ont le BDR pourri par mes clés options ?
Pour ce qui concerne l'ip internet : je ne sais pas trop utiliser les WinSockets, mais je vais me renseigner. Je posterai tout ça dans quelques temps.
Cordialement, Bacterius !
25 juil. 2008 à 15:11
Pour l'IP internet : utiliser les WinSockets. Tu fais un mini client HTTP qui récupère le fichier HTML de http://www.mon-ip.com/. Puis traitement classique pour en sortir l'IP
25 juil. 2008 à 14:59
il demande " RegisterTrayIcons " à la compil !
Salutations
25 juil. 2008 à 12:42
TrayIcon.Behavior := bhWin2000;
Je l'ai enlevée tout se passe bien chez moi maintenant.
Je corrige tout de suite pour pas que vous ayez à le faire.
Cordialement, Bacterius !
25 juil. 2008 à 12:36
- fichiers ini
- textTrayIcon pour yvessimon
- Indentation du code plus uniforme et moins tabulaire (incrémentation de 1 à 2 espaces).
Une remarque : j'ai oublié d'updater la version dans la fiche A propos. Ca sera pour la prochaine MAJ ^^
Cordialement, Bacterius !
25 juil. 2008 à 11:51
Cordialement, Bacterius !
25 juil. 2008 à 11:50
@Cirec je vais refaire le système en écrivant plutôt dans un fichier ini, que dans le registre. De plus l'accès au registre est parfois bloqué pour certains utilisateurs, genre Invité.
Et je vais égaliser l'identation.
Et ca te donne l'ip cool :)
@yvessimon le compilateur te demande texttrayicon.dcu ?
Si je le trouve sur ma machine je le mettrai dans le zip
Cordialement, Bacterius !
25 juil. 2008 à 09:16
il demande "textTrayIcon"
Salutations
25 juil. 2008 à 01:37
Très rapidement j'ai mis en commentaire ces quelques lignes :
//Show;
//BringToFront; // On affiche (sinon il ne s'affiche pas au démarrage)
// SetFocus; // On le met devant et on lui met la focalisation
et l'application démarre et fonctionne ...
mais le problème de l'erreur à la fermeture reste entier.
L'écriture de données dans la BDR n'est pas une bonne idée. Elle est déjà assez chargé par Windows et d'autres application, pas la peine d'en rajouter. Puis peut de personne apprécie que l'on y stock des informations surtout que les données des options resteront polluer la BDR même si l'on ne désire plus se servir de ton prog (il faut les virer à la main) alors qu'un fichier Ini, placé dans le répertoire de l'application, suffisait amplement.
C'est tout ce que j'ai vu/regardé pour l'instant.
puis s'il te plait refait l'indentation de ton code.
ça ne donne vraiment pas envie de s'y plonger.
Sinon je le répète l'application donne bien l'IP, de ce coté tout fonctionne. ^^
24 juil. 2008 à 21:03
Cordialement, Bacterius !
24 juil. 2008 à 20:58
j'ai noté que je n'avais pas testé une partie du code : en fait je n'ai jamais testé la boîte de dialogue "la clé registre ..." au début du logiciel, si jamais les options n'étaient pas trouvées dans le registre, car je les avais ajoutées à la main. Je les aie supprimées, mais ça marche quand même chez moi. Je peux cliquer sur OK, et tout ce passe bien ...
Tu m'avais dit que le code de Caribensila sur le WebBrowser ne marchait pas, c'est peut-être la cause, elle est appelée par le timer, 4 secondes après le lancement du programme. Ca a beugé à ce moment la ?
Cordialement, Bacterius !
24 juil. 2008 à 20:52
un problème dans le code :O pourtant chez moi ça marche. Le message c'est normal, mais c'est pas normal de pas pouvoir la fermer. Est ce que tu as l'autorisation d'écrire dans le registre ? Ca expliquerait pas mal de trucs. Quant à la ressource WindowsXP.RES, en effet je l'oublie souvent, mais elle peut être troquée contre XPMan pour Delphi 7 et +
Mais je la mets quand même !
Pourrais-tu me dire sur quel OS tu tournes, pour que je voie quel partie du code a un problème de compatibilité ...
Cordialement, Bacterius !
24 juil. 2008 à 20:49
"WindowsXP.RES"
Bon j'en ai une sous le coude mais il serait préférable de l'ajouter au Zip
et sinon ça merde grave (si quelqu'un pouvait tester pour voir)
enfin chez moi ça ne fonctionne pas du tout .. quand je lance l'application elle reste bloquée sur la MessageBox :
---------------------------
Information
---------------------------
L'adresse registre "HKCU:\Software\Ip Master" n'existe pas. Ce logiciel la créera pour pouvoir effectuer des traitements sur les options.
---------------------------
OK
---------------------------
on ne peut pas fermer cette boite et dans la barre des taches il y a une icône (mais celle qui devrait être) avec le popup mais aucun des MenuItems ne fonctionnent !!!!!
j'ai du tuer le processus pour pouvoir quitter.
Il y a un sérieux problème dans le code.
Pour l'instant je n'ai pas le temps de regarder le code.
24 juil. 2008 à 20:29
Je sais pas pourquoi je mets toujours // devant les explications de mise à jour, c'est une habitude que j'ai eue depuis mon inscription sur CS. Et je sais pas pourquoi je dis ça ...
Cordialement, Bacterius !
PS : Je pense que ca sera bon maintenant Cirec ^^'
24 juil. 2008 à 20:25
Et puis pour le dossier cooltrayicon, je vire les DCU et ca devrait être fini lol
Je refais le zip ...
24 juil. 2008 à 20:20
c'est le message du compilateur que j'ai copier .. et voici le suivant:
Main.pas(8) Fatal: F1026 File not found: 'RunOne.dcu'
Donc il faut encore ajouter l'unité 'RunOnce.pas'
et il y a encore des fichiers inutiles dans le répertoire CoolTrayIcon ;)
24 juil. 2008 à 20:09
Cordialement, Bacterius !
24 juil. 2008 à 20:06
"File not found: 'SimpleTimer.dcu'"
"et comme tu vas refaire le Zip profites en pour virer tous les fichier inutiles ( *.dcu ..."
> Bon je sors
Cordialement, Bacterius !
24 juil. 2008 à 20:04
ah ? je ne savais pas qu'il fallait SimpleTimer, je vais le récuperer sur ma machine et je nettoyerai le zip. Au fait je voudrais garder le IpExe.res, car il contient l'icone de l'application (ca serait cool de la garder sinon ça aura une moins belle gueule ...)
Bon je corrige le zip.
Cordialement, Bacterius !
24 juil. 2008 à 19:33
avant de pouvoir tester il faut ajouter une unité:
CoolTrayIcon.pas(61) Fatal: F1026 File not found: 'SimpleTimer.dcu'
et comme tu vas refaire le Zip profites en pour virer tous les fichier inutiles ( *.dcu, *.cfg, *.dof)
24 juil. 2008 à 19:26
"Le composant CoolTrayIcon : tu aurais du (Pour un composant) l'utiliser dynamiquement. Là tu risques d'avoir peu de testeurs (C'est la raison pour laquelle je n'ai pas testé mais juste regarder le code)."
La compilation en ligne de commande .... tu connais ? ^^
j'ai pas encore testé mais je me rappel que le code de Caribensila ne fonctionnait pas chez moi :(
Je retenterai donc pour être certain ... des fois que ... ^^
Sinon j'avais utilisé une Dll de BruNews ... qui elle fonctionnait chez moi.
Voilà le reste du commentaire viendra après le teste.
24 juil. 2008 à 16:54
oui Francky23012301 je vais répondre à tes remarques :
- identation : oui c'est vrai que j'ai été un peu sale sur l'identation, c'était soit 2 tabs, soit un saut de ligne, en fait il n'y a pas de différence entre procédure et fonction (ou pure coincidence).
- TWebBrowser : j'ai préféré utiliser webbrowser parce que je me sentais plus à l'aise avec, en effet avec les composants Indy je suis vite perdu avec tous ces composants, et puis tout le monde n'a pas Indy. Quant aux sockets, j'avais essayé à la place du webbrowser mais je n'ai jamais réussi à récuperer quoi que ce soit, et de toute façon c'était si instable (exceptions, plantages ...) que j'ai préféré revenir au TWebBrowser. Bien sur il est adaptable en Indy ou en socket.
- IP locale avec WinSocket : il est possible de récuperer l'adresse internet avec WinSocket, mais pas quand on est derrière un routeur. D'ailleurs je ne me suis pas trop posé sur l'ip locale, au début c'était juste pour l'ip internet et puis comme j'avais la fonction sous la main, je me suis dit pourquoi pas !
- Composant CoolTrayIcon : je ne sais pas comment créer des composants dynamiquement, je vais essayer d'apprendre.
- Mélange de sources déjà existants, c'est vrai j'ai pris la procédure de Caribensila, mais je ne vois pas où j'ai pris d'autres sources déjà existants (en tout cas je crois n'avoir emprunté que celle de Caribensila, j'ai codé le reste tout seul lol)
Je sais qu'il y a pas mal de trucs à revoir dans ce petit utilitaire, mais je te remercie d'avoir quand même lu le code, certaines personnes se contentent de lire la description, et de noter en conséquence sans laisser de commentaire (je ne nommerai personne ...)
Et je te remercie également pour tes points positifs, j'ai essayé de commenter au maximum pour qu'il soit lisible même de ma soeur (mais c'est pas encore gagné ...).
Merci beaucoup :)
Cordialement, Bacterius !
PS : Ce commentaire est beaucoup trop long ...
24 juil. 2008 à 15:48
Alors quelques remarques :
*Ton indentation admet des petits problemes : En effet suivant les procédures ou fonctions, elle diffère.
Normalement on écrit :
Begin
If .... Then
End;
L'espace correspond à 2 Echaps et pas 2 tabulations : Hors suivant les procédures tu fais soit l'un soit l'autre.
*Je trouve l'utilisation du TWebBrowser inutile ici : Indy, ou à la rigueur TSocket auraient été mieux. Autre remarque : pour l'adresse IP Local tu utilises les WinSocket : pourquoi ne pas faire la meme chose pour l'IP Internet : ca aurait donné un sacré intéret à ta source.
*Le composant CoolTrayIcon : tu aurais du (Pour un composant) l'utiliser dynamiquement. Là tu risques d'avoir peu de testeurs (C'est la raison pour laquelle je n'ai pas testé mais juste regarder le code).
*Ce code est un mélange de sources déja existants : ca c'est pas top, car ca n'apporte pas grand chose (Enfin c'est juste mon opinion).
Sinon le code est bien commenté, composants renommés, c'est propre et facilement compréhensif.
Je note pas
24 juil. 2008 à 13:02