Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.05;
Скачать: CL | DM;

Вниз

Как связать данные и TListBox?   Найти похожие ветки 

 
Igel ©   (2002-08-13 08:30) [0]

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

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

Помогите!!


 
SaS13 ©   (2002-08-13 08:55) [1]

ListBox1.Items.Add("строка"); // Добавление строки в ListBox
ListBox1.Items.Delete(0); // Удаление 1-ой строки из ListBox"а


 
Mike_Goblin ©   (2002-08-13 09:29) [2]

Есть у TStrings хорошая особенность - возможность добавлять не только строки, но и прицепленные к этим строкам объекты.
function AddObject(const S: string; AObject: TObject): Integer; virtual;
Вот ее и используй, при вставке строк в ListBox цепляй туда еще и значения первичного ключа записи. Затем при удалении/редактировании итд - получить первичный ключ и сделать в таблице с записью все что нужно


 
Igel ©   (2002-08-13 11:28) [3]

Mike_Goblin, а по подробнее не можешь рассказать?
дело в том, что я только начинаю работать в Дельфе, и механизм конкретного примера мне не особо понятен...

Например, есть объект DataSet, типа TTable. В TStrings добавляю следующим образом (заполняю):

procedure TFrm_Global.RefreshUsers();
//Процедура обновления списка контактов
var str_FIO:string;
begin
//ADOTbl_user - таблица ТADOTable, аналог TTable
//DBLstB_FIO - компонент ТListBox
with DM_telefone.ADOTbl_user do
begin
//Выводим Юзеров
Open;
DBLstB_FIO.Clear ;
while not Eof do
begin
// Создание ФИО по Фамилии, Имени и Отчеству
str_FIO:=FieldByName("familie").asstring+ " "+
FieldByName("name").asstring+ " "+
FieldByName("NameParent").asstring;
//Заносим созданную строку в ТListBox
DBLstB_FIO.Items.add(str_FIO);

//DBLstB_FIO.Items.AddObject (str_FIO, {ЧТО ЗДЕСЬ ДОЛЖНО БЫТЬ??});
next;
end;
end;
end;


И как дальнейшая работа должно быть? Когда я уже выделил конкретную строку в ТListBox, как мне обратиться к записи?

Не обижусь, если дашь ссылку на доступную статейку... :))



 
fnatali ©   (2002-08-13 11:43) [4]

Help->AddObject


 
Ura   (2002-08-13 11:49) [5]

DBLstB_FIO.Items.AddObject (str_FIO, Pointer(FieldByName("ID").asinteger));


 
Johnmen ©   (2002-08-13 11:54) [6]

>Igel ©

Ты пошел не по той тропинке ! Для работы с объектами баз данных существуют специальные DataAware компоненты. Именно их и надо использовать !
(напр. DBEdit, DBGrid и т.д. и т.п.)


 
Igel ©   (2002-08-13 12:16) [7]

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

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


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

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

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



 
SaS13 ©   (2002-08-13 13:49) [9]

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 и т.д.


 
3JIA9I CyKA ©   (2002-08-13 13:56) [10]

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


 
Johnmen ©   (2002-08-13 13:59) [11]

>3JIA9I CyKA © (13.08.02 13:56)

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


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

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


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

> 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:38) [14]

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


 
SaS13 ©   (2002-08-13 14:56) [15]

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


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

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


 
SaS13 ©   (2002-08-13 16:02) [17]

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


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

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


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

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


 
Igel ©   (2002-08-14 06:17) [20]

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

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

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



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


 
KSergey ©   (2002-08-14 08:36) [21]


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

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


 
Igel ©   (2002-08-14 11:06) [22]

>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-15 07:49) [23]


> 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-15 10:55) [24]

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

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


 
AProg   (2002-08-15 11:11) [25]

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


 
3JIA9I CyKA ©   (2002-08-15 11:23) [26]

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



Страницы: 1 вся ветка

Текущий архив: 2002.09.05;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
1-14051
maxim2
2002-08-27 07:21
2002.09.05
Как из colordialog получить цвет типа string


7-14291
Arsen
2002-06-21 12:24
2002.09.05
Звук в Delphi


4-14334
Casper_nu
2002-07-03 15:05
2002.09.05
Где ошибка? Звёздочки открывает, а текст не могу получить.


14-14211
VictorT
2002-08-07 15:48
2002.09.05
Бухгалтера гонят


1-13993
Mr.Kirya
2002-08-25 21:03
2002.09.05
Нужен компонент...