2012-01-04 3 views
6

में सूची बॉक्स के साथ स्ट्रिंगग्रिड को प्रतिस्थापित करना मैं क्रमशः stringgrid1 और stringgrid2 को listbox1 और listbox2 के साथ प्रतिस्थापित करने का प्रयास कर रहा हूं। क्या उनका कोई तरीका है कि मैं इसे कर सकता हूं? यदि listbox ऐसा नहीं कर सकता है तो कोई भी सुझाव दे सकता है कि जानकारी प्रदर्शित करने के लिए stringgrid के बजाय मुझे क्या उपयोग करना चाहिए? मैं डेल्फी के लिए नौसिखिया हूँ।डेल्फी

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

के बाद से अनेक कॉलम है आप एक 'बजाय एक लिस्टबॉक्स' vsReport' दृश्य शैली में TListView' की जरूरत है। –

+0

इसे मेरे कोड में कैसे रखा जा सकता है? बस इसे –

+0

बदलें इन उदाहरणों पर नज़र डालें, और दस्तावेज़ पढ़ें। [ListItemSubItems] (http://docwiki.embarcadero.com/CodeExamples/XE2/en/TListItemSubItems_ (डेल्फी)) [ListItemsInsert] (http://docwiki.embarcadero.com/CodeExamples/XE2/en/TListItemSubItems_ (डेल्फी)) –

उत्तर

4

TStringGrid के बजाय TListView का उपयोग करें। , TListView घटकों के साथ अपने TStringGrid घटकों की जगह उनके 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 गुण स्थापित करने आभासी मोड में 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'' का उपयोग करके चित्रित किया है नया प्रोग्रामर :) (मैं नहीं हूं, बीटीडब्लू।) यह बेहतर आईएमओ होगा कि यह ठीक से कैसे किया जाए (बिना 'के' के), यह सुनिश्चित करने के लिए कि आप किसी के लिए समस्याओं को ट्रैक करने के लिए कड़ी मेहनत नहीं करते हैं उन्हें हल करने में अनुभव। (या कम से कम संभावित समस्याओं की व्याख्या करें और इसे अलग-अलग करने का सुझाव दें।) –

+0

@ रेमी लेबेउ - टीमबी मैं अपने व्यू स्टाइल को बनाम रिपोर्ट में कैसे सेट करूं ... मैं कोशिश कर रहा हूं लेकिन इसे प्राप्त नहीं कर रहा हूं –

+2

'व्यूस्टाइल' ऑब्जेक्ट में पहुंच योग्य है इंस्पेक्टर जब आप डिज़ाइन-टाइम पर 'TListView' ड्रॉप करते हैं और चुनते हैं। या आप इसे कोड में सेट कर सकते हैं, उदाहरण के लिए: 'ListView1.ViewStyle: = vsReport; '। –

3

यदि आपको स्ट्रिंगग्रिड पसंद नहीं है तो आप रिपोर्ट शैली और एकाधिक कॉलम के साथ एक TListView का उपयोग कर सकते हैं।

+0

मैं इसे कैसे प्राप्त कर सकता हूं ... क्या मुझे इसे प्रतिस्थापित करना चाहिए –

+1

ओपी के उद्देश्यों के लिए जो डेल्फी का पता लगाने और सीखने के लिए हैं, यह सबसे आसान तरीका हो सकता है क्योंकि इसे किसी भी तृतीय पक्ष नियंत्रण को स्थापित करने की आवश्यकता नहीं है। –

1

दरअसल आप एक सूची बॉक्स में ग्रिड डेटा दिखा सकते हैं, लेकिन यह नौसिखिया के लिए व्यायाम नहीं है। तकनीक LB_SETTABSTOPS संदेश प्रसंस्करण पर आधारित है और Ray Konopka's book में वर्णित है। ListView का उपयोग करना बहुत आसान विकल्प है।

1

एक लिस्टबॉक्स प्रगणित मूल्यों (प्रांतों, क्रेडिट कार्ड प्रकार, या लिंग के) की एक ऊर्ध्वाधर सूची पकड़ करने का इरादा है, शीर्षकों के साथ नहीं एक बहु कॉलम प्रदर्शन।

यदि आप कुछ बेहतर चाहते हैं, तो आपको एक अधिक शक्तिशाली ग्रिड घटक का उपयोग करना चाहिए, न कि सूचीबॉक्स।

आप TListView का भी उपयोग कर सकते हैं, लेकिन मैं उस नए व्यक्ति के लिए उस दृष्टिकोण की अनुशंसा नहीं करता हूं। मैं सिर्फ दृश्य शैली मोड "vsReport" में TListView के साथ काम करने में बहुत समय बिताया है, और मैं यह भी TStringGrid से अधिक सीमित है, उदाहरण के लिए, यह कोई यथा-स्थान संपादित सहायता प्रदान करता है।

इसके बजाय, एक नए व्यक्ति के लिए, मैं आपको टीस्टिंगग्रिड के साथ रहने की सलाह देता हूं जब तक कि आपको ऐसा करने की आवश्यकता न हो (जिसे आपने निर्दिष्ट नहीं किया है!) जो TStringGrid के साथ नहीं किया जा सकता है, क्योंकि छोटे कोड के लिए आप ' दिखाया गया है, ऐसा लगता है कि TStringGrid ठीक वही करता है जो आप चाहते हैं, और इसलिए ऐसा लगता है कि आप यहां कोई लाभ नहीं के लिए काम कर रहे हैं।

आप वास्तव में क्या करने की कोशिश कर रहे हैं? आपके साथ TStringGrid कोड में क्या समस्या है जो आप नियंत्रण को बदलने के लिए कुछ करना चाहते हैं?

+0

मैं सीखने की कोशिश कर रहा हूं कि एक अलग दृष्टिकोण का उपयोग कैसे करें –

+0

तो, एक अलग दृष्टिकोण एक अलग ग्रिड नियंत्रण का चयन करने, इसे स्थापित करने और फिर अपना कोड बदलने के लिए होगा। इसे आज़माएं, और पोस्ट करें कि आप कितनी दूर हैं। वहां कई अलग-अलग ग्रिड नियंत्रण हैं, लेकिन बहुत सारे मुक्त और मुक्त स्रोत नहीं हैं। उदाहरण के लिए, इसे आजमाएं: http://www.flex-graphics.com/Files/Free/GridView.zip –