Форум: "Базы";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
ВнизКак связать данные и 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c