Mega Code Archive

 
Categories / Delphi / Ide Indy
 

Using TLists and Pointers in delphi

Title: Using TList's and Pointers in delphi Question: This was a small demonstration to teach a friend how to use the TList helper object. Also gives you an idea on how to use pointers. It creates a list of Pointers to Integers but they could be a list of pointers to any record or class type. Answer: {----------------------------------------------------------------------------- Unit Name: Unit1 Author: StewartM (Stewart Moss) Creation Date: 20, 01, 2003 (13:02,) Documentation Date: 20, 01, 2003 (13:02,) Version 1.0 ----------------------------------------------------------------------------- Compiler Directives: Purpose: Dependancies: Description: This was written by Stewart Moss This was a small demonstration to teach a friend how to use the TList helper object. Also gives you an idea on how to use pointers. It creates a list of Pointers to Integers but they could be a list of pointers to any record or class type. At the end of this is the source for the DFM file used to run this application. (It just needs to be bound into a project) Notes: History: Copyright 2003 by Stewart Moss. All rights reserved. -----------------------------------------------------------------------------} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PInteger = ^Integer; TForm1 = class(TForm) btnAdd: TButton; btnDelete: TButton; ListBox1: TListBox; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btnAddClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure CustomizeDlg1Close(Sender: TObject); procedure acnTestExecute(Sender: TObject); private { Private declarations } TempList: TList; procedure FreeList; procedure showlist; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin TempList := TList.Create; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FreeList; TempList.Free; end; procedure TForm1.FreeList; {----------------------------------------------------------------------------- Procedure: TForm1.FreeList Author: Stewart Moss Date: 20-Jan-2003 This disposes of all the existing items in the list. Remember by Deleting the first element in the list, you are shifting the list up and you are also reducing the TempList.count.. ** Very important you can't just free the TList object and expect ** ** everything else to disappear ** -----------------------------------------------------------------------------} var loop: Integer; tmpcount : Integer; begin tmpcount := templist.Count -1; for loop := 0 to tmpcount do begin dispose(TempList.Items[0]); TempList.Delete(0); end; end; procedure TForm1.btnAddClick(Sender: TObject); var tmpint: Integer; AInteger: PInteger; begin Randomize; tmpint := Random(1000); // Create and assign memory to a new Integer and store it's pointer // in AInteger new(AInteger); // Now take tmpint and store it at the memory address referenced by the pointer // AInteger AInteger^ := tmpint; // Now add this pointer to the TList // This returns the index position of the item (ie where it is added to the list) TempList.Add(AInteger); showlist; end; procedure TForm1.showlist; {----------------------------------------------------------------------------- Procedure: TForm1.showlist Author: Stewart Moss Date: 20-Jan-2003 PInteger(templist.Items[loop])^ returns the integer value stored at the Integer Pointer in the List (de-reference) -----------------------------------------------------------------------------} var loop: Integer; begin ListBox1.Items.Clear; for loop := 0 to TempList.Count - 1 do begin ListBox1.Items.Add(IntToStr(loop) + ' - ' + IntToStr(PInteger(TempList.Items[loop])^)); end; // for end; procedure TForm1.btnDeleteClick(Sender: TObject); var tmpstr: string; tmpint, tmpint2: Integer; begin // User has to enter the index of the item to delete (ie remove from the list) tmpstr := Inputbox('Delete an item out of the list', 'Which item do you want to delete (0=first) ?', ''); if tmpstr = '' then Exit; try tmpint := StrToInt(trim(tmpstr)); except raise Exception.Create(tmpstr + ' is not an integer!'); end; if tmpint TempList.Count - 1 then raise Exception.Create('Number too high!'); tmpint2 := Integer(TempList.Items[tmpint]^); dispose(TempList.Items[tmpint]); TempList.Delete(tmpint); ShowMessage('Deleted Item Index ' + IntToStr(tmpint) + ' Value ' + IntToStr(tmpint2)); showlist; end; procedure TForm1.Button1Click(Sender: TObject); begin showlist; end; end. (* UNIT11.DFM ---------- object Form1: TForm1 Left = 250 Top = 221 Width = 277 Height = 401 Caption = 'Stewart Moss TList Example' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnClose = FormClose OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object btnAdd: TButton Left = 24 Top = 48 Width = 75 Height = 25 Caption = 'Add' TabOrder = 0 OnClick = btnAddClick end object btnDelete: TButton Left = 104 Top = 48 Width = 75 Height = 25 Caption = 'Delete' TabOrder = 1 OnClick = btnDeleteClick end object ListBox1: TListBox Left = 28 Top = 92 Width = 185 Height = 233 ItemHeight = 13 TabOrder = 2 end object Button1: TButton Left = 184 Top = 48 Width = 75 Height = 25 Caption = 'Refresh' TabOrder = 3 OnClick = Button1Click end end *)