Lazarus 2.2.0 RC1 (2021.02.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

TListView.AddItem TObject paramétere 2021 febr. 04 13:35 #2456

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Megnéztem; a mintaprogramod természetesen működik. :)

Ott húztam magam csőbe, hogy a Data property-t mint pointert próbáltam alkalmazni (mivel pointer típusú ...), tehát nem az általad írt
TTest(ListView1.Selected.Data).S
formában, hanem
TTest(ListView1.Selected.Data^).S
alakban.

Hogy az objektumok hol mutatóként, hol mutatottként adódnak át, az rendszeresen megtéveszt.

Köszönöm még egyszer!

TListView.AddItem TObject paramétere 2021 febr. 04 13:18 #2455

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Meg fogom nézni, köszönöm. Próbálkoztam ezzel (az is tűnt logikusnak, mint a témanyitóban is írtam), de (természetesen lehet, hogy az én hibámból) a Data pointer utóbb kiolvasott értéke az átadott objektum címétől teljesen függetlennek tűnt. Ha meg a Data értékét én állítom be utólag (ezt csinálva minden a helyén volt), akkor a TObject átadása lenne okafogyott.

Megnézem, hol ronthattam el. Köszönöm :)

TListView.AddItem TObject paramétere 2021 febr. 04 12:35 #2453

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 472
  • Köszönetek: 80
A TListView.AddItem használatakor az AObject paraméterben egy hivatkozást adsz át, magát az adatot/objektumot teljesen külön kell kezelni a listától (létrehozni és megsemmisíteni).
Az adott adat/objektum a TListView használatakor úgy érhető el hogy a kiválasztott listaelem Data property-jét (a pédában ListView1.Selected.Data) typecasting használatával a szükséges típusú adatnak/objektumnak kell álcázni...

Az alábbi példa működéséhez egy TForm-on helyezz el egy TListView-et és a megfelelő eseménykezelőket állítsd be, aztán futtatáskor válassz egy elemet a listából, majd kattints egy üres területre a Form-on...
unit Unit1;
{$mode objfpc}{$H+}
 
interface
 
uses  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
 
  public
 
  end;
 
type
  TTest = class(TObject)
    S:string;
  end;
 
var
  Form1: TForm1;
  Test1:TTest;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormClick(Sender: TObject); // TForm1.OnClick
begin
  if ListView1.Selected <> nil then begin
    if ListView1.Selected.Data <> nil then
      ShowMessage( TTest(ListView1.Selected.Data).S ) // <<== az AddItem AObject paraméterében hivatkozott objektum adatainak elérése
    else
      ShowMessage( 'Nincs objectum vagy adat az elemhez' );
  end
  else
    ShowMessage( 'Válassz a listából!' );
end;
 
procedure TForm1.FormCreate(Sender: TObject); // TForm1.OnCreate
begin
 
  ListView1.AddItem('Semmi 0',nil);
  ListView1.AddItem('Semmi 1',nil);
 
  Test1:=TTest.Create;
  Test1.S:='Valami adat a Test1 objekrtumban';
  ListView1.AddItem('Valami',Test1);
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject); // TForm1.OnDestroy
begin
  Test1.Destroy;
end;
 
end.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 2.3.0 -- FPC 3.3.1-- GNU/Linux 5.4.0 x86_64
Megköszönték: Mck

TListView.AddItem TObject paramétere 2021 febr. 04 11:51 #2452

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
A Data property egy tök más dolog (amennyire látom, az idézett Win-cikk is azt taglalja); azt a TListView természetesen keményen használja, visszaadja, satöbbi. Nyilván; hiszen az egész TListView a Data-tartalmak megjelenítésére megy ki. Viszont, vicces módon, a Data az AddItem-nek nem paramétere.

TListView.AddItem TObject paramétere 2021 febr. 04 11:46 #2451

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Azt hiszem, nem értjük egymást. Ez a cucc ezer dologra jó lehet, de például ha egyszer egy eljárásban volt egy lokális objektumpéldányod, azt megadtad paraméterként az AddItem-ben, aztán elhagytad az eljárást, akkor azt a TObject-példányt soha nem látod viszont, mert a TListView hagyján, hogy sehol nem használja, de semmilyen metódusában nem is adja vissza.

Mintha egy kör rajzolásához megkérdeznék, hogy hány fok van odakinn; ezt megadod a sugár meg a középpont mellé paraméterként, aztán ennyi, kapsz egy kört az adott középponttal és sugárral, a hőmérsékletet meg tartsd nyilván, ahol akarod (neki amúgy nem is kellett, csak úgy megkérdezte, és visszakérdezni se tudod tőle).

TListView.AddItem TObject paramétere 2021 febr. 04 10:44 #2450

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
docs.microsoft.com/en-us/windows/win32/controls/list-view-controls-overview#list-view-items-and-subitems

Itt azt írja hogy az alkalmazá által definiált, hogy mire használja ezt a plusz dolgot. Úgyhogy WinAPI kompatibilis a cucc.
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

TListView.AddItem TObject paramétere 2021 febr. 04 10:26 #2449

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Akkor mégis csak egy plusz adat (mutató), amit lehet használni, ha mindenáron kell (kérdés hogy mire kellene), de csak tipuskényszerítéssel lehet elérni (mert privát adattag), de értelme nem sok van (mert örökléssel is lehet bővíteni egy osztályt).
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

TListView.AddItem TObject paramétere 2021 febr. 03 19:48 #2448

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0

Az alábbi linken trécsenlek róla:
forum.lazarus.freepascal.org/index.php?topic=35652.0


Köszönöm :)
Ezt, bár láttam, valóban nem elég figyelmesen néztem meg. Ami kiderül belőle, hogy más sem tudja, mire lehetne igazából használni, hiszen amit csinál, az igazából a Data property felhasználása; a TObject paraméter (nála a Client azonosítóval) csak díszlet. Helyette bármilyen változót használhatott volna, sőt, tök feleslegesen vette bele a mókába, mert érdemben hivatkozni sehol sem hivatkozik rá. Értéket ad neki, mint a Data pointerét (másik verzióban a Data lesz a Client pointere), de a Data tartalmát enélkül is kezelhetné. (Nem mellékesen a TObject helyén a @Client-et [bármilyen pointert] a fordító el sem fogadja; az a részlet még csak nem is működik.) A Client értéke az ő eljárásain kívül sehol nem őrződik meg (legalábbis nem hivatkozható), és a ListView maga sehol nem használja fel.

Viszont vicces, hogy maga a közzétevő is ezt írja a végén:

EDIT: I cannot find any documentation for TListView.AddItem, even though it exists. How the object argument is attached, I do not know, and I cannot find the source for it. So stick with the "optimal" example above.
« Last Edit: February 02, 2017, 12:38:28 pm by Fungus »

TListView.AddItem TObject paramétere 2021 febr. 03 19:26 #2447

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Az alábbi linken trécsenlek róla:
forum.lazarus.freepascal.org/index.php?topic=35652.0
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5
Megköszönték: Mck

TListView.AddItem TObject paramétere 2021 febr. 03 19:13 #2446

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Ja, a forrásában sem hivatkozik rá sehol...
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

TListView.AddItem TObject paramétere 2021 febr. 03 19:02 #2445

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Nyilván; ez is a logikus.
De sehol se látom, hogy ha felvettem, hivatkozni hol tudok rá. Egy metódust se látok, amelyen keresztül hozzá lehetne férni. De lehet, hogy már csőlátásom van :)

TListView.AddItem TObject paramétere 2021 febr. 03 18:59 #2444

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Akkor az csak olyan lehet mint a komponensek Tag tulajdonsága. Bármilyen TObject-ből származó dolgot bele lehet tenni ha kell.
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

TListView.AddItem TObject paramétere 2021 febr. 03 18:32 #2442

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
A Delphi-kompatibilitást az OnCompare eseménykezelő Data paraméterére írja. Annak (amennyire látom) nincs köze az Item.Data propertyhez; utóbbinak a szerepe valós és számomra is érthető. De az AddItem TObject paramétere ...? na az nem. :)

TListView.AddItem TObject paramétere 2021 febr. 03 18:24 #2441

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Hi!

Állítólag a Delphi kompatibilitás miatt van, legalábbis itt azt írja.
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

TListView.AddItem TObject paramétere 2021 febr. 03 17:51 #2440

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Sziasztok :)

Kérdésem a következő: a TListView komponens AddItem metódusában
procedure TCustomListView.AddItem (Item: string; AObject: TObject);
a TObject típusú paraméter mi célt szolgál, illetve a komponens metódusai közt hol "köszön vissza"? (Gugli a barátom, de ez ügyben nem jutottam vele dűlőre.)

Első körben azt hittem, hogy a Data propertyhez kötődik valahogy (feltételeztem, hogy új Item felvétele során értelmes a hozzá kapcsolódó adatot/adatmutatót/objektumot is azonmód átadni), de amennyire látom, a kettőnek egymáshoz semmi köze. Így viszont elég furán jön ki, hogy az AddItem-mel elküldök egy dummy paramétert a levegőbe, aztán a frissen felvett Item-hez külön utasításban adom meg a Data paraméter értékét. Hab a tortán, hogy az AddItem a hasonló célú metódusokkal szemben nem függvény, hanem eljárás, tehát az aktuálisan felvett Itemet nem "kapom meg", hanem külön azonosítanom kell mint legutolsót, hogy kezelni tudjam.(*) Gond nincs ezzel, csak nem látom a szóban forgó TObject értelmét.

Mit értelmezek rosszul?

---
(*)
Items.Item[Items.Count-1].Data := ...

  • Oldal:
  • 1