Utilisation de composant des une classe [Résolu]

Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
- - Dernière réponse : DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
- 17 sept. 2008 à 15:17
Bonjour à toutes et à tous,
J'aimerais réaliser un chat sous delphi, mais je m'impose une programmation en objet histoire de faire un code propre et modulaire.
Mais j'ai un soucis au niveau d'une classe qui utilise un TWebBrowser. Voici ce que j'ai fait histoire de ne pas paraitre trop flou :

Tweb = class(TComponent)  // Pas sur de l'utilité à mettre TComponent
  private
    WebBrowser: TWebBrowser;
    ip :string;
  public
    constructor Init();
    destructor Destroy();
    function getIp():string;
  end;

constructor Tweb.Init;
begin
 WebBrowser.Create(self);  // J'ai un doute pour la création de l'objet...
 ip := '';
end;

destructor Tweb.Destroy;
begin
 WebBrowser.Destroy;  // La destruction me semble un peu trop simple....
end;

Est ce que le constructeur et le destructeur sont bon ou pas ?
Ensuite j'aimerais utiliser l'évènement onDocumentComplete du TWebBrowser pour pouvoir travailler dessus, sauf que je ne vois pas trop comment faire (d'habitude c'était toujours simple de cliquer sur le bouton correspondant de l'objet qui est sur le formulaire, mais là j'avoue être un peu dérouté )

D'avance merci de vos réponses

@+
Afficher la suite 

13 réponses

Meilleure réponse
3
Merci
Salut,

Deux remarques :

1)constructor Init(); : T'es sur de ton coup là ?
Ca serait pas plutot cela :

TComponent
  private
    WebBrowser: TWebBrowser;
    ip :string;
  public
    constructor Create(AOwner:TComponent); override;
    destructor Destroy();
    function getIp():string;
  end;

constructor Tweb.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Font.Color:= clBlue;
Font.Style:=[fsUnderline];
Cursor:=crHandPoint;
end ;

Non car là ton composant tu ne le crée pas (inherited Create(AOwner);
)

2)Le destructeur : ca serait pas plutot cela ?
Destructor Destroy; Override;

3)Ancêtre
Tweb = class(TComponent) 
    WebBrowser: TWebBrowser;

Pourquoi ne pas hériter le TWebBrowser

Tweb = class(TWebBrowser) 
private
    ip :string;
  public
    constructor Create(AOwner:TComponent); override;

    Destructor Destroy; Override;
    function getIp():string;
  end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 211 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
suivre les remarques de Francky : Create et pas Init

puis :

Type
  TIPFormat = (ifV4, ifV6);
  TIPV4 = array[0..3] of byte;
  TIPV6 = array[0..15] of byte;

  TWeb = class(TComponent)
  private
    fWebBrowser: TWebBrowser;
    fIPV4 : TIPV4;
    fIPV6 : TIPV6;
    fIPFormat : TIPFormat;
    function GetIP: String;
    procedure SetIP(value : string);
  protected
    procedure DoDownloadBegin(Sender: TObject);
    procedure DoDownloadComplete(Sender: TObject);
    procedure DoDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    procedure DoFileDownload(ASender: TObject; var Cancel: WordBool);
    procedure DoProgressChange(ASender: TObject; Progress, ProgressMax: Integer);
    procedure DoStatusTextChange(ASender: TObject; const Text: WideString);
  protected
    property IPFormat : TIPFormat read fIPFormat write fIPFormat default ifV4;
  published
    property IP : string read GetIP write SetIP;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

function StrToIPV4(const S: string): TIPV4;
var L, N, I, U : integer;
const
  CTB : array['0'..'9'] of byte = (0,1,2,3,4,5,6,7,8,9);
begin
  L := Length(S);
  Assert((L > 6) and (L < 16), 'Error : string is not IPV4.');
  I := 0;
  U := 0;
  for N := 1 to Length(S) do
  begin
    case S[N] of
      '0'..'9': begin
        case U of
          0    : result[I] := CTB[S[N]];
          1..2 : result[I] := CTB[S[N]] + (result[I]*10);
        end;
        inc(U);
        assert(U < 4, 'Error : string is not IPV4.');
      end;
      '.' : begin
         inc(I);
         U := 0;
      end;
    end;
  end;
