Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-14158
Yaro
2002-08-24 22:52
2002.09.05
Как лучше организовать подключение к серверу?


14-14247
^Sanya
2002-08-11 00:31
2002.09.05
Glyphs: ЗА И ПРОТИВ.


3-13929
NEV
2002-08-15 14:07
2002.09.05
Лимит на выполнение запроса в ADO


3-13917
cherepovets
2002-08-15 10:35
2002.09.05
Подстановка


14-14237
Invega
2002-08-10 12:12
2002.09.05
Мне нужен пример ftp клиента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский