2012-01-04 26 views
6

Estoy tratando de reemplazar el stringgrid1 y stringgrid2 con listbox1 y listbox2 respectivamente. ¿De alguna manera puedo hacerlo? Si listbox no puede hacer, ¿alguien puede sugerir qué debo usar en lugar de stringgrid para mostrar la información? Soy un novato en Delphi.Reemplazando stringgrid con listbox en Delphi

Este es mi código:

procedure TForm2.FormCreate(Sender: TObject); 
var i:integer; 
begin 
stringgrid1.ColWidths[0]:=20; 
stringgrid2.ColWidths[0]:=20; 
for i:=1 to 50 do begin 
    stringgrid1.Cells[0,i]:=inttostr(i-1); 
    stringgrid2.Cells[0,i]:=inttostr(i-1); 
    stringgrid2.Cells[1,i]:='0'; 
end; 
    stringgrid2.Cells[1,0]:='name'; 
    stringgrid1.Cells[1,0]:='extension'; 
    stringgrid1.Cells[2,0]:='format'; 
    stringgrid1.Cells[3,0]:='size'; 
    stringgrid1.Cells[4,0]:='date'; 
    stringgrid1.Cells[5,0]:='addres'; 
end; 

procedure TForm2.StringGrid2DblClick(Sender: TObject); 
begin 
if (stringgrid2.Cells[1,stringgrid2.Row]<>'1024') and (stringgrid2.Cells[1,stringgrid2.Row]<>'0') then 
    stringgrid1.Row:=strtoint(stringgrid2.Cells[1,stringgrid2.Row]); 

end; 

final.

Procedure HD; 
var i:integer; 
begin 
    for i:=0 to 50 do begin 
    form2.StringGrid1.Cells[1,i+1]:=TABLE[i].name; 
    form2.StringGrid1.Cells[2,i+1]:=TABLE[i].format; 
    if TABLE[i].tip then 
      form2.StringGrid1.Cells[3,i+1]:='folder' 
    else 
      form2.StringGrid1.Cells[3,i+1]:='file'; 
    form2.StringGrid1.Cells[4,i+1]:=inttostr(TABLE[i].nach); 
    form2.StringGrid1.Cells[5,i+1]:=inttostr(TABLE[i].razmer); 
    form2.StringGrid2.Cells[1,i+1]:=inttostr(fat[i]);; 
    end; 
end; 
+0

Puesto que usted tiene varias columnas se necesita un '' TListView' en estilo de vista vsReport' en lugar de un cuadro de lista. –

+0

¿cómo puedo ponerlo en mi código? Simplemente reemplácelo –

+0

