Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como crear un control como el de "descargar archivos" de firefox? (https://www.clubdelphi.com/foros/showthread.php?t=67636)

mamcx 27-04-2010 20:12:11

Como crear un control como el de "descargar archivos" de firefox?
 
Estoy armando la interface visual para BestSeller del sistema de plugins. Al igual que firefox, quiero que el usuario pueda descargarlos desde la web y todo eso.

Ahora bien, la parte de armar controles es la que menos me sale... Supongamos que quiero mostrar:

- Un icono a la der.
- En el centro, un titulo y debajo un subtitulo/descripcion
- Version & author a la izq.

(Similar a https://wiki.mozilla.org/Firefox:Download_Manager)

He pensado en usar un TFrame, porque facil armo la plantilla de como se ve las cosas. Pero como lo vuelvo una lista?, o sea, como le pongo scrollbar y todo eso?

Tambien pense en usar un TListView y con CustonDraw hacerle el maquillaje, pero no veo como y segun lo que he leido seria complicado.

Y porque no uso un componente de terceros? Porque desafortunadamente necesito que la idea funcione en Lazarus ;)

roman 27-04-2010 21:11:52

Podrías usar un DBCtrlGrid. Es de bases de datos pero podrías conectarlo a algún dataset en memoria.

Por otro lado, ¿relamente será tan difícil adaptar un ListView?

// Saludos

mamcx 27-04-2010 21:15:54

Cita:

Empezado por roman (Mensaje 362097)
Podrías usar un DBCtrlGrid.

Ese fue mi primer impulso, desafortunadamente no esta disponible en lazarus :(

roman 27-04-2010 21:29:14

Al parecer hay una versión del Virtual TreeView para Lázarus. ¿La has visto?

// Saludos

Chris 27-04-2010 21:46:12

Cita:

Empezado por roman (Mensaje 362097)
Podrías usar un DBCtrlGrid.

Y por qué no mejor utilizar un DBGrid? está disponible para Lazarus también.

mamcx 27-04-2010 22:57:22

Y como haria ver el dbgrid de esa manera? Con icono, texto formateado y similares?

Chris 28-04-2010 01:32:00

CustomDrawing amigo! :)

mamcx 01-05-2010 04:23:19

Al final encontre un buen balance entre funcionalidad y facilidad de uso.

Usando un TFrame + TScrollBox. Facil y rapido!. El codigo ppal es asi (el codigo necesito unos fixs pero esta funcional. Para completar, hacer un Frame como lo quieras con aling=AlTop y asi no hay que calcular nada):

Código Delphi [-]
unit formSelectPlugin;
{ Interface para visualizar & descargar plugins para BestSeller
Autor: Mario Montoya
}
interface

uses
  {$ifdef FPC}
  LResources,
  {$else}
  Windows,
  {$endif}
  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, StdCtrls, Buttons, ExtCtrls, IniFiles,
  {MotionServer} PluginManager, Funciones;

type
  TfrmDownloadPlugins = class(TForm)
    lbDownload: TLabel;
    barDownload: TProgressBar;
    ListPlugins: TScrollBox;
    Delay: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure DelayTimer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
    FPluginManager : TPluginManager;
    FPlugins:TStringList;
    procedure HidePanels;
    procedure ShowPanels;
    procedure btnDownloadClick(Sender: TObject);
  public
    { Public declarations }
    SelectedPlugin:String;
  end;

var
  frmDownloadPlugins: TfrmDownloadPlugins;

implementation

uses framePlugin;

{$R *.dfm}

procedure TfrmDownloadPlugins.btnDownloadClick(Sender: TObject);
  i: Integer;
begin
  SelectedPlugin := FPlugins[(Sender as TButton).Tag];
  lbDownload.Caption := 'Downloading/updating ' + SelectedPlugin;
  HidePanels();

  try
    Cursor := crHourGlass;
    try
      FPluginManager.DescargarPlugin( SelectedPlugin );
      Close;
    except on E: Exception do
      begin
        ShowPanels();
        ShowMessage( E.Message );
      end;//except
    end;//try
  finally
    Cursor := crDefault;
  end;//try
end;

procedure TfrmDownloadPlugins.FormActivate(Sender: TObject);
begin
  Delay.Enabled := True;
end;

procedure TfrmDownloadPlugins.FormCreate(Sender: TObject);
begin
  FPluginManager := TPluginManager.Create;
  FPluginManager.Load;

  ShowPanels();
  FPlugins := TStringList.Create;
end;

procedure TfrmDownloadPlugins.FormDestroy(Sender: TObject);
begin
  FPluginManager.Free;
  FPlugins.Free;
end;

procedure TfrmDownloadPlugins.ShowPanels;
begin
  ListPlugins.Visible := False;
end;

procedure TfrmDownloadPlugins.HidePanels;
begin
  ListPlugins.Visible := True;
end;

procedure TfrmDownloadPlugins.DelayTimer(Sender: TObject);
var
  Ini:TMemIniFile;
  item: TfraPlugin;
  Key, name, author:String;
  plugin:TStringList;
  i: Integer;
begin
  Delay.Enabled := False;
  try
    Cursor := crHourGlass;
    try
      Ini := FPluginManager.ListaPluginsOnline();
    except on E: Exception do
      begin
        ShowMessage( E.Message );
        ModalResult := mrCancel;
        Close;
        Exit;
      end;//except
    end;//try
  finally
    Cursor := crDefault;
  end;//try

  Ini.ReadSections(FPlugins);
  FPlugins.Sort;

  for i := 0 to FPlugins.count - 1 do
  begin
    Key := FPlugins[i];
    plugin := Split(Key,'-');
    author :=  plugin[0];
    name :=  plugin[1];
    plugin.Free;

    item := TfraPlugin.Create( ListPlugins );
    item.Name := 'plug'+IntToStr(i);
    ListPlugins.InsertControl( item );
    item.Align := alTop;
    item.lbTitulo.Caption := name;
    item.lbVersion.Caption := Ini.ReadString( Key, 'Version','');

    if FPluginManager.ListaPlugins.IndexOf( Key )>-1 then
    begin
      item.btnDownload.Caption := 'Update';
    end;//if

    item.btnDownload.OnClick := btnDownloadClick;
    item.btnDownload.Tag := i;
  end;//for

  HidePanels;
end;

end.

Chewitta 17-05-2010 21:24:26

Seleccionar nietos en TreeView
 
Hola !!


Tengo este codigo y me funciona solamente con los hijo en un treeview,ya lo que quiero que darle en el padre quitar el check de todos los hijos y nietos...

procedure TFrmSeguridad.TreeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var node_sel,f:TTreeNode;
p:tpoint;
b:boolean;
begin
getcursorpos(p);
if (TreeView1.GetNodeAt(X, Y) <> nil) then
begin
node_sel:=TreeView1.GetNodeAt(x,y);
b:=TreeView1.GetChecked(node_sel);
f:=node_sel.getFirstChild;
while (f<>nil) do
begin
TreeView1.SetChecked(f,b);
f:=f.GetNextChild(f);
end;
end;
end;



de antemano agreadezco su ayuda...

maeyanes 17-05-2010 21:28:24

Hola Chewitta...

Si no lo has hecho, te recomiendo que leas la Guía de Estilo de los foros...


Saludos...


La franja horaria es GMT +2. Ahora son las 08:00:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi