06. maj 2003 - 15:32
Der er
9 kommentarer og
3 løsninger
ListView Kolonne 2 og Label.Caption
Jeg kom til at give point selv om svaret ikke helt løste mit problem, derfor opretter et mere om næsten det samme.
Jeg skal have indholdet fra kolonne 2 i en ListView ind i Label1.Caption
Jeg ved ikke hvad jeg gør galt.
Ved
Label1.Caption := ListView1.Selected.Caption;
vises kun inholdet fra Kolonne 1
og ved
Label1.Caption := ListView1.Items[1].Caption;
skoder programmet :-(
Mit tidligere spørgsmål:
http://www.eksperten.dk/spm/349111
prøv det her :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, commctrl, ComCtrls, StdCtrls;
type
PLVHitTestInfoNew = ^TLVHitTestInfoNew;
TLVHitTestInfoNew = record
Pt: TPoint;
Flags: Integer;
iItem: Integer;
iSubItem: Integer;
end;
TCell = record
x, y: Integer;
end;
TExListView = class(TListview)
private
FSelectedCell: TCell;
function ListView_SubItemHitTest(var lvhti: TLVHitTestInfoNew): Integer;
function ListViewSubItemHitTest(X: Integer; Y: Integer): Integer;
function GetCellText(const x, y: Integer): string;
procedure SetCellText(const x, y: Integer; const Text: string);
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
public
property SelectedCell: TCell read FSelectedCell;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
ListView: TExListView;
procedure ListViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ListViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Caption := Format('Selected Cell : [%d,%d] Text : %s', [ListView.SelectedCell.x, ListView.SelectedCell.y, ListView.GetCellText(X, Y)]);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ListColumn: TListColumn;
ListItem: TListItem;
i: Integer;
begin
Randomize;
ListView := TExListView.Create(Form1);
with ListView do
begin
Align := alClient;
ReadOnly := True;
OnMouseDown := ListViewMouseDown;
ViewStyle := vsReport;
RowSelect := True;
end;
Form1.InsertControl(ListView);
for i := 0 to 2 do
begin
ListColumn := ListView.Columns.Add;
ListColumn.AutoSize := True;
ListColumn.Alignment := taCenter;
ListColumn.Caption := IntToStr(Random(5000));
end;
for i := 0 to 15 do
begin
ListItem := ListView.Items.Add;
ListItem.Caption := IntToStr(Random(5000));
ListItem.SubItems.Add(IntToStr(Random(5000)));
ListItem.SubItems.Add(IntToStr(Random(5000)));
end;
end;
{ TExListView }
function TExListView.ListView_SubItemHitTest(var lvhti: TLVHitTestInfoNew): Integer;
begin
Result := SendMessage(Self.Handle, LVM_SUBITEMHITTEST, 0, Longint(@lvhti));
end;
function TExListView.ListViewSubItemHitTest(X, Y: Integer): Integer;
var
HitTest: TLVHitTestInfoNew;
begin
HitTest.pt.X := X;
HitTest.pt.Y := Y;
// Calls ListView_SubItemHitTest from *this* unit, not from CommCtrl.pas
ListView_SubItemHitTest(HitTest);
Result := HitTest.iSubItem;
end;
procedure TExListView.SetCellText(const x, y: Integer; const Text: string);
var
Item: TListItem;
iSubItem: Integer;
begin
Item := Self.GetItemAt(X, Y);
if Assigned(Item) then
begin
iSubItem := ListViewSubItemHitTest(X, Y);
if iSubItem = 0 then
Item.Caption := Text
else
Item.SubItems[iSubItem - 1] := Text;
end;
end;
function TExListView.GetCellText(const x, y: Integer): string;
var
Item: TListItem;
iSubItem: Integer;
begin
Item := Self.GetItemAt(X, Y);
if Assigned(Item) then
begin
iSubItem := ListViewSubItemHitTest(X, Y);
if iSubItem = 0 then
Result := Format('%s', [Item.Caption])
else
Result := Format('%s', [Item.SubItems[iSubItem - 1]]);
end;
end;
procedure TExListView.WMLButtonDown(var Message: TWMLButtonDown);
var
aCell: TCell;
var
Item: TListItem;
iSubItem: Integer;
iRow: Integer;
begin
Item := Self.GetItemAt(Message.XPos, Message.YPos);
if Assigned(Item) then
begin
iSubItem := Self.ListViewSubItemHitTest(Message.XPos, Message.YPos);
iRow := Self.Items.IndexOf(Item);
aCell.x := iRow;
aCell.y := iSubItem;
end;
fSelectedCell := aCell;
inherited;
end;
end.