![]() |
Listview zeigt nichts an?
Guten Abend Leute,
Ich habe Folgenden Code der mir die Newsgroups in einer Listview anzeigen soll aber leider sehe Ich keine Eintraege erscheinen. Ich sehe dass die Listview gefuellt wird aber angezeigt wird nichts. Kann mir da einer bitte weiter helfen? Waere sehr nett. Listview.ViewStyle steht auf vsReport.
Delphi-Quellcode:
Gruss Lucius.
procedure TForm1.GroupsZeigenClick(Sender: TObject);
Var tsl: TStringList; tli: TListItem; Hi,Lo,i: Integer; NewsGroup,Stat: String; begin grps.Clear; // ListView für die NewsGroups Application.ProcessMessages; tsl:=TStringList.Create; idNNTP1.GetNewsgroupList(tsl); For i:=0 to tsl.Count-1 do begin tli:=grps.Items.Add; idNNTP1.ParseNewsGroup(tsl[i],NewsGroup,Hi,Lo,Stat); tli.Caption:=NewsGroup; if (Lo>=Hi) then tli.SubItems.Add('0') else tli.SubItems.Add(IntToStr(Hi-Lo)); if Length(LowerCase(Stat[1])) > 0 then case Stat[1] of 'y':tli.SubItems.Add('R/W'); 'n':tli.SubItems.Add('RO'); 'm':tli.SubItems.Add('MOD'); end; end; tsl.free; end; |
Re: Listview zeigt nichts an?
Erstmal wär ein grps.Items.BeginUpdate bzw. grps.Items.EndUpdate darumherum sicherlich praktisch...
Da mir aber nichts konkretes einfällt nur ein paar leichte Fragen als mögliche Hinweise: hast Du aus Versehen OwnerDraw oder OwnerData eingeschaltet? Hast Du auch die entsprechenden Spalten definiert nach dem Umschalten auf lvReport? Und: hast Du mal nen Breakpoint gesetzt, wo die Caption gesetzt wird, und nachgesehen ob das Newsgroup nicht einfach nur leer ist? Ansonsten nur nebensächliches: Indy ist wegen seiner Speicherlecks irgendwie doof :-D , Variablennamen könntest Du zumindest einen Typpräfix spendieren (z.B.: alle integer fangen mit i... an) und die Einrückung kommt mir spanisch vor, aber das ist alles mehr oder weniger Geschmackssache und hat nichts mit dem Fehler zu tun ;) |
Re: Listview zeigt nichts an?
Hi CCRDude,
BeginUpdate und EndUpdate hinzugefuegt, spalten sind auch definiert. OwnerDraw und OwnerData stehen jetzt aus, aber jetzt freezed das Program ein. NewsListe enthaelt 83727 Eintraegen also ist Sie nicht leer. Gruss Lucius. |
Re: Listview zeigt nichts an?
Ein Mittel gegen das Einfrieren ist, alle paar 100 Einträge die in die Liste
aufgenommen wurde ein application.processMessages einbauen. Grüße Klaus |
Re: Listview zeigt nichts an?
So Ich habe jetzt mal den Code von dem Newsreader Demo der Indys genommen.
Wenn Ich bei idNNTP1.Host, forums.borland.com eintrage funktioniert es und werden die Groups angezeigt. Nehme Ich aber meinen Newsserver Eweka, friert die ganze Sache ein. Ich habe auch noch ein AntiFreeze auf die Form gesetzt. Gibt es da eine Loesung? Ich moechte erstmal alle Newsgroups angezeigt haben aber dass funktioniert schonmal nicht. OwnerData, OwnerDraw stehen auf False.
Delphi-Quellcode:
Recht Herzlichen Dank erstmal.
procedure TForm1.Button2Click(Sender: TObject);
var idx : Integer; li : TListItem; NewsGroup : String; Hi, Lo : Integer; Stat : String; NewsList : TStringList; begin if Screen.Cursor <> crDefault then begin exit; end; Screen.Cursor := crHourGlass; try {This works as a toggle menu item} if Not IdNNTP1.Connected then begin idNNTP1.Host := 'newsreader11.eweka.nl'; <------ mit forums.borland.com funktionierts idNNTP1.Username := '******'; idNNTP1.Password := '******'; idNNTP1.Port := 119; IdNNTP1.Connect; try NewsList := TStringList.Create; try {Get newsgroup list} IdNNTP1.GetNewsgroupList(NewsList); lvNewsGroups.Items.BeginUpdate; {process newsgroups after list} idx := 0; while idx < NewsList.Count do begin label1.Caption := IntTostr(Newslist.Count); li := lvNewsGroups.Items.Add; idNNTP1.ParseNewsGroup(NewsList[idx],NewsGroup,Hi,Lo, Stat); {Newsgroup name} li.Caption := Newsgroup; {Article estimated to be in newsgroup} {if lo is greater than Hi, we have no articles} if (Lo >= Hi) then li.SubItems.Add('None') else li.SubItems.Add(IntToStr(Hi - Lo)); {Newsgroup status} {This should never be nil but just in case, we check} if Length(LowerCase(Stat[1])) > 0 then case Stat[1] of 'y' : li.SubItems.Add('Permitted'); 'n' : li.SubItems.Add('Read-Only'); 'm' : li.SubItems.Add('Moderated'); end; Inc (idx); end; finally lvNewsGroups.Items.EndUpdate; NewsList.Free; end; except IdNNTP1.Disconnect; end; // try finally end // if Not Connected then else begin {Close the connection} IdNNTP1.Disconnect; {Clear the List Views} lvNewsGroups.Items.Clear; lvArticles.Items.Clear; end; //else .. if Not IdNNTP1.Connected then finally Screen.Cursor := crDefault; end; end; Gruss Lucius. |
Re: Listview zeigt nichts an?
83K Einträge?
Dann würde ich erst einmal ausprobieren, wo genau er hängt. Für so ein einfaches Listview sind 83K schon extrem viel, könnte mir vorstellen, daß es daran liegt. Da würde ich wahrscheinlich doch auf eine virtuelle Liste (OwnerData = true) umsteigen. Dazu musst Du alle Daten in einem globalen Objekt speichern (also z.B. deine jetzige interne Stringliste als im private-Teil der Form schon definieren, dann die OnData-Methode implementieren, und nach dem runterladen "einfach" lvNewsGroups.Items.Count := formweiteListe.Count setzen... gibt hier bestimmt schon irgendwo ne kurze Anleitung dafür :) Alternativ zu der einfachen Stringliste, die in OnData (oder hieß es OnOwnerData? Irgendwie so ;) ) jedesmal ein idNNTP1.ParseNewsGroup auslösen müsste, um alle deine Infos zu bekommen, könntest Du auch eine TCollection nehmen und dort alle Daten etwas komfortabler vorspeichern... Oder sogar auf einen TVirtualStringTree ausweichen... auf jeden Fall aber virtualisieren, 83K Einträge vom Windows-Listview selber verwaltet sind imho immer sehr sehr langsam bis hängend wirkend... |
Re: Listview zeigt nichts an?
Hi CCRDude,
Danke erstmal fuer deine Antworten. Virtuell klingt ja wunderbar und schnell aber ist nie meine Sterke gewesen. :gruebel: Ein kleiner Beispielcode waere nicht schlecht. :wink: Damit Ich wenigstens den Anfang habe, wenn nicht auch nicht Schlimm. Danach wird es dann wieder gruebeln, wie es weiter geht. Danke im voraus. Lucius. |
Re: Listview zeigt nichts an?
Na gut, hier eine kleine Beispiel-Form, mit ListView1.OwnerData = true:
Delphi-Quellcode:
Wie ich schon sagte: die Daten außerhalb der Liste verwalten, einfachste Möglichkeit hier in einer TStringList, etwas komplexer (dafür ohne Stringbastelei mit mehr als 1/2 Feldern möglich) in einer TCollection (geht natürlich mit etwas weniger Tippaufwand auch eine simple TList mit eigenem Objekt).
unit FormUnitVirtualListViewDemo;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ListView1: TListView; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ListView1Data(Sender: TObject; Item: TListItem); private { Private declarations } FSomeData: TStringList; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin FSomeData.Add(FormatDateTime('c', Now)); ListView1.Items.Count := FSomeData.Count; end; procedure TForm1.FormCreate(Sender: TObject); begin FSomeData := TStringList.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FSomeData.Free; end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); begin Item.Caption := FSomeData[Item.Index]; Item.SubItems.Add('Hallo'); Item.SubItems.Add('Welt'); end; end. In dieser Listview-externen Datensammlung kannst Du dann effektiver schalten und walten, und wenn Sich die Anzahl ändert, diese über die Count-Zuweisung anpassen. Das Listview selber verwaltet nur die Anzahl (für Scrollbalken), und fragt für jede Zeile, wenn sie angezeigt werden soll, die Daten per OnData ab. |
Re: Listview zeigt nichts an?
Recht Herzlichen Dank CCRDude,
dass hilft mir schonmal weiter. Gruss Lucius. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz