- DelphiDunyasi.NET'de de benzer bir soru sormuş ve size aşağıdaki örneği hazırlamıştım. Bu örneği buradan vererek sorman daha doğru olurdu, çünkü sorun daha anlaşılır olurdu.
- Aşağıdaki sana verdiğim kodda hatırlarsan sütunların türüne göre farklı bir nesne ( TEdit, TMaskedit veya TDateTimePicker ) bir TObject tipine bağlanıp listview içerisinde gösteriliyordu. Bunu aşağıdaki kısımdaki gibi eğer NIL ise yani herhangi bir nesneye bağlanmamış ise işlem yapmasını engellemen yeterliydi.
- yani örnekteki
xSubItem 0,1,2 dışında bir sütuna ait index no barındırırsa, Nesne NIL kalacağından if Nesne <> Nil ifadesi false olacaktır. Böylece özel mesajın olan bu alana giriş yapamazsınız tarzında diayalog pencereni kullanıcıya sunabilirsin.
Kod: Tümünü seç
Nesne := nil;
case xSubItem of
0: Nesne := Form1.Edit1;
1: Nesne := Form1.MaskEdit1;
2: Nesne := Form1.DateTimePicker1;
end;
if Nesne <> Nil then
begin
// işlemler, nesne gösterimleri vs.
end else
begin
MessageDlg('Bu alanda değişiklik yapılamaz...', mtWarning, [mbOk], 0);
end;
Kod: Tümünü seç
Uses CommCtrl;
Var
xItem : Integer = -1;
xSubItem : Integer = -1;
procedure ListViewKonumlan( ListView:TListView; iItem, iSubItem:Integer );
Var
iSayac,
iLeft, iTop : Integer;
strIcerik : String;
Nesne : TObject;
begin
xItem := iItem;
xSubItem := iSubItem;
iLeft := ListView.Left + 2;
for iSayac := xSubItem downto 0
do iLeft := iLeft + ListView.Columns[iSayac].Width;
iTop := ListView.Top + 27;
for iSayac := xItem-1 downto ListView.TopItem.Index
do iTop := iTop + 1 + ListView.SmallImages.Height;
Nesne := nil;
case xSubItem of
0: Nesne := Form1.Edit1;
1: Nesne := Form1.MaskEdit1;
2: Nesne := Form1.DateTimePicker1;
end;
With TMaskEdit(Nesne) do
begin
Visible := True;
Left := iLeft;
Top := iTop;
Width := ListView.Columns[ xSubItem+1 ].Width;
strIcerik := ListView.Items[ xItem ].SubItems[ xSubItem ];
if Nesne is TMaskEdit then
begin
TMaskEdit(Nesne).Text := strIcerik;
SelectAll;
SetFocus;
end else
if Nesne is TEdit then
begin
TEdit(Nesne).Text := strIcerik;
SelectAll;
SetFocus;
end else
Try
if Nesne is TDateTimePicker then begin
TDateTimePicker(Nesne).Date := StrToDate(strIcerik);
// Otomatik açalım...
TDateTimePicker(Nesne).Perform(WM_KEYDOWN, VK_F4, 0);
TDateTimePicker(Nesne).Perform(WM_KEYUP, VK_F4, 0);
end;
Except End;
Tag := 1;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Var
iYeniItem, iYeniSubItem : Integer;
begin
if (Key = #13) then
begin
Key := #0;
iYeniItem := xItem;
iYeniSubItem := xSubItem;
if xSubItem < 2 then inc(iYeniSubItem)
else begin
inc(iYeniItem);
iYeniSubItem := 0;
end;
ListView1.SetFocus; // Focusu Nesnemizden alalım ki içeriğini tazelesin.
if iYeniItem <= ListView1.Items.Count-1
then ListViewKonumlan( ListView1, iYeniItem, iYeniSubItem)
else ShowMessage('Limite gelindi..');
end;
end;
procedure ListViewClickEdildi( ListView:TListView );
Var
pKoordinat : TPoint;
liItem : TLIstItem;
lvBilgi : TLVHitTestInfo; // USES CommCtrl eklenecek..
iSayac,
iLeft, iTop : Integer;
strIcerik : String;
Nesne : TObject;
begin
pKoordinat := ListView.ScreenToClient( Mouse.CursorPos ); // Mouse Koordinatını aldık.
liItem := ListView.GetItemAt( pKoordinat.x, pKoordinat.y ); // Koordinata göre hangi item olduğunu öğrendik.
// Gerisi Hikaye... :)
If Assigned( liItem ) then
begin // Item'in kendisi tıklanmış, olsa olsa Caption kısmıdır.
ShowMessageFmt( '(%d) nolu item tıklandı, içinde "%s" yazıyor...', [liItem.Index, liItem.Caption] )
end else
begin // SubItem üzerinde tıklanmış demektir.
FillChar( lvBilgi, sizeof( lvBilgi ), 0 ); // içeriği boşalttık...
lvBilgi.pt := pKoordinat;
if ListView.Perform( LVM_SUBITEMHITTEST, 0, lparam(@lvBilgi)) <> -1 then
begin // Artık elimizde listview'den detay bilgiyi edindik.
// Edit'i Visible edip ListView üzerinde hangi hücreye (subitem)
// adapte edeceğimizi biliyoruz.
// Onun için ilgili Edit'i o hücreye konumlandırıp
// ona göre daraltıp, içine hücredeki bilgiyi yazıyoruz
// ve edit'i focus edip içindeki yazılanların tümünü seçtiricez...
iLeft := ListView.Left + 2;
for iSayac := lvBilgi.iSubItem-1 downto 0
do iLeft := iLeft + ListView.Columns[iSayac].Width;
iTop := ListView.Top + 27;
for iSayac := lvBilgi.iItem-1 downto ListView.TopItem.Index
do iTop := iTop + 1 + ListView.SmallImages.Height;
xItem := lvBilgi.iItem;
xSubItem := lvBilgi.iSubItem-1;
Nesne := nil;
case xSubItem of
0: Nesne := Form1.Edit1;
1: Nesne := Form1.MaskEdit1;
2: Nesne := Form1.DateTimePicker1;
end;
if Nesne <> Nil then
begin
With TMaskEdit(Nesne) do
begin
Visible := True;
Left := iLeft;
Top := iTop;
Width := ListView.Columns[ lvBilgi.iSubItem ].Width;
strIcerik := ListView.Items[ lvBilgi.iItem ].SubItems[ lvBilgi.iSubItem-1 ];
Try
if Nesne is TDateTimePicker then begin
TDateTimePicker(Nesne).Date := StrToDate(strIcerik);
// Otomatik açalım...
TDateTimePicker(Nesne).Perform(WM_KEYDOWN, VK_F4, 0);
TDateTimePicker(Nesne).Perform(WM_KEYUP, VK_F4, 0);
end;
Except End;
if Nesne is TMaskEdit then TMaskEdit(Nesne).Text := strIcerik;
if Nesne is TEdit then TEdit(Nesne).Text := strIcerik;
Tag := 1;
SelectAll;
SetFocus;
end;
end else
begin
MessageDlg('Bu alanda değişiklik yapılamaz...', mtWarning, [mbOk], 0);
end;
end;
end;
end;
procedure TForm1.ListView1Click(Sender: TObject);
begin
ListViewClickEdildi( TListView(Sender) );
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
if TEdit(Sender).Tag > 0 then
begin
ListView1.Items[xItem].SubItems[xSubItem] := TEdit(Sender).Text;
TEdit(Sender).Tag := -1;
TEdit(Sender).Visible := False;
end;
end;
procedure TForm1.MaskEdit1Exit(Sender: TObject);
begin
if TMaskEdit(Sender).Tag > 0 then
begin
ListView1.Items[xItem].SubItems[xSubItem] := TMaskEdit(Sender).Text;
TMaskEdit(Sender).Tag := -1;
TMaskEdit(Sender).Visible := False;
end;
end;
procedure TForm1.DateTimePicker1Exit(Sender: TObject);
begin
if TDateTimePicker(Sender).Tag > 0 then
begin
ListView1.Items[xItem].SubItems[xSubItem] := DateToStr( TDateTimePicker(Sender).Date );
TDateTimePicker(Sender).Tag := -1;
TDateTimePicker(Sender).Visible := False;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ImageList1.Width := 22; // içinde resim olması şart değil. ListView'in
ImageList1.Height := 22; // Item'inin yüksekliğini biz belirlemek için kullanıyoruz.
With ListView1 do
begin
ViewStyle := vsReport;
GridLines := True;
RowSelect := False;
SmallImages := ImageList1;
With Columns.Add do Caption := 'Başlık';
With Columns.Add do Caption := 'Bilgi_01';
With Columns.Add do Caption := 'Bilgi_02';
With Columns.Add do Caption := 'Bilgi_03';
With Columns.Add do Caption := 'Bilgi_04';
ListView1.Columns[0].Width := 50;
ListView1.Columns[1].Width := 100;
ListView1.Columns[2].Width := 100;
ListView1.Columns[3].Width := 200;
ListView1.Columns[4].Width := 100;
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
With ListView1.Items.Add do
begin
Caption := IntToStr( ListView1.Items.Count) ;
SubItems.Add( 'A' );
SubItems.Add( ' . . ' );
SubItems.Add( DateToStr(now) );
SubItems.Add( 'Burada işlem yapmasın' );
end;
end;