AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listview zeigt nichts an?

Ein Thema von lucius · begonnen am 16. Apr 2007 · letzter Beitrag vom 17. Apr 2007
Antwort Antwort
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#1

Listview zeigt nichts an?

  Alt 16. Apr 2007, 17:28
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:
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;
Gruss Lucius.
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#2

Re: Listview zeigt nichts an?

  Alt 16. Apr 2007, 17:45
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 , 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
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Listview zeigt nichts an?

  Alt 16. Apr 2007, 18:31
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Listview zeigt nichts an?

  Alt 16. Apr 2007, 18:36
Ein Mittel gegen das Einfrieren ist, alle paar 100 Einträge die in die Liste
aufgenommen wurde ein application.processMessages einbauen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Listview zeigt nichts an?

  Alt 16. Apr 2007, 20:08
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:
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;
Recht Herzlichen Dank erstmal.

Gruss Lucius.
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#6

Re: Listview zeigt nichts an?

  Alt 16. Apr 2007, 20:15
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...
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Listview zeigt nichts an?

  Alt 16. Apr 2007, 20:45
Hi CCRDude,

Danke erstmal fuer deine Antworten.
Virtuell klingt ja wunderbar und schnell aber ist nie meine Sterke gewesen.
Ein kleiner Beispielcode waere nicht schlecht.
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.
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#8

Re: Listview zeigt nichts an?

  Alt 17. Apr 2007, 08:31
Na gut, hier eine kleine Beispiel-Form, mit ListView1.OwnerData = true:

Delphi-Quellcode:
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.
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).

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.
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Listview zeigt nichts an?

  Alt 17. Apr 2007, 09:11
Recht Herzlichen Dank CCRDude,

dass hilft mir schonmal weiter.

Gruss Lucius.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz