Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как связать данные и TListBox? [D5]


Страницы:   1 2

Igel ©   (2002-08-13 08:30:00) 

Проблема такая:
Есть TListBox и некая БД, точнее таблица, из которой данные вставляются в TListBox.

Необходимо удалить, выбранную/ые записи. Смутно догадываюсь, что возможно это через TStrings TListBox-а. Но как?

Помогите!!


3JIA9I CyKA   (2002-08-15 11:23:00) [1]

2AProg (15.08.02 11:11)
Нафиг?


AProg   (2002-08-15 11:11:00) [2]

Delphi-Объектно ориентированный. Создавай наследника класса TListBox, добавляй в него поле хранящее PrimaryKey твоей таблицы и вноси внего соответствующие значения при заполнение ListBox.


Igel   (2002-08-15 10:55:00) [3]

Всем, кто откликнулся спасибо!!

Многое стало на свои места....:))


KSergey   (2002-08-15 07:49:00) [4]


> Igel © (14.08.02 11:06)

Нет, TObject(ivars)-это значениепеременной, преобразованное в указатель на объект. Причем подразумевается, что ivars здесь - целого типа, т.е. того, что можно преобразовать к указателю (или ссылке на объект - не совсея я силен в терминологии дельфи, хотя по сути это одно и тоже).

Впрочем само использование вы сделали верно, но только во втором случае, хотя я бы преобразовывал не к Pointer а к TObject - для порядку.

Чтобы ничего не наврать - я состряпал 5 строк кода для проверки, вот они:

procedure THeadForm.Button5Click(Sender: TObject);
var
i,j:Integer;
o:TObject;
begin
i:=100;
j:=555; // чтобы значение случайно не совпало
o:=TObject(i);
j:=Integer(o);
ShowMessage(IntToStr (j)); // здесь получаем "100", что и желалось
end;



> А тип данных мы узнать можем?

Нет, вот уже тип данных запихнутых подобным образом узнать уже невозможно - ведь информации об этом нигде не сохраняется. Только ручками помним что же куда запихивалось.


Igel   (2002-08-14 11:06:00) [5]

>KSergey Т.е. TObject(vars)-ни что иное как указатель на данные переменной? И если мы знаем ее тип, то можем вытащить? А тип данных мы узнать можем?


var pp:integer;
...
DBLstB_FIO.Items.AddObject (str_FIO, Pointer(FieldByName("ID").asinteger));
...
pp:=DBLstB_FIO.Items.Objects[0]^;


Или так:

pp:=Integer(DBLstB_FIO.Items.Objects[0]);


Правильно понимаю?


KSergey   (2002-08-14 08:36:00) [6]


> Igel © (14.08.02 06:17)
> __AL__ Еще не смотрел, но я так понимаю создает объект,
> и затем преобразует его в Integer - так?

Никто никаких объектов не создает
Что есть указатель? Это число, которое, если рассматривать как указатель, указывает на адрез в памяти. Но кто мешает рассматривать это же число как просто число, а не как указатель? Од этом и идет речь. Ну раз предлагает борланд пихать нам указатель - преобразовываем integer в указатель и пихаем. Но мы то знаем, что это просто число, не имеющее смысла в смысле указателя куда-либо. Потому при чтении мы его опять в integer преобразуем - и радуемся.
Только не вздумайте использовать этот указатель ка куказатель и, тем более, пытаться с его помощью освобождать какую-либо память! Это не указатель и памяти дополнительно йникто не выделял!


Igel   (2002-08-14 06:17:00) [7]

>SaS13твой вариант я так понимаю подразумевает уничтожение кучи, при завершениии работы.

>Ura,в твоем случае так-же работать с получением объекта?
Оцени, пожалуйста:

var pp:integer;
...
DBLstB_FIO.Items.AddObject (str_FIO, Pointer(FieldByName("ID").asinteger));
...
pp:=DBLstB_FIO.Items.Objects[0]^;



__AL__Еще не смотрел, но я так понимаю создает объект, и затем преобразует его в Integer - так?


__AL__   (2002-08-13 18:15:00) [8]

Ura полностью прав. А если смущает Pointer, то
DBLstB_FIO.Items.AddObject(str_FIO, TObject(FieldByName("ID").asInteger));
----
Key := Integer(DBLstB_FIO.Items.Object[i]);


