2012-01-04 2 views
6

Я пытаюсь заменить stringgrid1 и stringgrid2 на listbox1 и listbox2 соответственно. Является ли их каким-то образом я могу это сделать? Если listbox не может сделать, может кто-нибудь предложить, что я должен использовать вместо stringgrid для отображения информации? Я новичок в Delphi.Замена stringgrid со списком в Delphi

Это мой код:

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; 

конец.

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

Поскольку у вас есть несколько столбцов вам нужно '' TListView' в vsReport' стиле зрения, а не ListBox. –

+0

Как это можно поместить в мой код? Просто замените его –

+0

Посмотрите на эти примеры и прочитайте документацию. [ListItemSubItems] (http://docwiki.embarcadero.com/CodeExamples/XE2/en/TListItemSubItems_ (Delphi)) [ListItemsInsert] (http://docwiki.embarcadero.com/CodeExamples/XE2/en/TListItemSubItems_ (Delphi)) –

ответ

4

Используйте TListView вместо TStringGrid. Замените TStringGrid компоненты с TListView компонентами, установите их ViewStyle к vsReport, настраивают свои Columns коллекции по мере необходимости, а затем обновить свой код следующим образом:

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; 

С учетом сказанного, в зависимости от того, как и когда TABLE[] и fat[] являются на самом деле вы можете выполнить этот шаг дальше, установив свойства TListView.OwnerData в True, чтобы поместить ListViews в виртуальный режим, а затем использовать событие TListView.OnData для динамического отображения ваших данных. Таким образом, вы можете избавиться от HD() процедуры полностью, так как ваши данные не должны быть скопированы в самой TListView больше, оно может быть выведено на экран из TABLE[] и fat[] напрямую, а, например:

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

. Я действительно испытываю соблазн уменьшить это по той простой причине, что вы проиллюстрировали использование 'with' для новый программист. :) (Я не, BTW.) Было бы намного лучше ИМО показать, как сделать это правильно (без 'с') вместо этого, чтобы убедиться, что вы не вводите трудно отслеживать проблемы для кого-то, у кого нет опыт их решения. (Или, по крайней мере, объясните потенциальные проблемы и предложите сделать это по-другому.) –

+0

@Remy Lebeau - TeamB как установить свой ViewStyle в vsReport ... я пытался, но не добился его. –

+2

«ViewStyle» доступен в объекте Инспектор, когда вы бросаете и выбираете «TListView» во время разработки. Или вы можете установить его в коде, например: 'ListView1.ViewStyle: = vsReport;'. –

3

Если вам не нравится StringGrid, вы можете использовать TListView с типом отчета и несколькими столбцами.

+0

как я могу это достичь ... должен ли я просто заменить его –

+1

Для целей OP, которые должны исследовать и изучать delphi, это может быть самый простой подход, поскольку он не требует установки каких-либо сторонних элементов управления. –

1

Фактически вы можете отображать данные сетки в списке, но это не упражнение для новичка. Этот метод основан на обработке сообщений LB_SETTABSTOPS и описан в Ray Konopka's book. Использование ListView намного проще.

1

Список должен содержать один вертикальный список перечисляемых значений (провинций, типов кредитных карт или полов), а не многоколоночный дисплей с заголовками.

Если вам нужно что-то лучше, вы должны использовать более мощный компонент сетки, а не список.

Вы также можете использовать TListView, но я не рекомендую этот подход для нового человека. Я просто потратил много времени на работу с TListView в режиме стиля просмотра «vsReport», и я считаю, что он еще более ограничен, чем TStringGrid, например, он не поддерживает поддержку редактирования на месте.

Вместо этого, для нового человека, я рекомендую вам оставаться с TStringGrid, пока вам не нужно что-то сделать (которое вы не указали!), Которое невозможно сделать с помощью TStringGrid, так как для тривиального кода вы, как показано, кажется, что TStringGrid делает именно то, что вы хотите, и это звучит так, как будто вы делаете работу без пользы здесь.

Что вы пытаетесь сделать точно? Какая проблема с вашим кодом TStringGrid, который вы хотите сделать, что-то изменить для управления?

+0

im пытается узнать, как использовать другой подход. –

+0

Итак, другой подход состоял бы в том, чтобы выбрать другой элемент управления сеткой, установить его и затем изменить код. Попробуйте, и сообщите, как далеко вы доберетесь. Существует множество различных элементов управления сетью, но не много свободного и открытого источника. Попробуйте это, например: http://www.flex-graphics.com/Files/Free/GridView.zip. –

Смежные вопросы