end;

function IPV4ToStr(const IP: TIPV4): string;
begin
  result := format(
   '%d.%d.%d.%d',
   [ IP[0],IP[1],IP[2],IP[3] ]
  );
end;

function StrToIPV6(const S: string): TIPV6;
var
  N,I,H,L : integer;
const
  CNTB : array['0'..'9'] of byte = (0,1,2,3,4,5,6,7,8,9);
  CHTB : array['a'..'f'] of byte = ($a,$b,$c,$d,$e,$f);
begin
  L := Length(S);
  Assert(L = 39, 'Error: string is not IPV6');
  I := 0;
  H := 0;
  for N := 1 to L do
  begin
    case S[N] of
      '0'..'9' : begin
        case H of
          0 : result[I] := CNTB[S[N]];
          1 : result[I] := (result[I] shl 4) or CNTB[S[N]];
        end;
        inc(H);
      end;
      'a'..'f' : begin
        case H of
          0 : result[I] := CHTB[S[N]];
          1 : result[I] := (result[I] shl 4) or CHTB[S[N]];
        end;
        inc(H);
      end;
    end;
    if H > 1 then
    begin
      inc(I);
      H := 0;
    end;
  end;
end;

function IPV6ToStr(const IP: TIPV6): string;
const
  HXTSTR : array[0..$F] of char = '0123456789abcdef';
begin
  SetLength(result, 39);
  //loop unfolded
  result[1]  := HXTSTR[IP[0] shr 4];
  result[2]  := HXTSTR[IP[0] and $F];
  result[3]  := HXTSTR[IP[1] shr 4];
  result[4]  := HXTSTR[IP[1] and $F];
  result[5]  := ':';
  result[6]  := HXTSTR[IP[2] shr 4];
  result[7]  := HXTSTR[IP[2] and $F];
  result[8]  := HXTSTR[IP[3] shr 4];
  result[9]  := HXTSTR[IP[3] and $F];
  result[10] := ':';
  result[11] := HXTSTR[IP[4] shr 4];
  result[12] := HXTSTR[IP[4] and $F];
  result[13] := HXTSTR[IP[5] shr 4];
  result[14] := HXTSTR[IP[5] and $F];
  result[15] := ':';
  result[16] := HXTSTR[IP[6] shr 4];
  result[17] := HXTSTR[IP[6] and $F];
  result[18] := HXTSTR[IP[7] shr 4];
  result[19] := HXTSTR[IP[7] and $F];
  result[20] := ':';
  result[21] := HXTSTR[IP[8] shr 4];
  result[22] := HXTSTR[IP[8] and $F];
  result[23] := HXTSTR[IP[9] shr 4];
  result[24] := HXTSTR[IP[9] and $F];
  result[25] := ':';
  result[26] := HXTSTR[IP[10] shr 4];
  result[27] := HXTSTR[IP[10] and $F];
  result[28] := HXTSTR[IP[11] shr 4];
  result[29] := HXTSTR[IP[11] and $F];
  result[30] := ':';
  result[31] := HXTSTR[IP[12] shr 4];
  result[32] := HXTSTR[IP[12] and $F];
  result[33] := HXTSTR[IP[13] shr 4];
  result[34] := HXTSTR[IP[13] and $F];
  result[35] := ':';
  result[36] := HXTSTR[IP[14] shr 4];
  result[37] := HXTSTR[IP[14] and $F];
  result[38] := HXTSTR[IP[15] shr 4];
  result[39] := HXTSTR[IP[15] and $F];
end;

constructor TWeb.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fWebBrowser := TWebBrowser.Create(self);
  //fWebBrowser.Parent := self.Parent;
  //fWebBrowser.SetBounds(0,0,320,240);
  fWebBrowser.OnDocumentComplete := DoDocumentComplete;
  fWebBrowser.OnDownloadBegin    := DoDownloadBegin;
  fWebBrowser.OnDownloadComplete := DoDownloadComplete;
  fWebBrowser.OnFileDownload     := DoFileDownload;
  fWebBrowser.OnProgressChange   := DoProgressChange;
  fWebBrowser.OnStatusTextChange := DoStatusTextChange;

  fIPFormat := ifV4;

  FillChar(fIPV4, 4, 0);
  FillChar(fIPV6, 16, 0);
