16. august 2001 - 11:32Der er
19 kommentarer og 2 løsninger
TListBox.MeasureItem i Delphi6
Jeg kan ikke tilgå en ListBox\'s objekter fra MeasureItem-rutinen. Jeg får ingen fejl, blåt Nil. Jeg vil skyde på, at det er en fejl i Delphi6, medmindre du kan fortælle mig anderledes.
Af hjælpen fremgår dette eksempel:
procedure TForm1.ListBox1MeasureItem(Control: TWidgetControl; Index: Integer; var Height: Integer); var Bitmap: TBitmap; begin with Control as TListBox do begin Bitmap := TBitmap(Items.Objects[Index]); if Bitmap <> nilthen if Bitmap.Height > Height then Height := TBitmap.Height; end; end;
Har du prøvet at refere direkte til din ListBox1.Objects[Index] istedet, det kunne jo nok også løse dit problem, og med mindre du skal bruge din event på flere listboxe, er det jo lige så godt
Jeg har lige laver en lille dims der viser hvilke fonte du har i dit system :
procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Items.Assign(Screen.Fonts); ListBox1.Style := lbOwnerDrawVariable; end;
procedure TForm1.ListBox1DrawItem(Sender: TObject; Index: Integer; Rect: TRect; State: TOwnerDrawState; var Handled: Boolean); begin with ListBox1.Canvas do begin FillRect(Rect); Font.Name := ListBox1.Items[Index]; Font.Size := 0; // use font\'s preferred size TextOut(Rect.Left+1, Rect.Top+1, ListBox1.Items[Index]); end; end;
procedure TForm1.ListBox1MeasureItem(Control: TWidgetControl; Index: Integer; var Height: Integer); begin with (Control as TListBox).Canvas do begin Font.Name := (Control as TListBox).Items[Index]; Font.Size := 0; // use font\'s preferred size Height := TextHeight(\'Wg\') + 2; // measure ascenders and descenders end; end;
JEg ved ikke hvad dit problem er ... Det her virker find BÅDE som VCL OG CLX :
type TStirngObject = class private FString : String; public constructor Create(aString : String); property _String : String read FString; end;
{ TStirngObject }
constructor TStirngObject.Create(aString: String); begin inherited Create; FString := aString; end; procedure TForm1.FormCreate(Sender: TObject); var i : Integer; begin for i:= 0 to Screen.Fonts.Count -1 do begin Listbox1.Items.Add(Screen.Fonts[i]); ListBox1.Items.Objects[i] := TStirngObject.Create(Screen.Fonts[i]); end; end;
procedure TForm1.ListBox1DrawItem(Sender: TObject; Index: Integer; Rect: TRect; State: TOwnerDrawState; var Handled: Boolean); var StirngObject : TStirngObject; begin with ListBox1.Canvas do begin FillRect(Rect); Font.Name := ListBox1.Items[Index]; Font.Size := 0; // use font\'s preferred size TextOut(Rect.Left+1, Rect.Top+1, ListBox1.Items[Index]); StirngObject := TStirngObject(ListBox1.Items.Objects[Index]); Caption := StirngObject._String; end; end;
procedure TForm1.ListBox1MeasureItem(Control: TWidgetControl; Index: Integer; var Height: Integer); begin with (Control as TListBox).Canvas do begin Font.Name := (Control as TListBox).Items[Index]; Font.Size := 0; // use font\'s preferred size Height := TextHeight(\'Wg\') + 2; // measure ascenders and descenders end; end;
procedure TForm1.FormDestroy(Sender: TObject); var i : Integer; StirngObject : TStirngObject; begin for i:= 0 to ListBox1.Items.Count -1 do begin StirngObject := TStirngObject(ListBox1.Items.Objects[i]); StirngObject.Free; end; end;
type TStirngObject = class private FString : String; public constructor Create(aString : String); property _String : String read FString; end;
{ TStirngObject }
constructor TStirngObject.Create(aString: String); begin inherited Create; FString := aString; end; procedure TForm1.FormCreate(Sender: TObject); var i : Integer; begin for i:= 0 to Screen.Fonts.Count -1 do begin Listbox1.Items.Add(Screen.Fonts[i]); ListBox1.Items.Objects[i] := TStirngObject.Create(Screen.Fonts[i]); end; end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var StirngObject : TStirngObject; begin with ListBox1.Canvas do begin FillRect(Rect); Font.Name := ListBox1.Items[Index]; Font.Size := 0; // use font\'s preferred size TextOut(Rect.Left+1, Rect.Top+1, ListBox1.Items[Index]); StirngObject := TStirngObject(ListBox1.Items.Objects[Index]); Caption := StirngObject._String; end; end;
procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin with (Control as TListBox).Canvas do begin Font.Name := (Control as TListBox).Items[Index]; Font.Size := 0; // use font\'s preferred size Height := TextHeight(\'Wg\') + 2; // measure ascenders and descenders end; end;
Jens >> Du tilgår ikke ListBox\'ens objekter fra Measure-rutinen. Jeg har ændret det i din kode, jeg får en accessviolation når jeg prøver at tilgå objekterne. Se om du kan få den her til at fungere?
procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); var s : string; begin with (Control as TListBox).Canvas do begin Font.Name := (Control as TListBox).Items[Index]; Font.Size := 0; // use font\'s preferred size
Anders >> Efter nogle forsøg er jeg kommer rundt til at det ikke lan lade sig gøre at til gå Items der hvor du gerne vil. roblemet er den måde en ListBox fungerer på. Den tilføjer først strenge så måler den størellsen af sine Items. Så der efter tilføjer den data ...
Hvis du vil gøre det du havde gang i skal du lave et lille hack. Duy opretter en ekstern liste af objecter som du så initialicer INDEN du tilføjer dine strenge .. Så henter du blor dine objects der.
Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.