![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как связать данные и TListBox? [D5]
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) создаст указатель на конретное поле конкретной записи? А как потом далее с ним работать? Например вытащить всю запись на редактирование? Сама методика работы с указателем и как его связать с конкретной таблицей...