AGB  ·  Datenschutz  ·  Impressum  







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

Idee für Auswahlfunktion

Ein Thema von DelphiUser1 · begonnen am 9. Okt 2012 · letzter Beitrag vom 28. Okt 2012
 
Popov
(Gast)

n/a Beiträge
 
#18

AW: Idee für Auswahlfunktion

  Alt 16. Okt 2012, 23:08
Wie du die mit deinen Daten umgehen kannst und welche du hast, das weißt doch du, nicht ich.

Ich hab dir das Beispiel umgeschrieben. Im Item selbst werden hier keine Daten mehr gespeichert. Stattdessen werden die Daten in einem Objekt an den Item gebunden. Die Daten können bei Bedarf gelesen werden, das Item selbst enthält nur noch einen leeren String.

Bei dieser Methode kannst du deine Informationen viel besser verwalten. Du übergibst sie irgendwo an Info und dann greifst du sie bei Bedarf ab. Die Klasse Info vorher an deine Bedürfnissse anpassen. Sie ist simpel gehalten.

Delphi-Quellcode:
type
  TInfo = class
    Name: String;
    Ort: String;
    Freunde: Integer;
    ImageIndex: Integer;
  end;

  {Gibt den X-ten Teilstring eines mit Kommas getrennten Daten-Strings}
function ExtractSubStr(Str: String; Index: Integer): String;
var
  i: Integer;
begin
  Result := '';
  if Index < 1 then Exit;
  Str := Str + ',';
  for i := 1 to Index - 1 do Delete(Str, 1, Pos(',', Str));
  Result := Trim(Copy(Str, 1, Pos(',', Str) - 1));
end;

procedure TForm1.FormCreate(Sender: TObject);

  procedure SetInfo(s: String; var Info: TInfo);
  begin
    Info := TInfo.Create;
    Info.Name := ExtractSubStr(s, 1);
    Info.Ort := ExtractSubStr(s, 2);
    Info.Freunde := StrToIntDef(ExtractSubStr(s, 3), -1);
    Info.ImageIndex := StrToIntDef(ExtractSubStr(s, 4), -1);
  end;

var
  Info: TInfo;
begin
  ListBox1.Style := lbOwnerDrawFixed;

  {Beispieldaten. Letzter Wert Index ist für Bilder in ImageList}
  {SetInfo nur für Übergabe der Beispieldateien. Daten können auch anders an
   Info übergeben werden}

  SetInfo('Anna, Köln, 1, 0', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Kristina, München, 1 , 1', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Sonja, Berlin,,', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Petra, Frankfurt, 5 , 3', Info);
  ListBox1.Items.AddObject('', Info);

  SetInfo('Berbel, Lübeck,, 4', Info);
  ListBox1.Items.AddObject('', Info);

  ListBox1.Font.Name := 'Segoe UI';
  ListBox1.Font.Size := 10;

  ListBox1.ItemHeight := 2 + ImageList1.Height + 2;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  th, tl: Integer;
  i: Integer;
  bmp: TBitmap;
  Info: TInfo;
begin
  with (Control as TListBox) do
  begin
    //Einstellungen für selektierten Item (A)
    if odSelected in State then
      Canvas.Brush.Color := $00EFD3C6; //Helles Blau für selektierte Items

    //Löscht den Item-Canvas
    Canvas.FillRect(Rect);

    //Einstellungen für selektierten Item (B)
    if odSelected in State then
    begin
      Canvas.Pen.Color := $00C66931; //Dunkleres Blau für Fokus-Rand
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect);
    end;

    Info := TInfo(Items.Objects[Index]);

    //-Bild 48x48 px aus ImageList zeichnen----------------------------------

    bmp := TBitmap.Create;
    try
      i := Info.ImageIndex;
      if (i > -1) and (i <= Form1.ImageList1.Count - 1) then
      begin
        Form1.ImageList1.GetBitmap(i, bmp);
        Canvas.Draw(Rect.Left + 2, Rect.Top + 2, bmp);
      end;
    finally
      bmp.Free;
    end;

    //-Text-Zeile 1 ausgeben-------------------------------------------------

    //Seitenabstand für Text (rechts vom Bild)
    tl := ItemHeight + 4;
    //Oberkante für Textzeilen. Jeder neue Zeile addiert ihre Höhe dazu
    th := 2;

    Canvas.Font.Style := [fsBold]; //Font-Eigenschaften für aktuelle Zeile
    Canvas.Font.Color := $00C66931; //Blau und fett

    Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Info.Name);
    th := Canvas.TextHeight(#32); //Unterkante alter Text = Oberkante neuer Text

    //-Text-Zeile 2 ausgeben-------------------------------------------------

    Canvas.Font.Style := Canvas.Font.Style - [fsBold]; //-
    Canvas.Font.Color := clWindowText; //Normal

    Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Info.Ort);
    th := th + Canvas.TextHeight(#32); //s. o.

    //-Text-Zeile 3 ausgeben-------------------------------------------------

    Canvas.Font.Size := Canvas.Font.Size - 2; //-
    Canvas.Font.Color := clGray; //Grau und etwas kleiner

    if Info.Freunde > -1 then
      Canvas.TextOut(Rect.Left + tl, Rect.Top + th, Format('%d Gemeinsame Freunde', [Info.Freunde]))
    else
      Canvas.TextOut(Rect.Left + tl, Rect.Top + th, 'Keine gemeinsame Freunde');

    //-------------------------------------------------------------------------

    //Überzeichnet alten Fokus
    if odFocused in State then
      Canvas.DrawFocusRect(Rect);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  with ListBox1 do //Objekte müssen separat freigegeben werden
    for i := 0 to Items.Count - 1 do
      TInfo(Items.Objects[i]).Free; //Freigeben
end;
Das einzieg auf das du hier achten mußt ist, dass du Items nicht mehr direkt löschen darfst. Vorher mußt du das Objekt freigeben. Abgesehen am Ende. In FormDestroy werden die Objekte automatisch freigegeben.

Was deine Jpeg Daten angeht, so weiß ich nicht ob das mit ImageList geht. Alternativ beim laden in Bmp konvertieren und in Größe 48x48 konvertieren.
  Mit Zitat antworten Zitat
 


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 07: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