Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TOP MEMBRES CODES-SOURCES


Information sur la source

Catégorie :Réseau & Internet Classé sous : top, membres, code, source Niveau : Initié Date de création : 10/11/2004 Date de mise à jour : 20/11/2004 18:09:18 Vu / téléchargé: 6 477 / 372

Note :
8,08 / 10 - par 12 personnes
8,08 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (26)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
1) Voir le screen
2) Il "chope" la liste des 30 membres les plus actifs au mois ou a la semaine, sur le site de C-S de votre choix.
3) Grace au clic droit, vous avez acces a un menu pour visionner les messages, sources, profil, ecrire, site web de la personne.
4) demonstration de HyperParse, Inet
 

Source

  • unit UTopMembersMainForm;
  • interface
  • uses
  • shellapi, strman, inet, HyperParse, Windows, Messages, SysUtils, Variants,
  • Classes, Graphics, Controls, Forms,
  • Dialogs, Menus, UnPas2, XPMan, ComCtrls, ExtCtrls, StdCtrls, ImgList;
  • type
  • TTopMembersForm = class(TForm)
  • lvMembers: TListView;
  • PopupMenu: TPopupMenu;
  • XPManifest1: TXPManifest;
  • UnPas21: TUnPas2;
  • pop_profil: TMenuItem;
  • pop_ecrire: TMenuItem;
  • pop_msgsite: TMenuItem;
  • pop_voirtout: TMenuItem;
  • pop_voirsourcessite: TMenuItem;
  • pop_voirtssources: TMenuItem;
  • pop_siteweb: TMenuItem;
  • ImagesSites: TImageList;
  • rg_top: TRadioGroup;
  • bt_find: TButton;
  • cb_photo: TCheckBox;
  • pnlstatusbar: TPanel;
  • pb_load: TProgressBar;
  • lblstatus: TLabel;
  • cb: TComboBoxEx;
  • procedure bt_findClick(Sender: TObject);
  • procedure FormCreate(Sender: TObject);
  • procedure cb_photoClick(Sender: TObject);
  • procedure lvMembersClick(Sender: TObject);
  • procedure GoToDetails(Sender: TObject);
  • procedure FormDestroy(Sender: TObject);
  • procedure PopupMenuPopup(Sender: TObject);
  • private
  • { Site choisi ds la liste}
  • Site: string;
  • { Liste de chaines contenant les membres}
  • MembersList: TStringList;
  • { si on choisit le Site "codes sources" il y a une ligne en moins
  • par utilisateur donc on utilise un Offset}
  • Offset: integer;
  • procedure GetMembers;
  • { Ouvre la page web à l'url reçue en paramètre}
  • procedure Go(const Url: string);
  • { Actualise la barre de statut}
  • procedure Loader(Max: Word; const Status: string);
  • end;
  • var
  • TopMembersForm: TTopMembersForm;
  • implementation
  • uses USnapshotForm;
  • {$R *.dfm}
  • type
  • THtmlParser = THyperParse;
  • const // création du tableau des hôtes, 17 sites, maxi 13 caractères
  • Hosts: array[0..17] of string[13] =
  • ('codes-sources', 'aspfr', 'asmfr',
  • 'cppfrance', 'csharpfr', 'cfmfrance',
  • 'delphifr', 'flashkod', 'foxprofr',
  • 'graphfr', 'ircfr', 'javafr',
  • 'javascriptfr', 'pdafr', 'phpcs',
  • 'pythonfrance', 'sqlfr', 'vbfrance');
  • sUrlPhoto = 'http://www.codes-sources.com/userphoto.aspx?ID=%s&normal=1';
  • procedure TTopMembersForm.Loader(Max: Word; const Status: string);
  • begin
  • pb_load.position := 0;
  • pb_load.Max := Max;
  • lblStatus.Caption := Status;
  • end;
  • procedure TTopMembersForm.GetMembers;
  • var
  • MemberItem: TListItem;
  • Parser: THtmlParser;
  • // la requête et le retour (resultat) de la requete, utilisé par Inet.pas
  • squery, sreturn: string;
  • // i : index de boucle
  • i: integer;
  • // TotalCS : position de la ligne "Total CodeS-SourceS" ds le Tstring,
  • TotalCS: integer;
  • // TotalCsSem : idem pour "... cette semaine"
  • TotalCSsem: integer;
  • // pub : idem pour la ligne "Pub",
  • Pub: integer;
  • // nb: sert a passer des lignes lors de l'ajout de membres
  • nb: integer;
  • // Listes de chaines pour les 2 tops
  • slLastMonth, slLastWeek: TStringList;
  • const
  • FileName = 'members.dat';
  • begin
  • // page contenant les données des tops membres
  • sQuery := 'topmembres.aspx';
  • // requete http envoyée par inet.pas
  • sReturn :=
  • SendData(format('www.%s.com', [Hosts[cb.itemindex]]), '', sQuery, '');
  • // si le retour (resultat) de la requete n'est pas vide, alors ...
  • if sreturn <> '' then
  • begin
  • // effacer le contenu de la liste des membres
  • lvMembers.Clear;
  • // initialiser les variables
  • TotalCS := 0;
  • TotalCSsem := 0;
  • Pub := 0;
  • Nb := 0;
  • slLastMonth := TStringList.Create;
  • try
  • slLastWeek := TStringList.Create;
  • try
  • // ajouter le retour ds le slLastMonth
  • slLastMonth.Add(sReturn);
  • // sauver ds un fichier pour le Parser
  • slLastMonth.SaveToFile(FileName);
  • // vider le slLastMonth
  • slLastMonth.Clear;
  • Parser := THtmlParser.Create;
  • try
  • // si le fichier n'existe pas (ce qui me semble pas logique)
  • if not FileExists(FileName) then
  • begin
  • MessageDlg('Problème de lecture de fichier ...', mtError,
  • [mbOk], 0);
  • // et on ferme l'application
  • Close;
  • end;
  • // choix du fichier pour le parser
  • Parser.FileName := FileName;
  • Parser.Execute;
  • Loader(parser.Count - 1, 'Tri des infos reçues');
  • { j'ajoute dans mon TS le texte de la page html, je ne prends
  • pas les <tags> ni les lignes vides}
  • for i := 0 to parser.count - 1 do
  • begin
  • // je ne garde qu'un seul TAG, celui qui contient le n° du membre
  • if sm.strip(Parser[i].Text) <> EmptyStr then
  • if (Parser[i].isTag) then
  • begin
  • if (pos('a href="auteurdetail.aspx?ID=', Parser[i].Text) > 0)
  • then
  • slLastMonth.add(sm.betweenrev('=', '"', Parser[i].Text));
  • end
  • else
  • slLastMonth.Add(Parser[i].Text);
  • pb_load.StepIt;
  • end;
  • Loader(slLastMonth.Count - 1, 'Traitement des infos');
  • // détection des lignes qui délimitent les top membres
  • for i := slLastMonth.Count - 1 downto 0 do
  • begin
  • if slLastMonth.Strings[i] = 'Total CodeS-SourceS cette semaine' then
  • TotalCSsem := i
  • else if slLastMonth.Strings[i] = 'Total CodeS-SourceS' then
  • TotalCS := i
  • else if slLastMonth.Strings[i] = 'Pub' then
  • Pub := i;
  • pb_load.StepIt;
  • end;
  • // séparation du top membres du mois de celui de la semaine
  • for i := TotalCSsem + 1 to pub - 1 do
  • slLastWeek.Add(slLastMonth[i]);
  • // suppression de tout ce qui se trouve aprés "pub"
  • for i := slLastMonth.Count - 1 downto pub do
  • slLastMonth.Delete(i);
  • // suppression de tout ce qui se trouve avant le top de la semaine
  • for i := 0 to TotalCS do
  • slLastMonth.Delete(0);
  • // détection du top en cours
  • if rg_top.ItemIndex = 0 then
  • MembersList.Assign(slLastMonth)
  • else
  • MembersList.Assign(slLastWeek);
  • Loader(29, 'Ajout des membres');
  • // boucle jusqu'a 29, car il y a 30 membres (29 + l'index 0 = 30)
  • for i := 0 to 29 do
  • begin
  • // ajout du membre
  • MemberItem := lvMembers.Items.Add;
  • // le caption (ex: #1)
  • MemberItem.Caption := MembersList[nb];
  • { on incremente deux fois NB pour passer le rang
  • et le n° du membre que l'on affiche pas}
  • inc(nb, 2);
  • // on ajoute le pseudo
  • MemberItem.SubItems.Add(MembersList[nb]);
  • inc(nb);
  • { puis on le passe
  • on ajoute le nb de points du Site choisi avec la Combobox}
  • MemberItem.SubItems.Add(MembersList[nb]);
  • // si on a choisi le top de la semaine ...
  • if cb.ItemIndex > 0 then
  • // alors on passe la ligne des points
  • inc(nb);
  • MemberItem.SubItems.Add(MembersList[nb]);
  • // puis on ajoute la suivante
  • inc(nb);
  • end;
  • finally
  • Parser.Free;
  • end;
  • finally
  • slLastWeek.Free;
  • end;
  • finally
  • slLastMonth.Free;
  • end;
  • end;
  • Loader(0, '= Fin =');
  • end;
  • procedure TTopMembersForm.bt_findClick(Sender: TObject);
  • var
  • OldCursor: TCursor;
  • begin
  • // modif de la barre de status
  • lblStatus.caption := format('Recherche du %s',
  • [rg_top.Items[rg_top.itemindex]]);
  • // modif du titre le la form et de l'appli
  • Caption := Format('Top Membres Actifs %s', [cb.Items[cb.ItemIndex]]);
  • Application.Title := Caption;
  • // on garde sous la main le Site choisi
  • Site := cb.Items[cb.ItemIndex];
  • // modif du titre de la 3eme colonne selon le Site choisi
  • lvMembers.Column[2].Caption := format('Pts %s', [Site]);
  • // calcul du Offset selon le top choisi
  • if cb.ItemIndex = 0 then
  • Offset := 4
  • else
  • Offset := 5;
  • // desactive l'appli complete (facultatif)
  • Enabled := False;
  • // un ptit processmessages pour eviter le "(Ne reponds pas)"
  • application.ProcessMessages;
  • oldCursor := Screen.Cursor;
  • Screen.Cursor := crHourGlass;
  • try
  • // on lance la procédure de recup
  • GetMembers;
  • finally
  • Screen.Cursor := OldCursor;
  • // et on reactive la form
  • Enabled := True;
  • end;
  • end;
  • procedure TTopMembersForm.FormCreate(Sender: TObject);
  • begin
  • cb.ItemIndex := 0;
  • MembersList := TStringList.Create;
  • end;
  • procedure TTopMembersForm.FormDestroy(Sender: TObject);
  • begin
  • MembersList.Free;
  • end;
  • procedure TTopMembersForm.cb_photoClick(Sender: TObject);
  • var
  • s: string; //juste pour le débogage
  • begin
  • // on affiche ou pas la FormWeb (unit2) que si la case est cochée
  • FormWeb.Visible := cb_photo.Checked;
  • // si la case est cochée, alors on affiche la photo
  • if cb_photo.Checked then
  • begin
  • FormWeb.Show;
  • s := format(sUrlPhoto, [MembersList[lvMembers.ItemIndex * Offset + 1]]);
  • FormWeb.web.Navigate(s);
  • // Dimensionner FormWeb (unit2) et mettre à coté
  • FormWeb.Left := Left + Width + 10;
  • FormWeb.top := top;
  • end;
  • end;
  • procedure TTopMembersForm.lvMembersClick(Sender: TObject);
  • begin
  • cb_photo.Enabled := lvMembers.ItemIndex > -1;
  • { activation de la case a cocher seulement
  • si on a cliqué sur une ligne renseignée}
  • if cb_photo.Checked then
  • cb_photoClick(nil);
  • end;
  • procedure TTopMembersForm.Go(const Url: string);
  • begin
  • shellexecute(hInstance, 'OPEN', PChar(format('%s%s', [Url,
  • MembersList[(lvMembers.ItemIndex * Offset) + 1]])), nil, nil,
  • SW_NORMAL);
  • end;
  • procedure TTopMembersForm.GoToDetails(Sender: TObject);
  • begin
  • { quand on click sur un des menus du popupmenu, selon le sender,
  • on envoie une page web}
  • if sender = pop_profil then
  • Go(Format('http://www.%s.com/auteurdetail.aspx?ID=',
  • [Hosts[cb.itemindex]]))
  • else if sender = pop_ecrire then
  • Go(Format('http://www.%s.com/ecriremsg.aspx?ID=', [Hosts[cb.itemindex]]))
  • else if sender = pop_msgsite then
  • Go(Format('http://www.%s.com/forum.v2.aspx?MID=', [Hosts[cb.itemindex]]))
  • else if sender = pop_voirtout then
  • Go('http://www.codes-sources.com/forum.v2.aspx?TMID=')
  • else if sender = pop_voirsourcessite then
  • Go(Format('http://www.%s.com/listeauteur2.aspx?ID=', [Hosts[cb.itemindex]]))
  • else if sender = pop_voirtssources then
  • Go('http://www.codes-sources.com/listeauteur2.aspx?TID=')
  • else if sender = pop_siteweb then
  • Go(Format('http://www.%s.com/membresite.aspx?ID=', [Hosts[cb.itemindex]]));
  • end;
  • procedure TTopMembersForm.PopupMenuPopup(Sender: TObject);
  • var
  • //Pseudo du membre sélectionné
  • Pseudo: string;
  • begin
  • // si on a cliqué ailleurs que sur un membre
  • if lvMembers.ItemIndex <> -1 then
  • begin
  • Pseudo := lvMembers.ItemFocused.SubItems[0];
  • // mise à jour de tous les caption du popupmenu
  • pop_profil.Caption := Format('Profil de %s', [Pseudo]);
  • pop_ecrire.Caption := Format('Ecrire à %s', [Pseudo]);
  • pop_msgsite.Caption := Format('Voir les msgs %s de %s', [Site, Pseudo]);
  • pop_voirtout.Caption := Format('Voir tous les msgs de %s', [Pseudo]);
  • pop_voirsourcessite.Caption := Format('Voir les sources %s de %s', [Site,
  • Pseudo]);
  • pop_voirtssources.Caption := Format('Voir tous les sources de %s',
  • [Pseudo]);
  • pop_siteweb.Caption := Format('Visiter le Site web de %s', [Pseudo]);
  • end;
  • end;
  • end.
unit UTopMembersMainForm;

interface

uses
  shellapi, strman, inet, HyperParse, Windows, Messages, SysUtils, Variants,
  Classes, Graphics, Controls, Forms,
  Dialogs, Menus, UnPas2, XPMan, ComCtrls, ExtCtrls, StdCtrls, ImgList;

type
  TTopMembersForm = class(TForm)
    lvMembers: TListView;
    PopupMenu: TPopupMenu;
    XPManifest1: TXPManifest;
    UnPas21: TUnPas2;
    pop_profil: TMenuItem;
    pop_ecrire: TMenuItem;
    pop_msgsite: TMenuItem;
    pop_voirtout: TMenuItem;
    pop_voirsourcessite: TMenuItem;
    pop_voirtssources: TMenuItem;
    pop_siteweb: TMenuItem;
    ImagesSites: TImageList;
    rg_top: TRadioGroup;
    bt_find: TButton;
    cb_photo: TCheckBox;
    pnlstatusbar: TPanel;
    pb_load: TProgressBar;
    lblstatus: TLabel;
    cb: TComboBoxEx;
    procedure bt_findClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure cb_photoClick(Sender: TObject);
    procedure lvMembersClick(Sender: TObject);
    procedure GoToDetails(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PopupMenuPopup(Sender: TObject);
  private
    { Site choisi ds la liste}
    Site: string;
    { Liste de chaines contenant les membres}
    MembersList: TStringList;
    { si on choisit le Site "codes sources" il y a une ligne en moins
    par utilisateur donc on utilise un Offset}
    Offset: integer;
    procedure GetMembers;
    { Ouvre la page web à l'url reçue en paramètre}
    procedure Go(const Url: string);
    { Actualise la barre de statut}
    procedure Loader(Max: Word; const Status: string);
  end;

var
  TopMembersForm: TTopMembersForm;

implementation

uses USnapshotForm;

{$R *.dfm}
type
  THtmlParser = THyperParse;

const // création du tableau des hôtes, 17 sites, maxi 13 caractères
  Hosts: array[0..17] of string[13] =
  ('codes-sources', 'aspfr', 'asmfr',
    'cppfrance', 'csharpfr', 'cfmfrance',
    'delphifr', 'flashkod', 'foxprofr',
    'graphfr', 'ircfr', 'javafr',
    'javascriptfr', 'pdafr', 'phpcs',
    'pythonfrance', 'sqlfr', 'vbfrance');

  sUrlPhoto = 'http://www.codes-sources.com/userphoto.aspx?ID=%s&normal=1';

procedure TTopMembersForm.Loader(Max: Word; const Status: string);
begin
  pb_load.position := 0;
  pb_load.Max := Max;
  lblStatus.Caption := Status;
end;

procedure TTopMembersForm.GetMembers;
var
  MemberItem: TListItem;
  Parser: THtmlParser;
  // la requête et le retour (resultat) de la requete, utilisé par Inet.pas
  squery, sreturn: string;
  // i : index de boucle
  i: integer;
  // TotalCS : position de la ligne "Total CodeS-SourceS" ds le Tstring,
  TotalCS: integer;
  // TotalCsSem : idem pour "... cette semaine"
  TotalCSsem: integer;
  // pub : idem pour la ligne "Pub",
  Pub: integer;
  // nb: sert a passer des lignes lors de l'ajout de membres
  nb: integer;
  // Listes de chaines pour les 2 tops
  slLastMonth, slLastWeek: TStringList;
const
  FileName = 'members.dat';
begin
  // page contenant les données des tops membres
  sQuery := 'topmembres.aspx';
  // requete http envoyée par inet.pas
  sReturn :=
    SendData(format('www.%s.com', [Hosts[cb.itemindex]]), '', sQuery, '');
  // si le retour (resultat) de la requete n'est pas vide, alors ...
  if sreturn <> '' then
  begin
    // effacer le contenu de la liste des membres
    lvMembers.Clear;
    // initialiser les variables
    TotalCS := 0;
    TotalCSsem := 0;
    Pub := 0;
    Nb := 0;
    slLastMonth := TStringList.Create;
    try
      slLastWeek := TStringList.Create;
      try
        // ajouter le retour ds le slLastMonth
        slLastMonth.Add(sReturn);
        // sauver ds un fichier pour le Parser
        slLastMonth.SaveToFile(FileName);
        // vider le slLastMonth
        slLastMonth.Clear;

        Parser := THtmlParser.Create;
        try
          // si le fichier n'existe pas (ce qui me semble pas logique)
          if not FileExists(FileName) then
          begin
            MessageDlg('Problème de lecture de fichier ...', mtError,
              [mbOk], 0);
            // et on ferme l'application
            Close;
          end;
          // choix du fichier pour le parser
          Parser.FileName := FileName;

          Parser.Execute;
          Loader(parser.Count - 1, 'Tri des infos reçues');
          { j'ajoute dans mon TS le texte de la page html, je ne prends
           pas les <tags> ni les lignes vides}
          for i := 0 to parser.count - 1 do
          begin
            // je ne garde qu'un seul TAG, celui qui contient le n° du membre
            if sm.strip(Parser[i].Text) <> EmptyStr then
              if (Parser[i].isTag) then
              begin
                if (pos('a href="auteurdetail.aspx?ID=', Parser[i].Text) > 0)
                  then
                  slLastMonth.add(sm.betweenrev('=', '"', Parser[i].Text));
              end
              else
                slLastMonth.Add(Parser[i].Text);

            pb_load.StepIt;
          end;

          Loader(slLastMonth.Count - 1, 'Traitement des infos');

          // détection des lignes qui délimitent les top membres
          for i := slLastMonth.Count - 1 downto 0 do
          begin
            if slLastMonth.Strings[i] = 'Total CodeS-SourceS cette semaine' then
              TotalCSsem := i
            else if slLastMonth.Strings[i] = 'Total CodeS-SourceS' then
              TotalCS := i
            else if slLastMonth.Strings[i] = 'Pub' then
              Pub := i;

            pb_load.StepIt;
          end;
          // séparation du top membres du mois de celui de la semaine
          for i := TotalCSsem + 1 to pub - 1 do
            slLastWeek.Add(slLastMonth[i]);
          // suppression de tout ce qui se trouve aprés "pub"
          for i := slLastMonth.Count - 1 downto pub do
            slLastMonth.Delete(i);
          // suppression de tout ce qui se trouve avant le top de la semaine
          for i := 0 to TotalCS do
            slLastMonth.Delete(0);
          // détection du top en cours
          if rg_top.ItemIndex = 0 then
            MembersList.Assign(slLastMonth)
          else
            MembersList.Assign(slLastWeek);

          Loader(29, 'Ajout des membres');
          // boucle jusqu'a 29, car il y a 30 membres (29 + l'index 0 = 30)
          for i := 0 to 29 do
          begin
            // ajout du membre
            MemberItem := lvMembers.Items.Add;
            // le caption (ex: #1)
            MemberItem.Caption := MembersList[nb];
            { on incremente deux fois NB pour passer le rang
             et le n° du membre que l'on affiche pas}
            inc(nb, 2);
            // on ajoute le pseudo
            MemberItem.SubItems.Add(MembersList[nb]);
            inc(nb);
            { puis on le passe
             on ajoute le nb de points du Site choisi avec la Combobox}
            MemberItem.SubItems.Add(MembersList[nb]);
            // si on a choisi le top de la semaine ...
            if cb.ItemIndex > 0 then
              // alors on passe la ligne des points
              inc(nb);
            MemberItem.SubItems.Add(MembersList[nb]);
            // puis on ajoute la suivante
            inc(nb);
          end;
        finally
          Parser.Free;
        end;
      finally
        slLastWeek.Free;
      end;
    finally
      slLastMonth.Free;
    end;
  end;
  Loader(0, '= Fin =');
end;

procedure TTopMembersForm.bt_findClick(Sender: TObject);
var
  OldCursor: TCursor;
begin
  // modif de la barre de status
  lblStatus.caption := format('Recherche du %s',
    [rg_top.Items[rg_top.itemindex]]);
  // modif du titre le la form et de l'appli
  Caption := Format('Top Membres Actifs %s', [cb.Items[cb.ItemIndex]]);

  Application.Title := Caption;
  // on garde sous la main le Site choisi
  Site := cb.Items[cb.ItemIndex];
  // modif du titre de la 3eme colonne selon le Site choisi
  lvMembers.Column[2].Caption := format('Pts %s', [Site]);
  // calcul du Offset selon le top choisi
  if cb.ItemIndex = 0 then
    Offset := 4
  else
    Offset := 5;
  // desactive l'appli complete (facultatif)
  Enabled := False;
  // un ptit processmessages pour eviter le "(Ne reponds pas)"
  application.ProcessMessages;
  oldCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  try
    // on lance la procédure de recup
    GetMembers;
  finally
    Screen.Cursor := OldCursor;
    // et on reactive la form
    Enabled := True;
  end;
end;

procedure TTopMembersForm.FormCreate(Sender: TObject);
begin
  cb.ItemIndex := 0;
  MembersList := TStringList.Create;
end;

procedure TTopMembersForm.FormDestroy(Sender: TObject);
begin
  MembersList.Free;
end;

procedure TTopMembersForm.cb_photoClick(Sender: TObject);
var
  s: string;  //juste pour le débogage
begin
  // on affiche ou pas la FormWeb (unit2) que si la case est cochée
  FormWeb.Visible := cb_photo.Checked;
  // si la case est cochée, alors on affiche la photo
  if cb_photo.Checked then
  begin
    FormWeb.Show;
    s := format(sUrlPhoto, [MembersList[lvMembers.ItemIndex * Offset + 1]]);
    FormWeb.web.Navigate(s);
    // Dimensionner FormWeb (unit2) et mettre à coté
    FormWeb.Left := Left + Width + 10;
    FormWeb.top := top;
  end;
end;

procedure TTopMembersForm.lvMembersClick(Sender: TObject);
begin
  cb_photo.Enabled := lvMembers.ItemIndex > -1;
  { activation de la case a cocher seulement
  si on a cliqué sur une ligne renseignée}
  if cb_photo.Checked then
    cb_photoClick(nil);
end;

procedure TTopMembersForm.Go(const Url: string);
begin
  shellexecute(hInstance, 'OPEN', PChar(format('%s%s', [Url,
    MembersList[(lvMembers.ItemIndex * Offset) + 1]])), nil, nil,
      SW_NORMAL);
end;

procedure TTopMembersForm.GoToDetails(Sender: TObject);
begin
  { quand on click sur un des menus du popupmenu, selon le sender,
    on envoie une page web}
  if sender = pop_profil then
    Go(Format('http://www.%s.com/auteurdetail.aspx?ID=',
      [Hosts[cb.itemindex]]))
  else if sender = pop_ecrire then
    Go(Format('http://www.%s.com/ecriremsg.aspx?ID=', [Hosts[cb.itemindex]]))
  else if sender = pop_msgsite then
    Go(Format('http://www.%s.com/forum.v2.aspx?MID=', [Hosts[cb.itemindex]]))
  else if sender = pop_voirtout then
    Go('http://www.codes-sources.com/forum.v2.aspx?TMID=')
  else if sender = pop_voirsourcessite then
    Go(Format('http://www.%s.com/listeauteur2.aspx?ID=', [Hosts[cb.itemindex]]))
  else if sender = pop_voirtssources then
    Go('http://www.codes-sources.com/listeauteur2.aspx?TID=')
  else if sender = pop_siteweb then
    Go(Format('http://www.%s.com/membresite.aspx?ID=', [Hosts[cb.itemindex]]));
end;

procedure TTopMembersForm.PopupMenuPopup(Sender: TObject);
var
  //Pseudo du membre sélectionné
  Pseudo: string;
begin
  // si on a cliqué ailleurs que sur un membre
  if lvMembers.ItemIndex <> -1 then
  begin
    Pseudo := lvMembers.ItemFocused.SubItems[0];
    // mise à jour de tous les caption du popupmenu
    pop_profil.Caption := Format('Profil de %s', [Pseudo]);
    pop_ecrire.Caption := Format('Ecrire à %s', [Pseudo]);
    pop_msgsite.Caption := Format('Voir les msgs %s de %s', [Site, Pseudo]);
    pop_voirtout.Caption := Format('Voir tous les msgs de %s', [Pseudo]);
    pop_voirsourcessite.Caption := Format('Voir les sources %s de %s', [Site,
      Pseudo]);
    pop_voirtssources.Caption := Format('Voir tous les sources de %s',
      [Pseudo]);
    pop_siteweb.Caption := Format('Visiter le Site web de %s', [Pseudo]);
  end;
end;

end.

Conclusion

uses en plus :
shellapi, strman, inet, HyperParse, Unpas2 (facultatif vous pouvez l'ignorer)

strman, inet et hyperparse : http://diabloporc.free.fr/delphi/

Question : Pourquoi utiliser autre chose que des composants de base ?
Réponse : PARCE QUEEEEE !!
Vraie réponse : parce que HyperParse me parse une page HTML en 2 lignes, que Inet me chope une page web en 2 lignes et que strman joue avec les chaines comme personne :)
Pas d'installations de composants a faire, juste un chemin à ajouter dans le "library path" :D

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • TopMembres.bpgTélécharger ce fichier [Réservé aux membres club]760 octets
  • TopMembres.dprTélécharger ce fichier [Réservé aux membres club]Voir ce fichier395 octets
  • TopMembres.resTélécharger ce fichier [Réservé aux membres club]3 780 octets
  • USnapshotForm.dcuTélécharger ce fichier [Réservé aux membres club]3 832 octets
  • USnapshotForm.dfmTélécharger ce fichier [Réservé aux membres club]916 octets
  • USnapshotForm.pasTélécharger ce fichier [Réservé aux membres club]Voir ce fichier597 octets
  • UTopMembersMainForm.dcuTélécharger ce fichier [Réservé aux membres club]14 421 octets
  • UTopMembersMainForm.ddpTélécharger ce fichier [Réservé aux membres club]51 octets
  • UTopMembersMainForm.dfmTélécharger ce fichier [Réservé aux membres club]63 369 octets
  • UTopMembersMainForm.pasTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 772 octets

Télécharger le zip

Historique

10 novembre 2004 18:53:12 :
12 novembre 2004 11:59:46 :
Optimisation n°1 : v 1.2 :) j'ai supprimé le case...of au profis d'un array( merci grandvizir), j'ai supprimé mes memos qui n'étaient la que pour mes tests, avoir un visuel de sortie, ils sont transformés en TStringList. Ajout d'une procedure pour le changement de la barre de status. Suppression d'une 10aine de ligne au niveau des boucles pour garder seulement les membres ds les TS Ajout de qqs verif (if ...) Suppression de qqs variables inutiles Source commentée au maximum
12 novembre 2004 12:20:21 :
Euh il y avais un bug avec TheTString, c réglé
12 novembre 2004 17:40:24 :
correction bénine de commentaire
20 novembre 2004 18:09:18 :
Code retouché par delphiprog merci a lui :) Prochaine mise a jour : ne plus utiliser Inet.pas

Commentaires et avis

signaler à un administrateur
Commentaire de MAURICIO le 10/11/2004 17:22:52

Il me manque des composants.
Y pas moyen de faire avec les compos de base?

signaler à un administrateur
Commentaire de JulioDelphi le 10/11/2004 17:28:09 administrateur CS

NAAAAAAAAAAAAN
:/
je me facilite le code avec strman, hyperparse et inet ! sans ça, ça va etre de la mega galere

il en manque que 3 ! et je les ai mis dans "explikation finale"

merci

signaler à un administrateur
Commentaire de JulioDelphi le 10/11/2004 17:39:49 administrateur CS

ps : ha, j'utilise aussi les composants JEDI, mais ça, tout lemonde devrait les avoirs :D et le UnPas2.pas est aussi a la meme url ...

signaler à un administrateur
Commentaire de MAURICIO le 10/11/2004 17:43:02

Tans pis, je te mets quand meme 9/10 et ce, surtout pour l' idée originale!!!

signaler à un administrateur
Commentaire de grandvizir le 10/11/2004 17:54:48

Les flaimards qui n'ont pas envie de prendre tous les fichiers vont se coucher. C'est d'ailleurs ce que je vais faire :)))

Le mieux aurait été de les fournir... ou carrément de ne pas les utiliser :))))

Sinon l'idée est bonne...

signaler à un administrateur
Commentaire de JulioDelphi le 10/11/2004 17:59:19 administrateur CS

merchi l'ami :)

l'idée me plait aussi, puis en meme temps on peut voir un exemple d'utilisation de Inet pour recevoir une source de page web en 3 lignes, demo de HyperParse qui permet de parser du Code html en qqs lignes.
j'utilise la combobox JEDI car elle inclut les ptites images sur la gauche.
XpMan c'est le composant qui prends en charge le theme xp, et UnPas2 c'est celui ki cree le (la?) mutex pour eviter de lancer le prog deux fois.

pour le nain je l'ai refais avec les compos de bases, mais ici non :D faites l'effort :p

signaler à un administrateur
Commentaire de JulioDelphi le 10/11/2004 18:02:00 administrateur CS

grandvizir : je les fourni justement ! je donne l'url :| je peux pas les telecharger pour toi chez toi non plus ! abusé ...
ne pas les utiliser ? je te mets au defis de faire idem sans inet et hyperparse. ce code a été commencé hier, fini aujourd'hui, il me reste a optimiser le code mais je ne vaisq pas lacher ces compos.

signaler à un administrateur
Commentaire de JulioDelphi le 10/11/2004 18:17:02 administrateur CS

bah ouè parce que bon :)

en fait le programme en lui meme c un peu ... gnangnan koi :) c'est pas d'une grande utilité extreme au point de devoir le posseder :D

par contre, avec ctte source, vous verrez comment on peut choper une source de page web en 2 lignes ! vous le faites ça avec les "compos de base" ? et parser une page html en 3 lignes ? idem avec les compos de bases ? :/

enfin voila ... chui un peu deçu ke tout le monde veuille coder avec seulement les compos de bases, on ira pas bien loin !

signaler à un administrateur
Commentaire de grandvizir le 10/11/2004 18:20:40

Ohohoho !! Qui te dit qu'avec une boucle REPEAT tout ce code ne serait pas facile. Si on a la page internet, on peut faire l'extraction "assez" facilement. Ne me demande pas, je n'ai pas le temps. Récupérer la page ? Je ne sais pas faire et j'ai pas envie de savoir. Je répète (ou je le dit): le Delphi du réseau internet ne m'intéresse pas.

Finalement, je ne me suis pas mis sous les couvertures. Mais je n'ai cependant toujours rien testé... Je ne teste rien sur Internet. Trop pas fou le mec !

signaler à un administrateur
Commentaire de grandvizir le 10/11/2004 18:26:51

T'imagine le débutant face à des bidules pareils bourrés de composants que personne n'a ?? Déjà que c'est le merdier dans les fichiers DFM avec les versions de Delphi, alors...

Ben ouais. Binaire pour D3, Binaire D5 (flux différent), ASCII pour D6 et D7... Faut jongler, mais pas avec les composants, svp !

signaler à un administrateur
Commentaire de JulioDelphi le 10/11/2004 18:36:07 administrateur CS

n.c.

signaler à un administrateur
Commentaire de grandvizir le 10/11/2004 20:02:30

Je viens de prendre le JEDI: 46.1 Mo seulement... :o)

http://belnet.dl.sourceforge.net/sourceforge/jvcl/JVCL300BETA2Complete.zip
http://belnet.dl.sourceforge.net/sourceforge/jvcl/JVCL300BETA2JCL192-Build1666Complete.zip
http://belnet.dl.sourceforge.net/sourceforge/jvcl/JVCL300BETA2SourceExamples.zip
http://belnet.dl.sourceforge.net/sourceforge/jvcl/JVCL300BETA2SourceOnly.zip

Ca en fera sortir du lit... Encore faut-il les installer !!

signaler à un administrateur
Commentaire de Delphiprog le 11/11/2004 08:50:39 administrateur CS

Je trouve l'idée géniale pour plusieurs raisons :
1- enfin quelque chose de nouveau, du jamais vu ici et en prime, ça utilise notre site internet favori : DelphiFr
2- les principes mis en oeuvre devraient inspirer un type d'application nouveau : personnaliser son appli en y introduisant des données venues du web.

Bravo JulioDelphi.

Ne peut-on pas remplacer la combobox de la librairie Jedi par le composant TComboBoxEx fourni à partir de Delphi 6 (onglet Win32) ? Il semblerait que ce composant remplisse les mêmes fonctions que celui mentionné. Parce que télécharger 46 Mo pour un disposer d'un seul composant, ça fait lourd. Sans compter les problèmes d'installation pour ceux qui débutent.

Je vais donc de ce pas
essayer ce code sympa. ;o]

signaler à un administrateur
Commentaire de grandvizir le 11/11/2004 13:05:05

Tout à fait, en plus le JEDI ne s'installe pas bien chez moi... Tant pis.

Dans <function TFormMain.ConvHost: string;> utilise donc un tableau:
const LesSites : array[0..17] of string = ('www...', [...]);
Du coup: ConvHost:=LesSites[cb.ItemIndex];

Que ferait tu sans les 2 mémos ?? Pourquoi ne pas utiliser un TStringList qui bouffe bien moins de mémoire ? Le pire c'est qu'ils jouent à cache-cache.

signaler à un administrateur
Commentaire de Delphiprog le 11/11/2004 14:05:29 administrateur CS

Hé les gars, vous êtes bien sévères pour la notation !
Je vois la note baisser d'heure en heure et cela sûrement à cause de la difficulté d'installation de composants tierces.
Vous sanctionnez qui au juste ?
Donnez au moins les raisons de vos griefs.

signaler à un administrateur
Commentaire de JulioDelphi le 11/11/2004 14:09:33 administrateur CS

GrandVizir : yes les memos c du bordel, mais je les ai mis pour visualiser ma sortie, mais lors de mon optimisation du code (aujourd'hui ou demain) je les fais disparaitr, sis en 100% certain
ok pour le tableau c'est bien mieux merci :) reponse constructive :)

Delphiprog : merci beaucoup :D ça me fais plaisir. Ok pour la comboboxex que j'avais totalement zappé :S

Bon et bien grand merci a GrandVizir Delphiprog et Mauricio pour vos commentaires, je m'en vais (manger) optimiser le code :D
à tres bientot !

signaler à un administrateur
Commentaire de Forman le 11/11/2004 14:46:17

Salut JulioDelphi,

En ce moment je suis en train de faire un générateur automatique de lexer/parser qui sera inclus directement dans l'IDE. J'ai aussi pas mal de boulot par ailleurs, donc ça n'avance pas très vite...

Normallement, ça devrait être possible de faire assez facilement un parser HTML avec, et de refaire la même chose, en utilisant aussi Indy pour récupérer la page web. A voir dès que j'aurai fini      :-D

signaler à un administrateur
Commentaire de MAURICIO le 11/11/2004 15:11:33

Bon, je ne suis pas flemard au point de ne pas installer les compos (ci quelqu' un a pensé ça), c juste que j' evite de surcharger Delphi avec trop de composants qui a pour effet immediat de charger Delphi et donc, son chargement. Dans ce cas precis, ces compos ne me disent rien en therme d' utilité (pour moi!!!) et vu leur 'poids' ...
De plus, et là j' appelle à votre bon sens, j' evite toujours d' utiliser des compos que je peux remplacer par ceux de base (voire commentaire de DelphiProg) pour que les autres n' ai pas installer des compos dispensables pour l' exemple. Sur ce, je fais un dernier appel: n' oubliez pas de donner votre avis et surtout une note sur les sources que vous visitez: c' est plaisant de jeter un oeil sur une source et de voir les notes attribuées ainsi que les commentaires. Je dis ça parce que qq fois, j' ouvre une source visitée 200 fois, et personne n' est fichu de mettre une note ou un commentaire d' enouragement: pensez au temps qu' a perdu celui qui a posté la source, ça vaut bien 30 secondes de votre temps non? Ok, j' arrete d' ecrire, et merci au ce qui ont lu jusqu' au bout.

signaler à un administrateur
Commentaire de MAURICIO le 11/11/2004 15:15:16

fête pa à tension hot faut te d' or tot gras fffeee...
A+

signaler à un administrateur
Commentaire de Inekman le 11/11/2004 15:40:27

Moi je suis down avec ce que tu as dit Mauricio sauf que je sais pas si on "perd" notre temps à coder :-P Moi je m'éclate ;-)

JulioDelphi, ton programme il arrache. J'aurai jamais eu l'idée de faire un tel truc. Peu importe ce que ça utilise comme compo externe je trouve sérieusement que c'est un code d'une originalité incommensurable.

Mon soutien s'ajoute à ceux de DelphiProg, Mauricio et les autres.

Une seule formule pour te remercier : Bravo

Inekman.10/10

signaler à un administrateur
Commentaire de JulioDelphi le 12/11/2004 12:01:01 administrateur CS

Mise a jour 1.2 :
j'ai supprimé le case...of au profis d'un array( merci grandvizir), j'ai supprimé mes memos qui n'étaient la que pour mes tests, avoir un visuel de sortie, ils sont transformés en TStringList.
Ajout d'une procedure pour le changement de la barre de status.
Suppression d'une 10aine de ligne au niveau des boucles pour garder seulement les membres ds les TS
Ajout de qqs verif (if ...)
Suppression de qqs variables inutiles
Source commentée au maximum

signaler à un administrateur
Commentaire de papyvore le 20/11/2004 11:35:03

bonjour
je viens de tester c'est cool avec top du mois
mais quand je selectionne top de la semaine je reçois
une erreur

"le projet TopMembres.exe a provoqué une classe d'exeption EStringListError avec le message indice hors
limite (150) processus stopé"

la le prog se bloque
(delphi 7)

est ce que jaurais merd.... quelque par
merci pour ce prog

signaler à un administrateur
Commentaire de grandvizir le 20/11/2004 11:55:41

C'est le prog qui se plante nécessairement. En fait, supposons une liste de N items. Le premier est 0, le second 1... le dernier N-1. Le prog chercherait alors le Nè, d'où l'erreur de liste. S'il y a une boucle for, il faut s'assurer qu'un "-1" apparaisse.

Sinon, JD: il avance l'autre idée de programme. Tu m'a toujours pas répondu... Personne n'est faché pourtant.

signaler à un administrateur
Commentaire de JulioDelphi le 20/11/2004 12:08:33 administrateur CS

ok pour l'erreur, je regarde ça des ke je peux

GDVZ> euh nan g pas repondu dsl euh ça avance pas :D c bourrin ton truc lol, demande plutot a NIX une mise a jour :p

signaler à un administrateur
Commentaire de grandvizir le 20/11/2004 12:20:10

Je crois profondément que tous les créateurs de CsSs n'ont pas nécessairement que cela à faire. Ca doit être l'avis de DP selon une remarque qu'il a faite sur le forum. Ils ont pas le temps de corriger une faute d'orthographe (un S qui manque), alors.... Mais c'est tout à fait compréhensible vu la taille gigantesque de CsSs: 28000 codes sources. J'espère qu'ils ont des scripts pour créer leurs CHM. On pourra toujours essayer...

signaler à un administrateur
Commentaire de ni69 le 21/11/2004 15:04:36

Du bon code et une idée originale
Bravo !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Modifier un code source! [ par eleanetre ] Salut! comment peut-on modifier le code source d'un logiciel, et quels sont les outils qui peuvent nous y aider!!Merci d'avance. algorithme genetique code source [ par nana ] je cherche le code source et le programme d'un algorithme génétique pour le problème de TSP ( de préférence en pascal, delphi, fortran sinon autres la source chat indy [ par SpitFire91 ] salut !je voudrais savoir si kelkun aurait des sources d'un chat utiisant les composants indy 9 de delphi ?!j'ai un reseau a créer, j'aimerais utilise Utiliser un code source [ par Wilou62 ] J'ai téléchargé deux fichiers zip, mais à l'intérieur, il n'y pas d'exécutable.Comment faire, donc, pour utiliser le programme ? Philosophie de l'open-source... [ par klem ] Salut tlm,je tiens juste à faire valoir mon avis sur l'open-source et son utilisation.Je trouve que l'idée de sources libres et utilisables par tous e Oups Formatter son code source [ par Remixgame ] Bonjour ,Voila je viens de reformater mon PC , je reinstalle delphi , impécable ..Et puis la MINCE ...Alors que je voulais formatter mon code source e ouverture d'un code source [ par mima ] Bonjour,Question d'un débutant, ayant chargé plusieurs codes sourcepour apprendre, quand je veux les ouvrir j'ai un messaged'erreur "Format de flux in Code source Connexion base SQL server 2000 [ par mdmomo ] Bonjour &#224; tous,Je cherche un bout de programme (code) qui cr&#233;e une connexion &#224; une base SQLServer2000.&nbsp;Merci beaucoup .Bonne progr Editeur Héxadecimal [ par bundyboss ] Salut,je suis all&#233; voir la source "DUMP HEXA FICHIER"&nbsp; http://www.delphifr.com/code.aspx?ID=11704&nbsp;afin de coder un &#233;diteur h&#233; Code source Delphi pour calculatrice en polonaise inverse ? [ par oncledave ] Bonjour &#224; tous, Je recherche un Code source Delphi pour calculatrice en polonaise inverse ? En particulier je cherche &#224; comprendre comment f


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.