Uložte řetězec společně s řetězcem do seznamu Delphi's ListBox

Delphi's TListBox a TComboBox zobrazují seznam položek - řetězců v „volitelném“ seznamu. TListBox zobrazuje posuvný seznam, TComboBox zobrazuje rozevírací seznam.

Společnou vlastností všech výše uvedených ovládacích prvků je Položky vlastnictví. Položky definují seznam řetězců, které se uživateli zobrazí v ovládacím prvku. Když v době návrhu poklepete na vlastnost Položky, umožňuje Editor řetězců seznamů zadat řetězcové položky. Vlastnost Položky je ve skutečnosti potomkem typu TStrings.

Dva řetězce na položku v seznamu?

Existují situace, kdy chcete zobrazit seznam řetězců pro uživatele, například v ovládacím prvku seznamu, ale také mají způsob uložit jeden další řetězec podél toho, který se zobrazuje uživateli.

A co víc, možná budete chtít ukládat / připojovat k řetězci více, než jen „obyčejný“ řetězec připojit objekt k položce (řetězec).

Seznam. Položky - TStrings "Knows" Objects!

Dejte objektu TStrings ještě jeden pohled v systému nápovědy. Tady je Objekty vlastnost, která představuje sadu objektů, které jsou spojeny s každým z

instagram viewer
řetězce ve vlastnosti Strings - kde vlastnost Strings odkazuje na skutečné řetězce v seznamu.

Pokud chcete každému řetězci v seznamu přiřadit druhý řetězec (nebo objekt), musíte za běhu naplnit vlastnost Položky.

I když můžete použít Seznam. Položky. Přidat metoda přidat řetězce do seznamu, přidružit objekt ke každému řetězci, budete muset použít jiný přístup.

Seznam. Položky. AddObject metoda přijímá dva parametry. Prvním parametrem „Položka“ je text položky. Druhý parametr „AObject“ je objekt spojený s položkou.

Všimněte si, že v seznamu se zobrazí Přidat položku metoda, která provádí totéž jako položky. AddObject.

Dva řetězce pro jeden řetězec

Od obou položek. AddObject a AddItem přijímají proměnnou typu TObject pro svůj druhý parametr, řádek jako:

// chyba kompilace!
ListBox1.Items. AddObject ('zarko', 'gajic'); 

bude mít za následek chybu kompilace: E2010 Nekompatibilní typy: 'TObject' a 'string'.

Nelze jednoduše zadat řetězec pro objekt, protože v řetězci Delphi for Win32 nejsou hodnoty řetězců objekty.

K přiřazení druhého řetězce k položce seznamu je třeba "transformovat" proměnnou řetězce na objekt - potřebujete vlastní objekt TString.

Celé číslo pro řetězec

Pokud je druhá hodnota, kterou je třeba uložit spolu s položkou řetězce, celočíselná hodnota, ve skutečnosti nepotřebujete vlastní třídu TInteger.

 ListBox1.AddItem ('Zarko Gajic', TObject (1973)); 

Řádek výše ukládá celé číslo „1973“ spolu s přidaným řetězcem „Zarko Gajic“.

Přímý typcast z celého čísla na objekt je proveden výše. Parametr „AObject“ je ve skutečnosti 4bajtovým ukazatelem (adresou) přidaného objektu. Protože ve Win32 celé číslo zabírá 4 bajty - takové tvrdé obsazení je možné.

Chcete-li získat zpět celé číslo přidružené k řetězci, musíte přetypovat "objekt" zpět na hodnotu integer:

// year == 1973
year: = Celé číslo (ListBox1.Items. Objekty [ListBox1.Items. IndexOf („Zarko Gajic“)]); 

Ovládací prvek Delphi pro řetězec

Proč se zastavit? Přiřazení řetězců a celých čísel k řetězci v seznamu je, jak jste právě zažili, kousek koláče.

Protože ovládací prvky Delphi jsou ve skutečnosti objekty, můžete připojit ovládací prvek ke každému řetězci zobrazenému v seznamu.

Následující kód přidá do seznamu ListBox1 (seznam) titulky všech ovládacích prvků TButton ve formuláři (umístěte jej do obslužné rutiny události OnCreate ve formuláři) spolu s odkazem na každé tlačítko.

var idx: celé číslo; začítpro idx: = 0 na -1 + ComponentCount dělatzačít-li Komponenty [idx] je TButton pak ListBox1.AddObject (TButton (Components [idx]). Titulek, Components [idx]); konec; konec; 

Chcete-li programově "kliknout" na "druhé" tlačítko, můžete použít následující příkaz:

 TButton (ListBox1.Items. Objekty [1]). 

Chci přiřadit vlastní objekty k řetězcové položce

V obecnější situaci byste přidali instance (objekty) vlastních tříd:

typ TStudent = třídasoukromé fName: string; fYear: integer; veřejnostvlastnictví Název: řetězec přečten fName; vlastnictví Rok: celé číslo číst fYear; konstruktér Vytvořit(konst název: tětiva; konst rok: celé číslo); konec;... konstruktér TStudent. Vytvořit(konst název: tětiva; konst rok: celé číslo); začít fName: = name; fYear: = rok; konec; začít// do seznamu přidejte dva řetězce / objekty -> studenti ListBox1.AddItem ('John', TStudent. Vytvořit ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Create ('Jack', 1982)); // chytni prvního studenta - Johna student: = ListBox1.Iems. Objekty [0] tak jako TStudent; // zobrazí Johnův rok ShowMessage (IntToStr (student. Rok)); konec; 

To, co vytvoříte, musí být zdarma

Zde je uvedeno, co má nápověda říkat o objektech v potomcích TStrings: objekt TStrings nevlastní objekty, které takto přidáte. Objekty přidané do objektu TStrings stále existují, i když je instance TStrings zničena. Oni musí být explicitně zničena aplikací.

Když přidáváte objekty k řetězcům - objekty, které vytvoříte - musíte se ujistit, že uvolníte obsazenou paměť, jinak budete mít únik paměti

Obecná vlastní procedura FreeObjects přijímá proměnnou typu TStrings jako svůj jediný parametr. FreeObjects uvolní všechny objekty spojené s položkou v seznamu řetězců. Ve výše uvedeném příkladu jsou studenti (třída TStudent) připojeni k řetězec v seznamu, když se aplikace blíží k uzavření (například hlavní událost OnDestroy), je třeba uvolnit paměť obsazený:

 FreeObjects (ListBox1.Items); 

Poznámka: Tuto proceduru voláte pouze v případě, že jste vytvořili objekty přiřazené položkám řetězců.

instagram story viewer