begin process at 2010 03 19 22:50:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Exécution

 > DLLFORM AVEC STYLE XP NO SCRATCH

DLLFORM AVEC STYLE XP NO SCRATCH


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Exécution Classé sous :style, xp, form, fermeture, dll Niveau :Débutant Date de création :02/10/2005 Vu / téléchargé :5 805 / 686

Auteur : shining

Ecrire un message privé
Site perso
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
ce code montre comment faire pour donner le Style XP à une Form incluse dans une DLL et surtout comment bien gerer la fermeture de celle-ci !!!

Source

  • DLLEntryPoint(DLL_PROCESS_DETACH)(voir le zip)
DLLEntryPoint(DLL_PROCESS_DETACH)(voir le zip)

 Conclusion

pour donner le style XP il faut bien entendu avoir windows XP :), d'ailleurs ce code utilise XPMan,

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SFCDELPHILITE(AVEC CETTE LIBRAIRIE VOUS POUVEZ CRÉER UNE APP...
Source avec Zip Source avec une capture SHININGDATABASE & VIRTUALDATABASE DEUX COMPOSANTS ORIENTÉS D...
Source avec Zip Source avec une capture FASTGRADIENT (METTEZ DES DÉGRADÉS DE COULEURS DANS VOS APPLI...
Source avec Zip COMPOSANT HASHPROTECTOR (PROTÉGEZ VOS APPLICATIONS CONTRE L...
Source avec Zip Source avec une capture COMPOSANT EMOTICONMANAGER (DONNEZ DE L'EMOTION À VOS APPLICA...

 Sources de la même categorie

Source avec Zip Source avec une capture SURVEILLANCE DU CONTENU D'UN DOSSIER par botelec
Source avec Zip GÉNÉRATEUR DE JET DE DÉS par koriteki
Source avec Zip Source avec une capture LES FIBERS : DES THREADS NON PRÉEMPTÉS PAR LE SYSTÈME par Caribensila
Source avec Zip Source avec une capture UAC (USER ACCOUNT CONTROL) - EXÉCUTER UNE APPLICATION EN TAN... par ni69
BLOQUER LE TASKMGR SANS CLÉ DE REGISTRE par craftsystem

 Sources en rapport avec celle ci

SYNCHRONISATION DE THREADS DANS DES DLL par saib
Source avec Zip DYNAMIC LIBRARY LOADER CLASS: GAGNEZ DU TEMPS POUR CHARGER L... par f0xi
Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES par Bacterius
Source avec Zip Source avec une capture RÉDACTEUR D'UNITÉ DE CHARGEMENT DYNAMIQUE DE DLL par rt15
Source avec une capture STYLE XP AVEC SANS CODE SUPPLÉMENTAIRE par cedricbi

Commentaires et avis

Commentaire de MAURICIO le 04/10/2005 13:00:50

Ta description ne correspond pas à ta source. Les forms contenues dans les Dlls ne seront qu' avec le style XP seulement si le programme qui l' appelle est au style XP.
Si tu enlève la déclaration de l' unité XPMan de l' unité uDLLDemo, ta form dans la dll ne sera plus avec le style XP.

Par contre, et c' est ce qui m' interessait dans cette source, c' est la gestion de MDI forms depuis une dll.

Pour ceux qui ne savent pas quoi faire lors des messages d' erreur de compilation, cela vient de la ouput directory et de la unit ouput directory qui sont définis dans les options du projet (onglet Directories/Conditionals).

Commentaire de shining le 05/10/2005 00:33:07

"Ta description ne correspond pas à ta source. Les forms contenues dans les Dlls ne seront qu' avec le style XP seulement si le programme qui l' appelle est au style XP.
Si tu enlève la déclaration de l' unité XPMan de l' unité uDLLDemo, ta form dans la dll ne sera plus avec le style XP."

oui effectivement si tu retires XPMan, tu n'auras plus le style XP, ça me semble logique, car sinon j'aurai mis 'Skinner XP', enfin bref dans l'explication finale, il est dit qu'il faut windows XP et biensûr avec le theme XP activé, sinon effectivement il manque deux repertoire dans le zip(j'aime pas winzip, vive winrar), il manque le repertoire DCU et EXE qui doivent être placer dans le même repertoire que DLLDemo.dpr, et il ne faut surtout pas effacer les fichiers de configurations tels que *.dof, *.cfg, car ils contiennent la stratégie de compilation. fichier temporaires->DCU\, DLL + EXE->EXE\.
voilà si ce code sert au moins à une personne bah tant mieux :)

Commentaire de Delphiprog le 12/08/2006 17:37:16 administrateur CS

Grace à Cirec, je viens de découvrir la solution de Shining.
Alors là, je dis bravo.
J'ai longtemps cherché pourquoi on avait une AV en quittant l'application et je n'avais pas trouvé de réponse sur le web anglophone.
Et dire que ce je suis passé à côté de cette perle à l'époque.
Mais que faisais-je donc le 2 octobre 2005 ? mdr
Là, mon cher Shining, ça mérite un trophée.

Commentaire de rt15 le 19/08/2006 14:50:03 administrateur CS

Salut,

Pour commencer, bravo pour ce source. Affecté l'objet Application de l'exe à l'objet Application de la dll, je n'y aurais jamais pensé.

A noter que :
Ce n'est pas nécessaire si la dll ne contient pas des fiches MDI.
Il faut que le langage de l'exe propose une classe TApplication.
L'aide de Delphi ne vat pas si loin (Et donc pas assez loin dans le cas du MDI) : Pour écrire une DLL utilisant des fiches VCL, affectez le handle de la fenêtre principale de l'EXE hôte à la propriété Application->Handle de la DLL. Cela fait de la fiche de la DLL une partie de l'application hôte. N'affectez jamais la propriété Handle dans un EXE.

Malheureusement pour moi, ce source ne comble pas mes attentes.

En effet, la fiche contenue dans la dll de ce source comporte 2 Button et un Memo.
Je n'ai jamais eu de soucis en utilisant ses composants dans une dll appelé depuis un exe sous thème XP.
Par contre, il suffit de rajouter un SpeedButton, ou un RadioGroup, ou un GroupBox, ou un StringGrid... sur la fiche de ce source pour se déguster une exception à la fermeture de l'appli.

Pour finir, quelques suggestions d'amélioration du code :

Ligne 46 :
procedure DLLEntryPoint(dwReason: DWORD); stdcall;

L'aide de Delphi fournit une déclaration à peine différente.
Respecter celle-ci permettrait de se passer de pointeur non typé et des @.
(Il ne faut pas oublier de modifier aussi la déclaration de la procédure dans le projet de l'exe).

La structure de sauvegarde donnerait ça :

    Type
    TDllAppInfo = record
    OldApp  : TApplication;
    OldScr  : TScreen;
    OldProc : procedure(dwReason: Integer);
    end;

Ligne 59 :
DLLProc     := DLLApp.OldProc;

On remet l'ancienne procédure en place... Mais n'est ce pas un peu tard ?
Ce code est en effet executé quand la raison est DLL_PROCESS_DETACH, il y a donc peu de chance que l'ancienne procédure soit appelée par la suite...
(A noter que curieusement, DLLApp.OldProc pointe sur rien. DllProc contient en effet nil avant que la dll ne l'échange avec l'adresse de DLLEntryPoint.)

Ligne 60 et 61 :
Application := DllApp.OldApp;
Screen      := DllApp.OldScr;

DllApp.OldApp et DllApp.OldScr n'ont jamais été affectés.
Autrement dit on fait pointer les deux objets sur n'importe quoi...
Il se trouve que le record en question contient des zéros, et que ce code revient donc à :
Application := nil;
Screen      := nil;

Les affectations :
DllApp.OldApp:= Application;
DllApp.OldScr:= Screen;

ont très certainement été oubliées dans le code d'initialisation.


Ce qui me chagrine dans tout ça, c'est que les points d'entrée semble appelés... des fois.
Le sdk win32 semble pourtant préciser que le système appelle lui même cette routine.

Pour ne pas s'embêter avec ça, on peut passer par des sections d'initalisation et finalisation.

Voilou donc ma petite customisation du code :

================================================================================
library MyDLL;

uses
  SysUtils,
  Classes,
  Forms,
  MyDLLFormWnd in 'Forms\MyDLLFormWnd.pas' {FrmMain};

{$R *.res}

procedure CreateAppMDI(App: TApplication); stdcall;
begin
    Application:= App;
    if FrmMain = nil then
    begin
      FrmMain:= TFrmMain.Create(App);
      FrmMain.Show;
    end;
end;

exports
    CreateAppMDI;
    
begin

end.
================================================================================
program DLLDemo;

uses
  Forms,
  uDLLDemo in 'Forms\uDLLDemo.pas' {FrmMainDemo};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFrmMainDemo, FrmMainDemo);
  Application.Run;
end.
================================================================================
unit uDLLDemo;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, XPMan, Menus;

type
  TFrmMainDemo = class(TForm)
    MainMenu1: TMainMenu;
    MnuPlugin: TMenuItem;
    MnuDllTest: TMenuItem;
    procedure MnuDllTestClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  FrmMainDemo: TFrmMainDemo;

procedure CreateAppMDI(App: TApplication); stdcall; external 'MyDLL.dll';

implementation

{$R *.dfm}

procedure TFrmMainDemo.MnuDllTestClick(Sender: TObject);
begin
    CreateAppMDI(Application);
end;

end.
================================================================================
unit MyDLLFormWnd;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFrmMain = class(TForm)
    Btn1: TButton;
    Btn2: TButton;
    Memo1: TMemo;
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  FrmMain: TFrmMain;
  OldApplication: TApplication;
  
implementation

{$R *.dfm}

initialization
  FrmMain:= nil;
  OldApplication:= Application;
finalization
  Application:= OldApplication;
end.
================================================================================

Commentaire de stmic le 05/10/2006 17:32:34

Bonjour,
Je découvre avec ce source des possibilités que je n'avais pas imaginé. Super.

J'ai cru comprendre, de ce que dit RT15, qu'il est possible d'appeler cette DLL depuis un autre langage et donc de se passer du passage de TApplication. Mais à quel moment doit-on coder la modification du handle dans la DLL, SVP ?

Commentaire de rt15 le 06/10/2006 15:24:03 administrateur CS

C'est que j'ai du mal m'exprimer, comme d'hab. Utiliser une fiche fille MDI depuis un exe dans un autre langage je saurais pas faire. (Mais une fiche tout court, ça ne pose aucun problème).

Commentaire de Bacterius le 14/03/2008 18:01:38

Ben moi je n'ai pas XPMan, j'ai Delphi3, et j'utilise une ressource {$R WindowsXP.res} et ca marche très bien le style XP :p (enfin ca ne dépend pas des propriétés de l'écran...).
Juste pour dire que XPMan n'etait pas nécessaire pour avoir des zolis boutons ;)

Cordialement, Bacterius !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

form et dll [ par somewhere ] est il possible de créé une dll contenant une forme mais avec 3 fichiers:madll.dpr,unit1.pas,unit1.dfmde maniere a ajouter simplement des composants a Windows XP !!!! :) [ par MAsterC ] Comment on fait pour avoir le style de Windows XP dans nos programme avec Delphi(6).=================================-------------------->COMPOSANT Forms dans DLL [ par cdodijon ] Bonjour,J'ai créé une dll qui cree une form qui elle même cree une autre form de parametres: ça semble fonctionner mais j'ai deux problèmes:- le compo Barre style XP [ par AlexY ] Bonjour, est ce que vous sauriez me dire comment faire un menu du style de windows XP. A savoir, dans le panneau de config, le menu vertical de gauche Form dans une Dll [ par bgK ] J'ai créé une Dll contenant une form delphi.A partir de mon application, je parviens à éxécuter cette form.Lorsque je clique sur la croix pour fermer Style XP sous Win 2000 [ par jmp77 ] hello à tous et toutes,Voilà je voudrais savoir si quelqu'un sait comment avoir les fenetres de mes applications avec le style XP sous windows 2000?PS Besoin d'aide avec Delphi sur une .dll avec une form ! [ par Delirium ] J'essai d'expliquer le plus clairement possible... J'ai fait une dll pour mIRC qui contien une form, pour renvoyer des données a mIRC, j'utilise : Style XP [ par LeGuepard ] Salut à tous!J'ai parcouru le forum avant de vous écrire, mais je n'ai pas trouvé la réponse à la question suivante!Comment détecter l'affichage de Wi fermeture d'une Form [ par catmldrd ] Bonjour,Je cherche une façon pour fermer la formdans le module OnActivate quandil ne satisfait pas à certaine condition.cette form est appeler par un Emp^cher la fermeture d'un form [ par vincentstryckmans ] Salut, Je souhaite empêcher la fermeture d'un form lorsque mon application est mode d'édition. Retirer [biSystemMenu] de la proriét&#


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales