Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llenar ListBox con fuentes del sistema (https://www.clubdelphi.com/foros/showthread.php?t=53056)

totote 08-02-2008 21:06:23

Llenar ListBox con fuentes del sistema
 
Hola a todos.

Queria saber si se puede llenar un ListBox con las fuentes que estan instaladas en la pc.

Saludos.

dec 08-02-2008 22:05:15

Hola,

Fíjate en este hilo, tienes varias formas de conseguir lo que quieres. ;)

totote 08-02-2008 22:46:16

Muchas gracias dec :D

Khronos 09-02-2008 00:50:33

Código Delphi [-]
Listbox1.items:=screen.fonts;


Salu2

egostar 09-02-2008 01:02:52

Cita:

Empezado por Khronos (Mensaje 264506)
Código Delphi [-]
Listbox1.items:=screen.fonts;


Salu2

Vaya, que simple lo hiciste......

Salud OS

ixMike 09-02-2008 01:30:52

Cita:

Empezado por Khronos (Mensaje 264506)
Código Delphi [-]
Listbox1.items:=screen.fonts;

Salu2

¿eso no explota? :D

Por si las moscas:
Código Delphi [-]
ListBox1.Items.AddStrings(Screen.Fonts);



Salu2 ;)

egostar 09-02-2008 01:37:18

Cita:

Empezado por ixMike (Mensaje 264516)
¿eso no explota? :D

Explotar ????, pues he ejecutado la instrucción y pues no, funcionó bien.

Salud OS

totote 09-02-2008 02:17:06

la verdad es que está resuelto muy facil XD jajaja

jachguate 09-02-2008 02:23:04

Cita:

Empezado por ixMike (Mensaje 264516)
¿eso no explota?

¡Claro que no!

Gracias al estupendo trabajo del equipo de desarrollo de la VCL!

Código Delphi [-]
procedure TCustomListBox.SetItems(Value: TStrings);
begin
  if Style in [lbVirtual, lbVirtualOwnerDraw] then
    case Style of
      lbVirtual: Style := lbStandard;
      lbVirtualOwnerDraw: Style := lbOwnerDrawFixed;
    end;
  Items.Assign(Value);
end;

¡gracias, chavales! Por eso es un placer programar en Delphi!
:p:p

ixMike 09-02-2008 02:35:37

La última vez que asigné TStrings como si fuera un valor me explotó el petardo en la mano:

Código Delphi [-]
var
  Lista: TStrings;
begin
...
Listbox1.Items:=Lista;
...
Lista.Free;


:D:D

keyboy 09-02-2008 02:39:14

Eso explota pero por usar un TStrings en lugar de un TStringList.

Bye

jachguate 09-02-2008 03:14:01

Bueno, eso depende....

Código Delphi [-]
var
  Lista: TStrings;
begin
  Lista := TStringList.Create();
  try
    ...
    Listbox1.Items:=Lista;
    ...
  finally
    Lista.Free;
  end;

Esto debiera ir perfecto!

ixMike 09-02-2008 03:14:53

Cita:

Empezado por keyboy (Mensaje 264537)
Eso explota pero por usar un TStrings en lugar de un TStringList.

Bye

Eso explota porque al hacer ListBox1.Items:=Lista y después liberar Lista, al intentar al acceder a ListBox1.Items... Error Acces violation bla bla bla porque ya no existe, ¡lo he liberado! :D


Salu2.

jachguate 09-02-2008 03:24:11

Parece que no leíste el código que puse en el post #9 de este hilo. Ahora veo que solo seguís suponiendo que explotaría... pero en realidad no pasa. Te invito a comprobarlo.

Código Delphi [-]
var
  Lista: TStrings;
begin
  Lista := TStringList.Create();
  try
    Lista.Add('A que no exploto!!!');
    Listbox1.Items:=Lista;
  finally
    Lista.Free;
  end;
  try
    ShowMessage(ListBox1.Items[0]);
  except
    ShowMessage('Explotó!');
  end;
end;

;)

ixMike 09-02-2008 03:34:57

Cita:

Empezado por jachguate (Mensaje 264552)
Parece que no leíste el código que puse en el post #9 de este hilo. Ahora veo que solo seguís suponiendo que explotaría... pero en realidad no pasa. Te invito a comprobarlo.
;)

:eek:Es cierto, pero, ¡si a mí me pasaba!:confused:

Mí no entender.


Edito: creo recordar que me pasaba entre objetos TStrings, no con la propiedad Items.

egostar 09-02-2008 03:35:45

Cita:

Empezado por ixMike (Mensaje 264550)
Eso explota porque al hacer ListBox1.Items:=Lista y después liberar Lista, al intentar al acceder a ListBox1.Items... Error Acces violation bla bla bla porque ya no existe, ¡lo he liberado! :D


Salu2.

Amigo ixMike, que quieres decir con intentar acceder a ListBox1.Items, si liberas Lista el ListBox1.Items ya cargo lo que tuviese Lista, asi que no veo donde este el error de acceso.

Prueba este código, funciona sin problemas y accedes al ListBox tantas veces quieras y Lista ya está "liberada".......

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Lista: TStrings;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Lista := TStringList.Create;
  with Lista do begin
    Add('This example uses A string List.');
    Add('It is the easiest way to add strings');
    Add('to a combobox''s list of strings.');
    Add('Always remember TStrings.Create method');
    Add('is abstract; So use TStringList.Create');
    Add('method instead.');
  end;
  Listbox1.Items := Lista;
  Lista.Free;
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  ShowMessage(ListBox1.Items.Strings[ListBox1.ItemIndex]);
end;

end.

Salud OS

jachguate 09-02-2008 03:36:26

No lo tengo a mano ahora para confirmarlo... pero estoy seguro que esto es así desde Delphi 1.

Quizás te pasaba con Turbo Pascal.. :D :D :D

Un saludo.

;)

ixMike 09-02-2008 03:39:10

Cita:

Empezado por egostar (Mensaje 264556)
Amigo ixMike, que quieres decir con intentar acceder a ListBox1.Items, si liberas Lista el ListBox1.Items ya cargo lo que tuviese Lista, asi que no veo donde este el error de acceso.

Prueba este código, funciona sin problemas y accedes al ListBox tantas veces quieras y Lista ya está "liberada".......

Salud OS

:D se te adelantó jachguate :D

De todas formas, Items no es una variable tipo dato a la que se le asignes un número, un carácter... sino que es un objeto... creo que ahí estaba mi jaleo mental :rolleyes:

Gracias a los dos.


Añado: me pasaba con Delphi 3, pero ya digo, puede que fuera entre objetos TStrings, o algo así...

egostar 09-02-2008 03:39:47

Cita:

Empezado por jachguate (Mensaje 264557)
No lo tengo a mano ahora para confirmarlo... pero estoy seguro que esto es así desde Delphi 1.

Quizás te pasaba con Turbo Pascal.. :D :D :D

Un saludo.

;)

Casi estoy seguro que el problema era que usabas esto

Código Delphi [-]
var
  Lista: TStrings;

begin
  Lista := TStrings.Create;
end;

en lugar de esto

Código Delphi [-]
var
  Lista: TStrings;

begin
  Lista := TStringList.Create;
end;

Salud OS

jachguate 09-02-2008 03:40:50

Fantástico, ¿no?
¿Por qué crees que he dicho esto antes?

Cita:

Empezado por yo mero
Gracias al estupendo trabajo del equipo de desarrollo de la VCL!
...
¡gracias, chavales! Por eso es un placer programar en Delphi!


ixMike 09-02-2008 03:41:22

Cita:

Empezado por egostar (Mensaje 264559)
Casi estoy seguro que el problema era que usabas esto

Código Delphi [-]var Lista: TStrings; begin Lista := TStrings.Create; end;


en lugar de esto

Código Delphi [-]var Lista: TStrings; begin Lista := TStringList.Create; end;


Salud OS

No, siempre lo he hecho como dices, aunque nunca he entendido porqué :D

egostar 09-02-2008 03:41:37

Cita:

Empezado por ixMike (Mensaje 264558)
:D se te adelantó jachguate :D

:D:D:D Es verdad, es que jachguate ya trae varias copas encima jejeje

Salud OS

jachguate 09-02-2008 03:42:31

Cita:

Empezado por egostar (Mensaje 264559)
Casi estoy seguro que el problema era que usabas esto...

Eliseo: Eso "explotaría" en otro punto, pues la clase TStrings es abstracta. Te aseguro que no llegaría incluso a hacer la asignación... y no elevaría una violación de acceso sino una EAbstractError.

Te invito a cambiar el ejemplo que has puesto antes y probarlo. ;)

Un saludo.

;)

jachguate 09-02-2008 03:44:59

Cita:

Empezado por egostar (Mensaje 264563)
:D:D:D Es verdad, es que jachguate ya trae varias copas encima jejeje

Salud OS

quta!!!! ¿tan fuerte es el estoque?

:D :D :D

pd. estoque=aliento.

egostar 09-02-2008 03:46:20

Cita:

Empezado por jachguate (Mensaje 264564)
Eliseo: Eso "explotaría" en otro punto, pues la clase TStrings es abstracta. Te aseguro que no llegaría incluso a hacer la asignación... y no elevaría una violación de acceso sino una EAbstractError.

Te invito a cambiar el ejemplo que has puesto antes y probarlo. ;)

Un saludo.

;)

Si pues, por eso es que le preguntaba que queria decir con intentar acceder al ListBox, es obvio que te manda error de metodo abstracto.

Salud OS

egostar 09-02-2008 03:49:01

Cita:

Empezado por jachguate (Mensaje 264565)
quta!!!! ¿tan fuerte es el estoque?

:D :D :D

pd. estoque=aliento.

Hey amigo, que a mi no me engañas, se de tus habilidades para ingerir cervecitas, traes doble tanque de combustible. :D:D:D

Salud OS

jachguate 09-02-2008 04:05:17

Cita:

Empezado por egostar (Mensaje 264567)
Hey amigo, que a mi no me engañas, se de tus habilidades para ingerir cervecitas, traes doble tanque de combustible. :D:D:D

Salud OS

¿alegre aquel día, no?

Por cierto... sigo pendiente con el asunto del mezcal.. :D

egostar 09-02-2008 04:07:34

Cita:

Empezado por jachguate (Mensaje 264572)
¿alegre aquel día, no?

Por cierto... sigo pendiente con el asunto del mezcal.. :D

Pues el 30 de febrero amigo, ya ves que se prometio :D:D:D :eek: No digo mas........

Salud OS

jachguate 09-02-2008 04:11:06

Cita:

Empezado por egostar (Mensaje 264576)
Pues el 30 de febrero amigo, ya ves que se prometio :D:D:D :eek: No digo mas........

Salud OS

:eek::eek::eek:

Quizás después de otro par de millones (de millones) :D:D:D

keyboy 09-02-2008 05:19:58

Cita:

Empezado por jachguate (Mensaje 264564)
Eliseo: Eso "explotaría" en otro punto, pues la clase TStrings es abstracta. Te aseguro que no llegaría incluso a hacer la asignación... y no elevaría una violación de acceso sino una EAbstractError.

Esto no es del todo correcto. Si ponemos:

Código Delphi [-]
Lista := TStrings.Create;

el compilador genera una advertencia

Cita:

Constructing instance of 'TStrings' containing abstract method...
pero durante la ejecución la asignación se hace y el objeto se construye correctamente. La excepción EAbstractError saltará cuando se intente usar un método abstracto.

Bye

jachguate 09-02-2008 05:52:01

Cita:

Empezado por keyboy
pero durante la ejecución la asignación se hace

Claro que no se hace!!

En la clase TStrings son abstractos por ejemplo Add, por lo que llegaría a intentar realizar la asignación solo si no se intentara añadir ninguna cadena, y en este supuesto, los métodos Assign y AssignTo también son abstractos, por lo que el asunto siempre terminará con una EAbstractError y sin ninguna asignación realizada. Te invito a probarlo.

Código Delphi [-]
procedure TForm1.Button6Click(Sender: TObject);
var
  Lista: TStrings;
begin
  Lista := TStrings.Create();
  try
    Lista.Add('A que no exploto!!!');  //prueba también poniendo en comentario toda esta línea
    Listbox1.Items:=Lista;  //la asignación nunca llega a ocurrir.
  finally
    Lista.Free;
  end;
  try
    ShowMessage(ListBox1.Items[0]);
  except
    ShowMessage('Explotó!');
  end;
end;
Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 04:23:45.

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