end;

destructor TWeb.Destroy;
begin
  fWebBrowser.Free;
  inherited;
end;

function TWeb.GetIP: String;
begin
  case self.IPFormat of
    ifV4: result := IPV4ToStr(fIPV4);
    ifV6: result := IPV6ToStr(fIPV6);
  end;
end;

procedure TWeb.SetIP(value: string);
begin
  case self.IPFormat of
    ifV4: fIPV4 := StrToIPV4(value);
    ifV6: fIPV6 := StrToIPV6(value);
  end;
end;

procedure TWeb.DoDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  //
end;

procedure TWeb.DoDownloadBegin(Sender: TObject);
begin
  //
end;

procedure TWeb.DoDownloadComplete(Sender: TObject);
begin
  //
end;

procedure TWeb.DoFileDownload(ASender: TObject; var Cancel: WordBool);
begin
  //
end;

procedure TWeb.DoProgressChange(ASender: TObject; Progress, ProgressMax: Integer);
begin
  //
end;

procedure TWeb.DoStatusTextChange(ASender: TObject; const Text: WideString);
begin
  //
end;

<hr size="2" width="100%" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 211 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
3
Merci
Property est de l'Anglais  : la traduction en Francais est propriété. Autrelent dit tu déclares une propriété (Regarde dans l'aide de Delphi : Touche F1 )

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 211 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Ok merci je vais essayer cela.

Pour ce qui de l'utilisation de onDocumentComplete (de TWebBrowser) je dois faire comment?? Tweb.WebBrowserDocumentComplete ??
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Ok merci beaucoup d'avoir éclairé ma lanterne.
Et merci aussi d'avoir été jusqu'à me donner les fonction IPv4toStr,etc... cela va me permettre de mieux me concentrer sur le reste 
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Par contre quelque chose m'intrigue dans la compréhension du code, que signifie au niveau de la classe le "property" ??
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Ok, merci pour ces précisions.
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Vous allez me trouver embêtant, mais lorsque fWebBrowser.Navigate a été sur la page normalement l'évènement onDocumentComplete se déclenche, mais ici si j'ai bien compris cet évènement est "relayé" par le DoDocumentComplete qui a été déclaré dans le create....
Mais je dois surment avoir mal compris quelque chose car il ne va pas dans le DoDoc...
Commenter la réponse de DjKill77
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
erf ...

en même temps TWebBrowser c'est un peu le composant pourris de chez pourris.

pas d'erreur flagrante dans le code, logiquement tout doit fonctionner.
tu as mis quelque chose dans la procedure DoDocumentComplete ?

<hr size="2" width="100%" />
Commenter la réponse de f0xi
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Oui j'ai mis quelque chose dedans, mais pour voir s'il passait bien dedans j'ai mis un showmessage au début de DoDocumentComplete, mais il ne me l'affiche pas donc il ne va pas dedans...
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Je sais pas si c'est normal, mais j'ai modifié un peu et il me met une erreur d'incompatibilité de type :

fWebBrowser.onDocumentComplete := Tweb.DoDocumentComplete;

Il me dit que TWebBrowserDocumentComplete n'est pas compatible avec une procédure...
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
N'y aurait il pas moyen d'implémenter directement la procédure onDocumentCOmplete plutot que de passer par la procédure DoDocumentComplete ??
Commenter la réponse de DjKill77
Messages postés
20
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 septembre 2008
0
Merci
Bonjour,
Je viens de trouver quelque chose qui m'a l'air intéressant, mais je ne sais pas si cela résoudra mon problème et si oui comment dois je m'en servir :

http://brouardf.club.fr/DelphiRTTI.html

D'avance merci

Cordialement
Commenter la réponse de DjKill77