Einzelnen Beitrag anzeigen

Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#19

Re: Performanceproblem mit ca. 30000 Listboxeinträgen

  Alt 13. Mai 2005, 00:09
oops ... das mit dem Datei öffnen hatte ich ja glatt übersehen

so .. hier aber jetzt die Lösung des Problems ....

Der Trick ist ... das man die Werte der Listbox extra nach int Konvertiert .. s. Unten !

Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Procedure: Addmyitem
  Arguments: const AItem: string; const AColor: TColor
  Hier werden neue Einträge in die Listbox durchgeführt.
  Es werden auch die Berechnung der "Punkt" und deren Ausgabe
  erledigt.
-----------------------------------------------------------------------------}


procedure TForm1.Addmyitem(const AItem: string; const AColor: TColor);
var
  x, i, y, Counter : Integer;
  cg, cb : double;
  counte : array[0..409] of Integer;

  //Dynamisches Integer Array
  iArray : array of integer;

begin
  Anzeige.Items.InsertObject(0, AItem, TObject(AColor));
  DoubleBuffered := True;
  cg := (Form2.SpinEdit1.Value);
  cb := (Form2.SpinEdit2.Value);

  //werte von Listbox Anzeige in Array of Integer konvertieren
  for i := 0 to Anzeige.Count - 1 do
    begin
      //Array vergrößern
      SetLength(iArray, i + 1);
      //String to Int wndeln
      iArray[i] := StrToInt(Anzeige.Items[i]);
    end;

  // Alle "Counter" auf 0 setzen
  Counter := 0;
  ZeroMemory(@Counte, SizeOf(counte));


  // Hier beginnen die Berechnungen
  // Jedes Item der Listbox durchlaufen - Jetzt iArray
  for x := 0 to High(iArray) do
    begin

      if iArray[x] in [1, 3, 10] then
        Inc(Counter);

      if iArray[x] in [6] then
        Counter := 0;

      // Mit jedem SetOfByte vergleichen
      for y := 0 to 409 do
        begin
          //hier mit dem Int Array arbeiten
          if iArray[x] in werte[y] then
            Counte[y] := 0
          else
            Inc(Counte[y]);

        end;
    end;

  // Ab hier kommt die Ausgabe der Berechnungen
  Label1.Caption := IntToStr(Counter);
  if counter = cg then
    begin
      Image2.Picture.Assign(bild2); // Bilid zuweisen
      label1.font.color := CLblack
    end
  else
    begin
      // Wass passiert wenn keiner von beiden werten zutrifft?
      // Dann könnte diese If-Abfrage nämlich weg. Entweder ist counter = cg
      // oder er ist es nicht.
      if counter = cb then
        begin
          Image2.Picture.Assign(bild1);
          label1.font.color := CLwhite;
        end;
    end;

  for x := 0 to 409 do
    begin
      (FindComponent('Label' + IntToStr(x + 1)) as TLabel).Caption := IntToStr(Counte[x]);
    end;

  //Array freigeben
  iArray := nil;
end;
  Mit Zitat antworten Zitat