Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MeasureItem und Items.Objects funktioniert nicht (https://www.delphipraxis.net/98160-measureitem-und-items-objects-funktioniert-nicht.html)

MacGuyver 22. Aug 2007 13:32


MeasureItem und Items.Objects funktioniert nicht
 
Moin Leute :hi:

Ich habe meine Daten in einem Object der Klasse TObject gespeichert und möchte die Daten in einer ListBox ausgeben. So weit, so gut. Da die Höhe der Einträge nicht fest steht, habe ich Style auf lbOwnerDrawVariable gesetzt. Wenn ich meine Einträge nun mit Items.AddObject einfüge, ist das Object nicht da. Seltsam. Wenn ich Style auf lbStandard stelle funzt das. <grübel> Dann habe ich das Teil auf Standard gesetzt und nach dem Einfügen der Objekte dann auf lbOwnerDrawVariable wieder umgestellt. In dem Moment springt er Element für Element ins Ereignis OnMeasureItem und hat erst einmal nur einen Satz in der Liste der Items. Mit jedem weiteren Aufruf von OnMeasureItem tauchen dann wieder meine Einträge. Die Objekte sind dann immer noch weg.


Was ist das? :wall:


Danke für Antworten im Voraus

Stefan

MacGuyver 25. Aug 2007 14:48

Re: MeasureItem und Items.Objects funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tach Leute,

ich habe da noch ein paar Sachen zum Thema zusammen getragen. Ich habe es über eine weitere Stringliste erledigt. Ich setze als String nicht den Inhalt des sichtbaren. Der Platz reicht eh nicht. Ich bilde einen String, der zum Sortieren verwendet wird. So bekommen die ganz oben einsortierten Einträge eine 0 davor und die unteren eine 9 am Anfang. Nach dem Sortieren wird dann nur noch

Delphi-Quellcode:
ListBox.Items.Text:=StringList.Text
ausgeführt.
Bei der Berechnung der Positionen muß man gleich den Slider mit einplanen. Da habe ich eine ganze Zeit gebraucht das zu peilen. 8-)
Die einzelnen Elemente des Eintrags berechne und speicher ich in dem Objekt, das jeder Eintrag hat. Ich packe die Werte gleich in ein TRect, den braucht man so wie so für die Funktion DrawText aus der API.

Delphi-Quellcode:
DrawText(lCanvas.Handle
        ,PChar(Info)
        ,-1
        ,FRectInfo
        ,DT_LEFT + DT_TOP + DT_CALCRECT + DT_WORDBREAK);
Beim Zeichnen muß man dann noch bedenken, daß die Positionen aus dem Rect mit eingerechnet werden müssen:

Delphi-Quellcode:
function lAddRect( aRect : TRect):TRect;

var
  lRect : TRect;

begin
  lRect.Left:=aRect.Left + Rect.Left;
  lRect.Top:=aRect.Top + Rect.Top;
  lRect.Right:=aRect.Right + Rect.Left;
  lRect.Bottom:=aRect.Bottom + Rect.Top;
  Result:=lRect;
end;
Beim Ziehen der Box muß man etwas mit dem Inhalt spielen. Falls jemand eine schönere Lösung hat, soll er das hier Kund tun.

Delphi-Quellcode:
procedure MainForm.ListBox1Resize(Sender: TObject);

var
  lText  : String;
  lLocked : Boolean;

begin
  lLocked:=LockWindowUpdate(ListBox1.Handle);
  ListBox1.Items.BeginUpdate;
  lText:=ListBox1.Items.Text;
  ListBox1.Items.Clear;
  ListBox1.Items.Text:=lText;
  ListBox1.Items.EndUpdate;
  if lLocked then
    LockWindowUpdate(0);
end;
Die ganze Geschichte flimmert zwar beim Ziehen, ist aber egal. Wann zieht man schon.


Stefan

Muetze1 25. Aug 2007 18:03

Re: MeasureItem und Items.Objects funktioniert nicht
 
Zitat:

Zitat von MacGuyver
Delphi-Quellcode:
DrawText(lCanvas.Handle
        ,PChar(Info)
        ,-1
        ,FRectInfo
        ,DT_LEFT + DT_TOP + DT_CALCRECT + DT_WORDBREAK);

Hast du ein Glück das die Konstanten anscheinend nur einzelne Bits enthalten! Diese Konstanten müssen mit ODER verknüpft werden.

Also:
Delphi-Quellcode:
DT_LEFT or DT_TOP or DT_CALCRECT or DT_WORDBREAK


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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