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 Listview mit Objecten (https://www.delphipraxis.net/31468-listview-mit-objecten.html)

svenjko 9. Okt 2004 23:42


Listview mit Objecten
 
Ich brauche für meine Studienarbeit eine TListView die in den Spalten u. Zeilen Objecte enthält (Buttons, Progressbar, usw.); So wie bei "Berg GridView 2.6" ! Das dumme ist nur ich muss das selber bauen. Dieses Thema wurde hier schon oft aber immer ungenügend behandelt. :wall:
Mit "MyButton[i].Parent := Listview1;" usw. ist kein Auslangen gefunden. Die Objecte werden beim
Repaint vom ListView überschrieben und beim scrollen nicht bewegt. Vielleicht hat ja doch mal einer ne gute Idee?
Danke ! Svenja :?

Manne 10. Okt 2004 00:46

Re: Listview mit Objecten
 
du musst sie einfach im OnCustomDraw neu zeichnen lassen.

z.B.
Delphi-Quellcode:
Procedure TForm1.JvListView1CustomDraw(Sender: TCustomListView;
  const ARect: TRect; var DefaultDraw: Boolean);
var _i:integer;
for _i := 0 to High(mySterne) do
 begin
  mySterne[_i].Left := JvListView1.Column[0].Width;
  mySterne[_i].Width := JvListView1.Column[1].Width;
  mySterne[_i].Top := JvListView1.Items.Item[_i].Top +3;
 end;
end;

svenjko 10. Okt 2004 11:05

Re: Listview mit Objecten
 
Hi !
Danke für den Tip! :-D
Das scrollen funktioniert ja schon ! Leider werden die Objecte beim Scrollen über den Rand des ListView's hinausgeschoben und das Ändern der Column.Width wird nicht in Echtzeit durchgeführt.

Svenja

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure ListView1CustomDraw(Sender: TCustomListView;
      const ARect: TRect; var DefaultDraw: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    procedure MyButtonClick(Sender : TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  MyButton : array of TButton;

procedure TForm1.MyButtonClick(Sender : TObject);
var
  s : string;
begin
  s := ListView1.Items[(Sender as TButton).Tag].Caption;
  ShowMessage(s);
end;


procedure TForm1.ListView1CustomDraw(Sender: TCustomListView;
  const ARect: TRect; var DefaultDraw: Boolean);
var
  i : Integer;
begin
  setlength(MyButton, Listview1.Items.Count);
  for i := 0 to Listview1.Items.Count - 1 do
  begin
    MyButton[i].Parent := Listview1;
    MyButton[i].Left := ListView1.Column[0].Width;
    MyButton[i].Top := ListView1.Items.Item[i].Top +3;
    MyButton[i].Height := 12;
    MyButton[i].Width := ListView1.Column[1].Width;
    MyButton[i].Tag := i;
    MyButton[i].Caption := ListView1.Items[i].Caption;
    MyButton[i].OnClick := MyButtonClick;
  end;
end;

procedure TForm1.FormCreate(Sender : TObject);
var
  i : Integer;
begin
  setlength(MyButton, Listview1.Items.Count);
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    MyButton[i] := TButton.Create(ListView1);
    MyButton[i].Parent := Listview1;
  end;
end;

end.

Leuselator 11. Okt 2004 10:22

Re: Listview mit Objecten
 
Denkanstösse:
Du könntest entweder "Paint" oder "WndProc" überschreiben und dann eine eigene Paint-Methode basteln, in der Du auch abfängst, ob das ClientRect des Listviews Koordinatenmäßig verlassen wird - dann evtl. eine Region nehmen, um den Zeichenbereich auf das ListView zu begrenzen - viel Erfolg!
Gruß

svenjko 11. Okt 2004 20:25

Re: Listview mit Objecten
 
Hi! Danke für den Tip! :lol:
Das Problem mit dem Überscrollen hab ich bereits auf einfache Art gelöst. Ich blende die Objecte beim Scrollen aus und wieder ein.

...if ListView1.Items.Item[i].Top < 20 then MyButton[i].Visible:= False
else MyButton[i].Visible:= True;

Am ändern der Column.Width in Echtzeit kämpfe ich noch.
Werde es jetzt mal mit deinem Tip probieren.

Danke Svenja !

PS: Wie ändert man in einem ListView die Column Höhe ohne den Font zu verändern ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 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 by Thomas Breitkreuz