Utilisation de composant des une classe

Résolu
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008 - 15 sept. 2008 à 12:32
DjKill77 Messages postés 18 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

@+

13 réponses

Utilisateur anonyme
15 sept. 2008 à 13:39
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;
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
15 sept. 2008 à 16:09
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%" />
3
Utilisateur anonyme
15 sept. 2008 à 19:53
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 )
3
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
15 sept. 2008 à 14:03
Ok merci je vais essayer cela.

Pour ce qui de l'utilisation de onDocumentComplete (de TWebBrowser) je dois faire comment?? Tweb.WebBrowserDocumentComplete ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
15 sept. 2008 à 16:37
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 
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
15 sept. 2008 à 19:06
Par contre quelque chose m'intrigue dans la compréhension du code, que signifie au niveau de la classe le "property" ??
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
15 sept. 2008 à 20:23
Ok, merci pour ces précisions.
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
15 sept. 2008 à 22:14
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...
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
16 sept. 2008 à 13:10
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%" />
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
16 sept. 2008 à 13:23
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...
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
16 sept. 2008 à 16:37
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...
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
16 sept. 2008 à 22:37
N'y aurait il pas moyen d'implémenter directement la procédure onDocumentCOmplete plutot que de passer par la procédure DoDocumentComplete ??
0
DjKill77 Messages postés 18 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 septembre 2008
17 sept. 2008 à 15:17
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
0
Rejoignez-nous