Ura   (2002-08-13 17:59:00) [9]

Нагрузили человека. Ан нет все понял. НО.
1. Для работы с записью нужен только ID. Все остальное лишнее, или нужно зачем то еще.
2. Использую мой вариант можно не отслежавать память !!!


SaS13   (2002-08-13 16:02:00) [10]

ValeraVV © (13.08.02 16:00)
полностью согласен, это подразумевалось


ValeraVV   (2002-08-13 16:00:00) [11]

>> SaS13 © (13.08.02 14:56)
Удалять не только когда убиваешь, но и когда удаляешь строку (Dispose соотв. запись).
Я в таких случаях все чаще завожу наследника от TCollectionItem и в качестве визуалки - TListView, но кода получается больше


SaS13   (2002-08-13 14:56:00) [12]

чё то типа этого, удаление не сразу, а в когда уже лист убиваешь:
for _i := 0 to DBLstB_FIO.Items.Count -1 do
Dispose( pRec( DBLstB_FIO.Items.Objects[_i]^ ) );


3JIA9I CyKA   (2002-08-13 14:38:00) [13]

НАШ ЧЕЛОВЕК!!!


Igel   (2002-08-13 14:30:00) [14]

> SaS13 - Спасибо, именно то что нужно... похоже общая картина начала складываться... Только мне структуру, я так понял, надо глобально прописать. Используется-то в разных модулях.
Значит делаю так:
1. Глобально прописываю структуры записи

type
pRec = ^tRec;
tRec = record
_id : integer;
_familie: string;
_name : string;
...
end;


2. Там где создаю Tstrings

var
_p : pRec;
begin
...
New( _p );
_p._id := FieldByName("id").AsInteger;
...
DBLstB_FIO.Items.AddObject (str_FIO, _p);
// Очищаю кучу (Нужно или нет???)
dispose( _P );
end;


3. Там где необходимо достать значение

var
pp: pRec;
ID:integer;
begin
with LIST_ do
pp:=Items.Objects[0]^;
//Нужный ID
ID:=pp._id;
end;



Если что не так, поправьте... С указателями туго шарю....


3JIA9I CyKA   (2002-08-13 14:12:00) [15]

Не тропинок, про которы можно сказать , что она та или не та


Johnmen   (2002-08-13 13:59:00) [16]

>3JIA9I CyKA © (13.08.02 13:56)

Есть только не те? ;-)


3JIA9I CyKA   (2002-08-13 13:56:00) [17]

2All
SaS13 дело говорит!
2Johnmen
Нету техтропинок!


SaS13   (2002-08-13 13:49:00) [18]

Igel © (13.08.02 12:16)
...Т.е. Pointer(FieldByName("ID").asinteger) создаст указатель на конретное поле конкретной записи? А как потом далее с ним работать?Например вытащить всю запись на редактирование? Сама методика работы с указателем и как его связать с конкретной таблицей

DBLstB_FIO.Items.Objects[0]^ - значение id для 1-ой строки, можешь использовать его в запросе на выборку необходимых значений, если надо хранить больше информации, чем просто Id, создай рекорд, к примеру:
type
pRec = ^tRec;
tRec = record
_id : integer;
_familie: string;
_name : string;
...
end;

// Заноси инфу
var
_p : pRec;

..
New( _p );
_p._id := FieldByName("id").AsInteger;
...
DBLstB_FIO.Items.AddObject (str_FIO, _p);

// И считывай
pRec( DBLstB_FIO.Items.Objects[0]^ )._id и т.д.


Johnmen   (2002-08-13 12:19:00) [19]

>Igel © (13.08.02 12:16)
>Но всех вопросов они не решат... И что касаемо дизайна тоже...

Можно поподробнее, или пример ?


Igel   (2002-08-13 12:16:00) [20]

> Johnmen
Я их тоже использую... например для редактирования текущей записи. Но всех вопросов они не решат... И что касаемо дизайна тоже...
Кстати я сначала даже использовал DBListBox, но геморроя больше, чем с обычным ListBox, а заполняются одинаково.

> Ura
Т.е. Pointer(FieldByName("ID").asinteger) создаст указатель на конретное поле конкретной записи? А как потом далее с ним работать? Например вытащить всю запись на редактирование? Сама методика работы с указателем и как его связать с конкретной таблицей...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо