(Gast)
n/a Beiträge
|
AW: Idee für Auswahlfunktion
17. Okt 2012, 00: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.
|