Eche un vistazo a estos ejemplos y lea la documentación. [ListItemSubItems] (http://docwiki.embarcadero.com/CodeExamples/XE2/en/TListItemSubItems_ (Delphi)) [ListItemsInsert] (http://docwiki.embarcadero.com/CodeExamples/XE2/en/TListItemSubItems_ (Delphi)) –

Respuesta

4

Uso TListView en lugar de TStringGrid. Reemplazar sus TStringGrid componentes con TListView componentes, puesto su ViewStyle a vsReport, establecer sus Columns colecciones, según sea necesario, y luego actualizar el código de la siguiente manera:

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i: integer; 
begin 
    // NOTE: this can all be done at design-time so 
    // you don't need to do it in code at runtime! 
    ListView1.Colums[0].Width := 20; 
    ListView2.Colums[0].Width := 20; 
    for i := 0 to 49 do begin 
    ListView1.Items.Add.Caption := IntToStr(i); 
    with ListView2.Items.Add do begin 
     Caption := IntToStr(i); 
     SubItems.Add('0'); 
    end; 
    end; 
    ListView2.Columns[1].Caption := 'name'; 
    ListView1.Columns[1].Caption := 'extension'; 
    ListView1.Columns[2].Caption := 'format'; 
    ListView1.Columns[3].Caption := 'size'; 
    ListView1.Columns[4].Caption := 'date'; 
    ListView1.Columns[5].Caption := 'addres'; 
end; 

procedure TForm2.ListView2DblClick(Sender: TObject); 
var 
    Item: TListItem; 
begin 
    Item := ListView2.Selected; 
    if Item = nil then Exit; 
    if (Item.SubItems[0] <> '1024') and (Item.SubItems[0] <> '0') then 
    ListView1.Selected := ListView1.Items[StrToInt(Item.SubItems[0])]; 
end; 

procedure HD; 
var 
    i: integer; 
begin 
    for i := 0 to 49 do begin 
    with form2.ListView1.Items[i] do begin 
     SubItems[0] := TABLE[i].name; 
     SubItems[1] := TABLE[i].format; 
     if TABLE[i].tip then 
     SubItems[2] := 'folder' 
     else 
     SubItems[2] := 'file'; 
     SubItems[3] := IntToStr(TABLE[i].nach); 
     SubItems[4] := IntToStr(TABLE[i].razmer); 
    end; 
    form2.ListView2.Items[i].SubItems[0] := IntToStr(fat[i]); 
    end; 
end; 

Dicho esto, dependiendo de cómo y cuándo TABLE[] y fat[] son en realidad, puede llevar esto un paso más allá estableciendo las propiedades TListView.OwnerData en True para poner las ListViews en modo virtual, y luego usar el evento TListView.OnData para mostrar sus datos dinámicamente. De esta manera, usted puede deshacerse de su procedimiento HD() completo, ya que los datos no necesitan ser copiados en el TListView sí más, ésta se puede ver desde TABLE[] y fat[] directamente en lugar, por ejemplo:

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i: integer; 
begin 
    // NOTE: this can all be done at design-time so 
    // you don't need to do it in code at runtime! 
    ListView1.Colums[0].Width := 20; 
    ListView2.Colums[0].Width := 20; 
    ListView2.Columns[1].Caption := 'name'; 
    ListView1.Columns[1].Caption := 'extension'; 
    ListView1.Columns[2].Caption := 'format'; 
    ListView1.Columns[3].Caption := 'size'; 
    ListView1.Columns[4].Caption := 'date'; 
    ListView1.Columns[5].Caption := 'addres'; 
    // 

    ListView1.Items.Count := 50; 
    ListView2.Items.Count := 50; 
end; 

procedure TForm2.ListView2DblClick(Sender: TObject); 
var 
    Item: TListItem; 
begin 
    Item := ListView2.Selected; 
    if Item = nil then Exit; 
    if (Item.SubItems[0] <> '1024') and (Item.SubItems[0] <> '0') then 
    ListView1.Selected := ListView1.Items[StrToInt(Item.SubItems[0])]; 
end; 

procedure TForm2.ListView1Data(Sender: TObject; Item: TListItem); 
begin 
    Item.Caption := IntToStr(Item.Index); 
    Item.SubItems.Add(TABLE[Item.Index].name); 
    Item.SubItems.Add(TABLE[Item.Index].format); 
    if TABLE[i].tip then 
    Item.SubItems.Add('folder') 
    else 
    Item.SubItems.Add('file'); 
    Item.SubItems.Add(IntToStr(TABLE[i].nach)); 
    Item.SubItems.Add(IntToStr(TABLE[i].razmer)) 
end; 

procedure TForm2.ListView2Data(Sender: TObject; Item: TListItem); 
begin 
    Item.Caption := IntToStr(Item.Index); 
    Item.SubItems.Add(IntToStr(fat[i])); 
end; 
+0

Estoy muy tentado de rechazar esto por la sencilla razón de que ha ilustrado con 'con' a un nuevo programador. :) (No estoy, por cierto.) Sería mucho mejor IMO para mostrar cómo hacerlo correctamente (sin el 'con ') en su lugar, para asegurarse de que no introduzca problemas difíciles de localizar para alguien sin experiencia en resolverlos. (O al menos explique los posibles problemas y sugiéralo hacerlo de manera diferente.) –

+0

@Remy Lebeau - TeamB cómo configuro su ViewStyle en vsReport ... lo he intentado pero no lo estoy logrando –

+2

'ViewStyle' es accesible en el objeto Inspector cuando suelta y selecciona un 'TListView' en tiempo de diseño. O puede configurarlo en código, por ejemplo: 'ListView1.ViewStyle: = vsReport;'. –

3

Si no te gusta StringGrid, puedes utilizar un TListView con estilo de informe y varias columnas.

+0

¿Cómo puedo lograr eso ... si solo lo reemplazo –

+1

Para los propósitos del OP que son explorar y aprender delphi, este podría ser el enfoque más fácil ya que no requiere la instalación de controles de terceros. –

1

En realidad se puede mostrar datos de cuadrícula en un cuadro de lista, pero eso no es un ejercicio para un novato. La técnica se basa en el procesamiento de mensajes LB_SETTABSTOPS y se describe en Ray Konopka's book. Usar ListView es una alternativa mucho más simple.

1

Un cuadro de lista tiene la intención de mantener una única lista vertical de valores enumerados (provincias, tipos de tarjetas de crédito, o géneros), no una pantalla de varias columnas con los títulos.

Si quieres algo mejor, se debe utilizar un motor más potente componente de la red, no un cuadro de lista.

También es posible usar TListView, pero no recomiendo que el enfoque de una nueva persona. Acabo de pasar mucho tiempo trabajando con TListView en el modo de estilo de visualización "vsReport", y me parece que es aún más limitado que TStringGrid, por ejemplo, no proporciona soporte de edición in situ.

En cambio, para una persona nueva, le recomiendo que se quede con el TStringGrid hasta que haya algo que necesite hacer (¡que no ha especificado!) Que no se puede hacer con TStringGrid, ya que para el código trivial ' Como se muestra, parece que TStringGrid hace exactamente lo que quiere, por lo que parece que no está haciendo ningún trabajo aquí.

¿Qué está tratando de hacer exactamente? ¿Qué problema hay con el código TStringGrid que desea hacer algo para cambiar el control?

+0

Estoy tratando de aprender a usar un enfoque diferente –

+0

Entonces, un enfoque diferente sería seleccionar un control de cuadrícula diferente, instalarlo y luego cambiar el código. Pruébalo y publica lo lejos que llegas. Hay muchos controles de cuadrícula diferentes por ahí, pero no muchos son gratuitos y de código abierto. Pruebe esta, por ejemplo: http://www.flex-graphics.com/Files/Free/GridView.zip –

Cuestiones relacionadas