sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009
-
11 avril 2006 à 20:04
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012
-
19 déc. 2012 à 21:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 19 déc. 2012 à 21:01
Salut,
je prends note de vos commentaires et dès que possible une mise à jour sera disponible !!!
Nota: en attendant veuillez tenir compte de ceci, la version Pro de Delphi contient déjà une unité contenant la classe TWebBrowser, donc avant toute compilation du projet veuillez suivre ces étapes:
1) si votre version est une version Pro, veuillez éditer le fichier "SfcWebMemo.inc" et procéder au remplacement de cette ligne
{.$DEFINE WebMemoDelphiPro} par
{$DEFINE WebMemoDelphiPro}
concernant la version Perso de Delphi, le fichier "WebBrowserPackage.zip" devrait en principe résoudre le problème mais effectivement comme vient de le faire remarqué Kofina, merci à lui !!!, le fichier "WebBrowserPack.dpk" contient des liens incorrects(du moins pour certaines personnes parmi vous)
en attendant la mise à jour, veuillez éditer le fichier "WebBrowserPack.dpk" et tout simplement remplacer ces lignes
contains
SHDocVw_TLB in '..\..\..\Imports\SHDocVw_TLB.pas',
MSHTML_TLB in '..\..\..\Imports\MSHTML_TLB.pas';
par
contains
SHDocVw_TLB in 'SHDocVw_TLB.pas',
MSHTML_TLB in 'MSHTML_TLB.pas';
en principe avec cette mise au point, vous ne devrez pas avoir de problème d'installation.
veuillez m'excuser pour tout le retard !!!, je n'avais plus eu de connexion internet depuis un bon moment, et j'ai mis de côté Delphi pour l'apprentissage du c++ !!!, de plus je vois qu'il y a de nouvelles version de Delphi lol j'ai du pain sur la planche :)
@++
kofina
Messages postés1Date d'inscriptionjeudi 29 mars 2007StatutMembreDernière intervention19 décembre 2012 19 déc. 2012 à 12:57
Salut,
votre composant m'a été très utile.
Merci beaucoup.
Note: pour l'install sous Delphi, j'ai dû retirer puis ajouter à nouveau les unités qui marquait des erreurs. C'était juste les chemin d'accès qui n'étaient pas bon.
Merci encore.
Jean-Paul Koffi
assemple
Messages postés65Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention16 décembre 2011 30 avril 2011 à 18:01
Impossible d'installer WebMemoPackD7.dpk dans Delphi 7 Pro
Erreur de compilation, unités non trouvé (xxx_TLB)
Quelqu'un peut-il m'aider ?
devjd
Messages postés3Date d'inscriptionjeudi 23 février 2006StatutMembreDernière intervention21 décembre 2009 21 déc. 2009 à 12:21
J'avais oublié un message d'erreur qui apparait souvent :
"Défaillance irrémédiable" !
devjd
Messages postés3Date d'inscriptionjeudi 23 février 2006StatutMembreDernière intervention21 décembre 2009 21 déc. 2009 à 11:42
Salut,
A l'occasion d'un nouveau projet je reviens sur ce composant super interressant.
MAIS !
Après installation/compilation de la démo sous Delphi 2005 la démo ne me permet pas d'enregistrer les modifications ! le fichier reste vide !
Est-ce lié au blocage de l'édition du DHTML sous IE8 ?
J'ai fais des tests sous XP et Vista (tous les 2 avec IE8) et rien n'y fait.
Parfois il y a un message faisant référence à MSHTML.DLL mais ce n'est pas systématique.
Autre info : si je charge un fichier HTML complet, le mode édition est impossible.
Help !
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 14 sept. 2008 à 19:43
Salut à vous,
Désolé pour le retard c'est que j'ai eu des soucis avec mon pc (Disques durs h.s ect), du coup de nombreux composants qui était déjà mises à jour sont partis en fumée, dont WebMemo qui en était à la version bêta 2.0, mais c'est pas bien grave car il me reste un backup de la version beta 1.6 qui elle supporte la gestion des CSS via un composant TSfcCSSManager, Image Background, Border Style , une petite gestion pour l'insertion des tableaux(en beta test), de nombreux événements on été ajoutés , OnDocChanged(par crc32), OnKeyPress(permet également d'interdire une action, par ex: interdire les chiffres, retour chariot ect(vk_return) .. ), OnKeyDown , OnKeyUp , OnBeforeActicate(permet d'interdire la selection tout en autorisant l'usage du menu-contextuel, le seul hic c'est que c'est irréversible car cette évènement se déclenche avant l'initialisation du composant, une fois le composant est initialisé en mode "selection interdite" il semblerait qu'on ne puisse plus revenir en arrière, bon ya surement une solution j'ai pas cherché !!!), ya aussi une gestion de la transparance des fichiers png mais pour le moment ça coince quelque part ... sinon j'ai cherché si il y avait un truc sur le net comparable à TWebBrower et je suis tombé sur http://terrainformatica.com/htmengine/screenshots.whtm à peine 624k la dll , elle consomme beaucoup moins de resource qu'internet explorer, ell gère parfaitement bien la transparence des fichiers png mais là encore problème car elle ne prend pas en charge les fichiers css, le projet à été abandonné bien que la dll et la doc circule encore sur le net mais il n'existe pas de wrapper en delphi, et il doit y avoir de nombreuses interfaces com.
Tukkkko:le zip n'est pas corrompu re-vérifie !!!
b20n00:ça me rappel que j'au oublié de rendre public la propriété Enabled, essaie donc WebMemo.Enabled := False en runtime, sinon comme cité plus haut il est possible d'interdire la selection lors de l'initialisation du composant(pour un mode loggeur par exemple)
voilà reste plus qu'à attendre un peu la mise la jour
Bonne prog à vous @+
b20n00
Messages postés19Date d'inscriptionvendredi 31 août 2007StatutMembreDernière intervention12 août 2009 13 sept. 2008 à 13:50
Salut,
Je te propose d'ajouter trois options:
- est-ce qu'on peut permettre et empecher la copie du texte à partir du composant en fonction de l'état ReadOnly de votre composant? si readonly est false pas de copier/coller mermi.
car j'ai remarqué que votre composant permet la copie par ctrl+c et ctrl+Ins malré que j'ai désactivé la copie par menu alors que le composant WebBrowser ne le permet pas.
- Pour le texte n'est-il pas possible de le justifié?
- Intégrer les tableau.
Tukkkko
Messages postés29Date d'inscriptionlundi 22 mars 2004StatutMembreDernière intervention29 janvier 2007 16 juin 2008 à 09:47
Salut à toi!
Je suis intéressé par ton projet!
Ceci dit, il semble que le zip soit corrompu :-(
T'es-il possible de le mettre à jour, STP?
Bonne journée!
Tukkkko
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 16 mars 2007 à 14:47
Salut sylvunix,
décidemment j'ai trop abusé du capuccino ;)
tu as tout à fait raison pour le CRC, je pense qu'on peut pas faire autrement pour l'instant !!!.
bon j'avais effectué quelques tests
property Modified : Boolean read GetDocModified;
function TCustomWebMemo.GetDocModified: Boolean;
begin
result :not(FDocSize GetDocSize);
end;
avec bien entendu des routines pour mettre a jour FDocSize, et là il ne reste plus qu'a changer FDocSize par FDocHash
il reste aussi l'optimisation de l'algo Crc32 en asm, car le but c'est d'avoir la signature très rapidement
donc @+ pour l'update !
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 16 mars 2007 à 07:18
Salut Shining,
Désolé de mettre laissé aller et d'avoir sorti la grosse artillerie ! Mais une bonne scéance de psychanalyse me permettra peut-être de te faire comprendre les raisons de cette dérive !
En fait, contrôler la longueur du texte n'était pas suffisant car il fallait pouvoir détecter les changements de texte du type 'delphi' par 'azerty'. Un simple balayage du type somme n'était pas non plus suffisant car il fallait également détecter les changements du type 'bonjour' par 'jourbon'. C'est pourquoi j'ai fini par sortir le crc32.
Il est vrai que cela consomme des ressources. Mais en introduisant une variable booléenne privée FDocChanged qui mémoriserait si le document a été déjà modifié, on pourrait éviter de dérouler l'argorithme inutilement.
function TCustomWebMemo.GetDocChanged: Boolean;
var
Crc32: LongInt;
begin
Result := FDocChanged;
// Réalise un Crc32 sur le texte complet uniquement si le document n'a pas déjà été modifié
if not(FDocChanged) then
begin
Crc32 := GetDocCrc32;
Result :not(Crc32 FDocCrc32);
FDocCrc32 := Crc32;
end;
end;
procedure TCustomWebMemo.ResetDocChanged;
begin
FDocChanged := false;
FDocCrc32 := GetDocCrc32;
end;
Il y a également dans mon subconcient un besoin refoulé que j'arrive maintenant à exprimer clairement. Mais je pense que cela relève plutôt du fantasme que de la réalité car je ne vois pas techniquement comment on pourra le coder. L'idée serait d'avoir un évènement OnDocChanged ...
@+
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 15 mars 2007 à 13:58
Salut Sylvunix,
Wow tout ça ?? lol, bah mon idée c'était a peut près ça, sauf que la méthode du crc devrait être le dernier recourt !!!, ça prend pas mal de resources !!!, et bien en faite je crois qu'il ya plus simple, je viens de testé la méthode qui utilise un StreamAdapter qui permet l'accès au flux du WebBrowser(via MemoryStream), et ça permet donc d'avoir la taille du document ensuite même système que toi on compare la taille initiale et celle en cours !!!, il est maintenant possible d'avoir des infos sur le client web, AppName, UserAgent, Java is Enabled ?, Cookie, Vitesse de Connection ect..., et pour plus tard.. une gestion des tableaux, enfin bref ya quelques modifications et la mise a jour sera dispo dans 2/3 jours.
@+
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 14 mars 2007 à 17:38
Salut Shining,
Pour revenir à notre dernier sujet, j'ai testé les ajouts suivants. Pourrais-tu me donner ton avis d'expert.
sylvunix
P.S. : La propriété DocChanged est en écriture car dans mon application, j'ai besoin d'y accéder.
Dans la partie private de la définition de la classe TCustomWebMemo :
FDocCrc32 : LongInt;
function GetDocChanged: Boolean;
Dans la partie protected de la définition de la classe TCustomWebMemo :
function CalculCrc32(Octet: Byte; Crc: LongInt): LongInt;
begin
CalculCrc32 := TableCrc32[byte(Crc xor LongInt(Octet))] xor ((Crc shr 8) and $00ffffff);
end;
Dans la partie implémentation, ajout des lignes suivantes :
function TCustomWebMemo.GetDocCrc32: LongInt;
var
Index: Word;
Crc32: LongInt;
begin
// Calcule le crc32 dur les données au format HTML
Crc32 := $ffffffff;
for Index := 0 to length(Document.Body.innerHTML)-1 do
Crc32 := CalculCrc32(Ord(Document.Body.innerHTML[Index]), Crc32);
Result := Crc32;
end;
function TCustomWebMemo.GetDocChanged: Boolean;
var
Crc32: LongInt;
begin
// Réalise un Crc32 sur le texte colmplet
Crc32 := GetDocCrc32;
Result :not(Crc32 FDocCrc32);
FDocCrc32 := Crc32;
end;
procedure TCustomWebMemo.ResetDocChanged;
begin
FDocCrc32 := GetDocCrc32;
end;
Dans la partie implementation, ajout de ResetDocChanged dans les méthodes suivantes.
procedure TCustomWebMemo.Clear;
begin
if ReadOnly = False then
begin
Document.Body.innerHTML := '';
ResetDocChanged;
end
else
ClearWebCtrl;
FLines.Clear;
end;
procedure TCustomWebMemo.LoadFromFile(const FileName: String);
begin
Clear;
FLines.LoadFromFile(FileName);
WebCtrl.OleObject.Document.WriteLn(FLines.Text);
ResetDocChanged;
end;
procedure TCustomWebMemo.SaveAs(const DefaultFileName: String);
begin
if CanDo then
begin
Document.ExecCommand('SaveAs' , False , DefaultFileName);
ResetDocChanged;
end;
end;
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 4 mars 2007 à 11:41
Salut,
Arf oui c'est vrai que la solution du LignesChange n'est valable que lorsque on utiliser Lines.Add() logique :/, ceci dit je ne vois aucune propriété dans la MSDN concernant la modification du document !!!, bon y aura toujours un moyen, par exemple mettre une propriété Modified a false lors de l'ouverture d'un document, ou lors d'un "Clear", et changer l'événement OnKeyDown par OnKeyUp, quitte même a mettre un mini crc, et de comparer a la fin le crc initial et celui en cours car l'accès du flux interne du contrôle WebBrowser est assez simple !!!, je vais voir si y'a pas plus simple !!!
@+
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 2 mars 2007 à 09:30
Salut Shining,
J'ai testé tes solutions 2 et 3, la première ne me semblant pas appropriée.
La troisième, celle qui me semble la plus adaptée, me pose un petit problème : la méthode LinesChange n'est jamais appelée.
Pour la seconde, c'est un peu la galère car on récupère vraiment toutes les actions du clavier. Ce qui est un peu normal. Par contre comment faire le tri ? Existe-t-il des fonctions comme en c qui permettent de savoir si un caractère peut être affiché ?
P.S. : Concernant le problème ShowFindDialog, c'est mon I.E. qui a totalement explosé sur l'une de mes machines (plus d'impression ni la possibilité d'ouvrir dans une nouvelle fenêtre) !
Merci
a+
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 23 févr. 2007 à 00:18
Salut Sylvunix,
oui en effet pour l'instant il n'y a pas de fonction Changed
cependant il existe plusieurs méthodes pour savoir si le texte effectivement été modifié
1)l'événement WebMemo.OnSelectionChange se déclenche lorsque l'utilisateur a effectué une selection du texte, celà permet de mettre à jour par exemple les boutons de la toolbar pour savoir si la selection est en gras, italic ect..., mais cela ne veut pas forcémment dire que le texte a été modifié !!!
2)l'événement WebMemo.OnKeyDown(Sender: TObject; var Key: TWebMemoKeyInfo) se déclenche lorsque l'utilisateur frappe sur une touche une touche quelconque
Key.Code renvoie la valeur word du code ascii ed la touche
Key.Shift indique l'état des touches Alt, Ctrl, Maj et des boutons de la souris.
Nota : il sera bientôt possible d'interdire l'appuie d'une touche en modifiant tout simplement la valeur de Key.Code
par exemple if Key.Code = VK_RETURN then Key.Code :=0, mais pour l'instant cette exemple ne marche pas(un petit oubli de ma part ^^)
3) dans la classe TCustomWebMemo
on peut ajouter une nouvelle propriété DoChanged
property DocChanged : Boolean read FDocChanged write FDocChanged;
ensuite
procedure TCustomWebMemo.LinesChange(Sender: TObject);
begin
...
ici FDocChanged := True;
biensur il faut que la fonction Clear,LoadFromFile puisse remettre à false l'attribut DocChanged
end;
concernant ShowFindDialog je n'ai aucun probleme avec XP et Win98 ca marche impec, verifie ta version d'internet explorer !!!, dans tous les cas il est préférable voir même indispensable d'avoir une version 5.5 ou ultérieur !!
@+
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 22 févr. 2007 à 21:11
Bonsoir Shining,
Je me suis effectivement légèrement planté dans ma question. Il s'agissait bien d'un problème sur ShowFindDialog. Problème qui d'ailleurs ne se pose que sur l'un de mes PC. Toutes mes excuses !
J'ai répondu avec un peu de retard car je cherche comment ajouter une fonctionnalité qui fait défaut. Ce serait l'attribut Changed qui indiquerait si oui ou non le texte a été changé.
J'ai bien une petite piste qui serait d'utiliser l'état du Undo (si une action peut être annulée alors le document a été changé !) mais je ne sais pas comment effacer la liste des actions mémorisées (pour désactiver l'attribut Changed).
Aurais-tu une autre piste ?
sylvunix
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 9 févr. 2007 à 23:53
Salut sylvunix,
Bon je me permet de te répondre ici plutôt que dans ton mp afin d'en faire profiter à d'autres personnes qui pourrait avoir le même problème.
Question : "Je viens de constater un petit problème : la fonction WebMemo.ShowFontDialog ne déclenche pas la boîte de dialogue espérée"
Réponse : il me semble qu'il y a une petite confusion de ta part puisque en effet il n'ya pas de fonction ShowFontDialog a proprement dit dans l'interface WebMemo, je crois que tu as confondu l'appel à la fonction ShowFontDialog avec WebMemo.ShowFindDialog qui n'a bien sûr rien à voir avec la boîte de dialogue de la police.
étant donné qu'on veut changer la font du texte Selectionné j'ai mis cette fonction dans la partie WebMemo.SelRange.FontDialog, pourquoi dans SelRange et non dans WebMemo.ShowFontDialog ?, tout simplement que dans SelRange on peut changer à la fois la police ainsi que sa taille sans affecté tout l'ensemble du contenu HTML mais en modifiant uniquement la partie selectionée !!! ;)
@+
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 9 févr. 2007 à 15:29
Bonjour Shining,
Je ressort ton composant des cartons à l'occasion d'un nouveau projet.
Je viens de constater un petit problème : la fonction WebMemo.ShowFontDialog ne déclenche pas la boîte de dialogue espérée. Je suis en Delphi 7 Professionnel sous XP. Cela fonctionne-t-il de ton côté ?
sylvunix
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 13 avril 2006 à 19:30
Nota : prochainement un WebChatMemo et un ToolTip utilisant tout deux ce même composant ainsi que le composant EmoticonManager !!!
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 11 avril 2006 à 21:26
il faut demander ça à microsoft qui n'assure plus la compatibilité des TimageList avec les versions antérieur à Windows 2000/XP !!! :/
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 11 avril 2006 à 20:04
Bravo pour ce composant très intéressant.
Le source du programme de démonstration pose quelques soucis lors du chargement (problème sur une ressource image). Serait-il possible de disposer du fichier .bmp d'origine afin de le réintégrer ?
La toolbar sans dessin, ça craint un peu !
19 déc. 2012 à 21:01
je prends note de vos commentaires et dès que possible une mise à jour sera disponible !!!
Nota: en attendant veuillez tenir compte de ceci, la version Pro de Delphi contient déjà une unité contenant la classe TWebBrowser, donc avant toute compilation du projet veuillez suivre ces étapes:
1) si votre version est une version Pro, veuillez éditer le fichier "SfcWebMemo.inc" et procéder au remplacement de cette ligne
{.$DEFINE WebMemoDelphiPro} par
{$DEFINE WebMemoDelphiPro}
concernant la version Perso de Delphi, le fichier "WebBrowserPackage.zip" devrait en principe résoudre le problème mais effectivement comme vient de le faire remarqué Kofina, merci à lui !!!, le fichier "WebBrowserPack.dpk" contient des liens incorrects(du moins pour certaines personnes parmi vous)
en attendant la mise à jour, veuillez éditer le fichier "WebBrowserPack.dpk" et tout simplement remplacer ces lignes
contains
SHDocVw_TLB in '..\..\..\Imports\SHDocVw_TLB.pas',
MSHTML_TLB in '..\..\..\Imports\MSHTML_TLB.pas';
par
contains
SHDocVw_TLB in 'SHDocVw_TLB.pas',
MSHTML_TLB in 'MSHTML_TLB.pas';
en principe avec cette mise au point, vous ne devrez pas avoir de problème d'installation.
veuillez m'excuser pour tout le retard !!!, je n'avais plus eu de connexion internet depuis un bon moment, et j'ai mis de côté Delphi pour l'apprentissage du c++ !!!, de plus je vois qu'il y a de nouvelles version de Delphi lol j'ai du pain sur la planche :)
@++
19 déc. 2012 à 12:57
votre composant m'a été très utile.
Merci beaucoup.
Note: pour l'install sous Delphi, j'ai dû retirer puis ajouter à nouveau les unités qui marquait des erreurs. C'était juste les chemin d'accès qui n'étaient pas bon.
Merci encore.
Jean-Paul Koffi
30 avril 2011 à 18:01
Erreur de compilation, unités non trouvé (xxx_TLB)
Quelqu'un peut-il m'aider ?
21 déc. 2009 à 12:21
"Défaillance irrémédiable" !
21 déc. 2009 à 11:42
A l'occasion d'un nouveau projet je reviens sur ce composant super interressant.
MAIS !
Après installation/compilation de la démo sous Delphi 2005 la démo ne me permet pas d'enregistrer les modifications ! le fichier reste vide !
Est-ce lié au blocage de l'édition du DHTML sous IE8 ?
J'ai fais des tests sous XP et Vista (tous les 2 avec IE8) et rien n'y fait.
Parfois il y a un message faisant référence à MSHTML.DLL mais ce n'est pas systématique.
Autre info : si je charge un fichier HTML complet, le mode édition est impossible.
Help !
14 sept. 2008 à 19:43
Désolé pour le retard c'est que j'ai eu des soucis avec mon pc (Disques durs h.s ect), du coup de nombreux composants qui était déjà mises à jour sont partis en fumée, dont WebMemo qui en était à la version bêta 2.0, mais c'est pas bien grave car il me reste un backup de la version beta 1.6 qui elle supporte la gestion des CSS via un composant TSfcCSSManager, Image Background, Border Style , une petite gestion pour l'insertion des tableaux(en beta test), de nombreux événements on été ajoutés , OnDocChanged(par crc32), OnKeyPress(permet également d'interdire une action, par ex: interdire les chiffres, retour chariot ect(vk_return) .. ), OnKeyDown , OnKeyUp , OnBeforeActicate(permet d'interdire la selection tout en autorisant l'usage du menu-contextuel, le seul hic c'est que c'est irréversible car cette évènement se déclenche avant l'initialisation du composant, une fois le composant est initialisé en mode "selection interdite" il semblerait qu'on ne puisse plus revenir en arrière, bon ya surement une solution j'ai pas cherché !!!), ya aussi une gestion de la transparance des fichiers png mais pour le moment ça coince quelque part ... sinon j'ai cherché si il y avait un truc sur le net comparable à TWebBrower et je suis tombé sur http://terrainformatica.com/htmengine/screenshots.whtm à peine 624k la dll , elle consomme beaucoup moins de resource qu'internet explorer, ell gère parfaitement bien la transparence des fichiers png mais là encore problème car elle ne prend pas en charge les fichiers css, le projet à été abandonné bien que la dll et la doc circule encore sur le net mais il n'existe pas de wrapper en delphi, et il doit y avoir de nombreuses interfaces com.
Tukkkko:le zip n'est pas corrompu re-vérifie !!!
b20n00:ça me rappel que j'au oublié de rendre public la propriété Enabled, essaie donc WebMemo.Enabled := False en runtime, sinon comme cité plus haut il est possible d'interdire la selection lors de l'initialisation du composant(pour un mode loggeur par exemple)
voilà reste plus qu'à attendre un peu la mise la jour
Bonne prog à vous @+
13 sept. 2008 à 13:50
Je te propose d'ajouter trois options:
- est-ce qu'on peut permettre et empecher la copie du texte à partir du composant en fonction de l'état ReadOnly de votre composant? si readonly est false pas de copier/coller mermi.
car j'ai remarqué que votre composant permet la copie par ctrl+c et ctrl+Ins malré que j'ai désactivé la copie par menu alors que le composant WebBrowser ne le permet pas.
- Pour le texte n'est-il pas possible de le justifié?
- Intégrer les tableau.
16 juin 2008 à 09:47
Je suis intéressé par ton projet!
Ceci dit, il semble que le zip soit corrompu :-(
T'es-il possible de le mettre à jour, STP?
Bonne journée!
Tukkkko
16 mars 2007 à 14:47
décidemment j'ai trop abusé du capuccino ;)
tu as tout à fait raison pour le CRC, je pense qu'on peut pas faire autrement pour l'instant !!!.
bon j'avais effectué quelques tests
property Modified : Boolean read GetDocModified;
function TCustomWebMemo.GetDocModified: Boolean;
begin
result :not(FDocSize GetDocSize);
end;
avec bien entendu des routines pour mettre a jour FDocSize, et là il ne reste plus qu'a changer FDocSize par FDocHash
il reste aussi l'optimisation de l'algo Crc32 en asm, car le but c'est d'avoir la signature très rapidement
donc @+ pour l'update !
16 mars 2007 à 07:18
Désolé de mettre laissé aller et d'avoir sorti la grosse artillerie ! Mais une bonne scéance de psychanalyse me permettra peut-être de te faire comprendre les raisons de cette dérive !
En fait, contrôler la longueur du texte n'était pas suffisant car il fallait pouvoir détecter les changements de texte du type 'delphi' par 'azerty'. Un simple balayage du type somme n'était pas non plus suffisant car il fallait également détecter les changements du type 'bonjour' par 'jourbon'. C'est pourquoi j'ai fini par sortir le crc32.
Il est vrai que cela consomme des ressources. Mais en introduisant une variable booléenne privée FDocChanged qui mémoriserait si le document a été déjà modifié, on pourrait éviter de dérouler l'argorithme inutilement.
function TCustomWebMemo.GetDocChanged: Boolean;
var
Crc32: LongInt;
begin
Result := FDocChanged;
// Réalise un Crc32 sur le texte complet uniquement si le document n'a pas déjà été modifié
if not(FDocChanged) then
begin
Crc32 := GetDocCrc32;
Result :not(Crc32 FDocCrc32);
FDocCrc32 := Crc32;
end;
end;
procedure TCustomWebMemo.ResetDocChanged;
begin
FDocChanged := false;
FDocCrc32 := GetDocCrc32;
end;
Il y a également dans mon subconcient un besoin refoulé que j'arrive maintenant à exprimer clairement. Mais je pense que cela relève plutôt du fantasme que de la réalité car je ne vois pas techniquement comment on pourra le coder. L'idée serait d'avoir un évènement OnDocChanged ...
@+
15 mars 2007 à 13:58
Wow tout ça ?? lol, bah mon idée c'était a peut près ça, sauf que la méthode du crc devrait être le dernier recourt !!!, ça prend pas mal de resources !!!, et bien en faite je crois qu'il ya plus simple, je viens de testé la méthode qui utilise un StreamAdapter qui permet l'accès au flux du WebBrowser(via MemoryStream), et ça permet donc d'avoir la taille du document ensuite même système que toi on compare la taille initiale et celle en cours !!!, il est maintenant possible d'avoir des infos sur le client web, AppName, UserAgent, Java is Enabled ?, Cookie, Vitesse de Connection ect..., et pour plus tard.. une gestion des tableaux, enfin bref ya quelques modifications et la mise a jour sera dispo dans 2/3 jours.
@+
14 mars 2007 à 17:38
Pour revenir à notre dernier sujet, j'ai testé les ajouts suivants. Pourrais-tu me donner ton avis d'expert.
sylvunix
P.S. : La propriété DocChanged est en écriture car dans mon application, j'ai besoin d'y accéder.
Dans la partie private de la définition de la classe TCustomWebMemo :
FDocCrc32 : LongInt;
function GetDocChanged: Boolean;
Dans la partie protected de la définition de la classe TCustomWebMemo :
property DocChanged : Boolean read GetDocChanged;
Dans l'implémentation :
const TableCrc32:array[0..255] of longint=(
$00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,
$e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
$09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,
$f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
$136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
$fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
$3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,
$dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
$26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,
$cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
$2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,
$98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
$7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,
$91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
$6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
$8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
$4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,
$a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
$44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,
$be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
$5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,
$b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
$ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,
$0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
$f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
$196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
$f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,
$38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
$d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,
$316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
$cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,
$2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
$9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,
$72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
$92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
$68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
$88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,
$616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
$a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,
$40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
$bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,
$54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
$b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d);
function CalculCrc32(Octet: Byte; Crc: LongInt): LongInt;
begin
CalculCrc32 := TableCrc32[byte(Crc xor LongInt(Octet))] xor ((Crc shr 8) and $00ffffff);
end;
Dans la partie implémentation, ajout des lignes suivantes :
function TCustomWebMemo.GetDocCrc32: LongInt;
var
Index: Word;
Crc32: LongInt;
begin
// Calcule le crc32 dur les données au format HTML
Crc32 := $ffffffff;
for Index := 0 to length(Document.Body.innerHTML)-1 do
Crc32 := CalculCrc32(Ord(Document.Body.innerHTML[Index]), Crc32);
Result := Crc32;
end;
function TCustomWebMemo.GetDocChanged: Boolean;
var
Crc32: LongInt;
begin
// Réalise un Crc32 sur le texte colmplet
Crc32 := GetDocCrc32;
Result :not(Crc32 FDocCrc32);
FDocCrc32 := Crc32;
end;
procedure TCustomWebMemo.ResetDocChanged;
begin
FDocCrc32 := GetDocCrc32;
end;
Dans la partie implementation, ajout de ResetDocChanged dans les méthodes suivantes.
procedure TCustomWebMemo.Clear;
begin
if ReadOnly = False then
begin
Document.Body.innerHTML := '';
ResetDocChanged;
end
else
ClearWebCtrl;
FLines.Clear;
end;
procedure TCustomWebMemo.LoadFromFile(const FileName: String);
begin
Clear;
FLines.LoadFromFile(FileName);
WebCtrl.OleObject.Document.WriteLn(FLines.Text);
ResetDocChanged;
end;
procedure TCustomWebMemo.SaveAs(const DefaultFileName: String);
begin
if CanDo then
begin
Document.ExecCommand('SaveAs' , False , DefaultFileName);
ResetDocChanged;
end;
end;
4 mars 2007 à 11:41
Arf oui c'est vrai que la solution du LignesChange n'est valable que lorsque on utiliser Lines.Add() logique :/, ceci dit je ne vois aucune propriété dans la MSDN concernant la modification du document !!!, bon y aura toujours un moyen, par exemple mettre une propriété Modified a false lors de l'ouverture d'un document, ou lors d'un "Clear", et changer l'événement OnKeyDown par OnKeyUp, quitte même a mettre un mini crc, et de comparer a la fin le crc initial et celui en cours car l'accès du flux interne du contrôle WebBrowser est assez simple !!!, je vais voir si y'a pas plus simple !!!
@+
2 mars 2007 à 09:30
J'ai testé tes solutions 2 et 3, la première ne me semblant pas appropriée.
La troisième, celle qui me semble la plus adaptée, me pose un petit problème : la méthode LinesChange n'est jamais appelée.
Pour la seconde, c'est un peu la galère car on récupère vraiment toutes les actions du clavier. Ce qui est un peu normal. Par contre comment faire le tri ? Existe-t-il des fonctions comme en c qui permettent de savoir si un caractère peut être affiché ?
P.S. : Concernant le problème ShowFindDialog, c'est mon I.E. qui a totalement explosé sur l'une de mes machines (plus d'impression ni la possibilité d'ouvrir dans une nouvelle fenêtre) !
Merci
a+
23 févr. 2007 à 00:18
oui en effet pour l'instant il n'y a pas de fonction Changed
cependant il existe plusieurs méthodes pour savoir si le texte effectivement été modifié
1)l'événement WebMemo.OnSelectionChange se déclenche lorsque l'utilisateur a effectué une selection du texte, celà permet de mettre à jour par exemple les boutons de la toolbar pour savoir si la selection est en gras, italic ect..., mais cela ne veut pas forcémment dire que le texte a été modifié !!!
2)l'événement WebMemo.OnKeyDown(Sender: TObject; var Key: TWebMemoKeyInfo) se déclenche lorsque l'utilisateur frappe sur une touche une touche quelconque
Key.Code renvoie la valeur word du code ascii ed la touche
Key.Shift indique l'état des touches Alt, Ctrl, Maj et des boutons de la souris.
Nota : il sera bientôt possible d'interdire l'appuie d'une touche en modifiant tout simplement la valeur de Key.Code
par exemple if Key.Code = VK_RETURN then Key.Code :=0, mais pour l'instant cette exemple ne marche pas(un petit oubli de ma part ^^)
3) dans la classe TCustomWebMemo
on peut ajouter une nouvelle propriété DoChanged
property DocChanged : Boolean read FDocChanged write FDocChanged;
ensuite
procedure TCustomWebMemo.LinesChange(Sender: TObject);
begin
...
ici FDocChanged := True;
biensur il faut que la fonction Clear,LoadFromFile puisse remettre à false l'attribut DocChanged
end;
concernant ShowFindDialog je n'ai aucun probleme avec XP et Win98 ca marche impec, verifie ta version d'internet explorer !!!, dans tous les cas il est préférable voir même indispensable d'avoir une version 5.5 ou ultérieur !!
@+
22 févr. 2007 à 21:11
Je me suis effectivement légèrement planté dans ma question. Il s'agissait bien d'un problème sur ShowFindDialog. Problème qui d'ailleurs ne se pose que sur l'un de mes PC. Toutes mes excuses !
J'ai répondu avec un peu de retard car je cherche comment ajouter une fonctionnalité qui fait défaut. Ce serait l'attribut Changed qui indiquerait si oui ou non le texte a été changé.
J'ai bien une petite piste qui serait d'utiliser l'état du Undo (si une action peut être annulée alors le document a été changé !) mais je ne sais pas comment effacer la liste des actions mémorisées (pour désactiver l'attribut Changed).
Aurais-tu une autre piste ?
sylvunix
9 févr. 2007 à 23:53
Bon je me permet de te répondre ici plutôt que dans ton mp afin d'en faire profiter à d'autres personnes qui pourrait avoir le même problème.
Question : "Je viens de constater un petit problème : la fonction WebMemo.ShowFontDialog ne déclenche pas la boîte de dialogue espérée"
Réponse : il me semble qu'il y a une petite confusion de ta part puisque en effet il n'ya pas de fonction ShowFontDialog a proprement dit dans l'interface WebMemo, je crois que tu as confondu l'appel à la fonction ShowFontDialog avec WebMemo.ShowFindDialog qui n'a bien sûr rien à voir avec la boîte de dialogue de la police.
étant donné qu'on veut changer la font du texte Selectionné j'ai mis cette fonction dans la partie WebMemo.SelRange.FontDialog, pourquoi dans SelRange et non dans WebMemo.ShowFontDialog ?, tout simplement que dans SelRange on peut changer à la fois la police ainsi que sa taille sans affecté tout l'ensemble du contenu HTML mais en modifiant uniquement la partie selectionée !!! ;)
@+
9 févr. 2007 à 15:29
Je ressort ton composant des cartons à l'occasion d'un nouveau projet.
Je viens de constater un petit problème : la fonction WebMemo.ShowFontDialog ne déclenche pas la boîte de dialogue espérée. Je suis en Delphi 7 Professionnel sous XP. Cela fonctionne-t-il de ton côté ?
sylvunix
13 avril 2006 à 19:30
11 avril 2006 à 21:26
11 avril 2006 à 20:04
Le source du programme de démonstration pose quelques soucis lors du chargement (problème sur une ressource image). Serait-il possible de disposer du fichier .bmp d'origine afin de le réintégrer ?
La toolbar sans dessin, ça craint un peu !